diff --git a/CHANGELOG.md b/CHANGELOG.md index 969c023f..4477f334 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # @vladmandic/human - Version: **2.9.2** + Version: **2.9.3** Description: **Human: AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition, Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction, Gesture Recognition** Author: **Vladimir Mandic ** @@ -9,7 +9,11 @@ ## Changelog -### **HEAD -> main** 2022/08/08 mandic00@live.com +### **2.9.3** 2022/08/10 mandic00@live.com + +- rehault testing framework + +### **origin/main** 2022/08/08 mandic00@live.com - add insightface diff --git a/build.js b/build.js index f9459599..df455a5a 100644 --- a/build.js +++ b/build.js @@ -8,8 +8,7 @@ const package = require('./package.json'); const modelsDir = '../human-models/models'; const modelsOut = 'models/models.json'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const apiExtractorIgnoreList = [ +const apiExtractorIgnoreList = [ // eslint-disable-line @typescript-eslint/no-unused-vars 'ae-missing-release-tag', 'tsdoc-param-tag-missing-hyphen', 'tsdoc-escape-right-brace', diff --git a/demo/faceid/index.js b/demo/faceid/index.js index f898fb1e..efe3d385 100644 --- a/demo/faceid/index.js +++ b/demo/faceid/index.js @@ -4,329 +4,6 @@ author: ' */ -// demo/faceid/index.ts -import { Human } from "../../dist/human.esm.js"; - -// demo/faceid/indexdb.ts -var db; -var database = "human"; -var table = "person"; -var log = (...msg) => console.log("indexdb", ...msg); -async function open() { - if (db) - return true; - return new Promise((resolve) => { - const request = indexedDB.open(database, 1); - request.onerror = (evt) => log("error:", evt); - request.onupgradeneeded = (evt) => { - log("create:", evt.target); - db = evt.target.result; - db.createObjectStore(table, { keyPath: "id", autoIncrement: true }); - }; - request.onsuccess = (evt) => { - db = evt.target.result; - log("open:", db); - resolve(true); - }; - }); -} -async function load() { - const faceDB = []; - if (!db) - await open(); - return new Promise((resolve) => { - const cursor = db.transaction([table], "readwrite").objectStore(table).openCursor(null, "next"); - cursor.onerror = (evt) => log("load error:", evt); - cursor.onsuccess = (evt) => { - if (evt.target.result) { - faceDB.push(evt.target.result.value); - evt.target.result.continue(); - } else { - resolve(faceDB); - } - }; - }); -} -async function count() { - if (!db) - await open(); - return new Promise((resolve) => { - const store = db.transaction([table], "readwrite").objectStore(table).count(); - store.onerror = (evt) => log("count error:", evt); - store.onsuccess = () => resolve(store.result); - }); -} -async function save(faceRecord) { - if (!db) - await open(); - const newRecord = { name: faceRecord.name, descriptor: faceRecord.descriptor, image: faceRecord.image }; - db.transaction([table], "readwrite").objectStore(table).put(newRecord); - log("save:", newRecord); -} -async function remove(faceRecord) { - if (!db) - await open(); - db.transaction([table], "readwrite").objectStore(table).delete(faceRecord.id); - log("delete:", faceRecord); -} - -// demo/faceid/index.ts -var humanConfig = { - modelBasePath: "../../models", - filter: { equalization: true }, - face: { - enabled: true, - detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, - description: { enabled: true }, - iris: { enabled: true }, - emotion: { enabled: false }, - antispoof: { enabled: true }, - liveness: { enabled: true } - }, - body: { enabled: false }, - hand: { enabled: false }, - object: { enabled: false }, - gesture: { enabled: true } -}; -var matchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }; -var options = { - minConfidence: 0.6, - minSize: 224, - maxTime: 1e4, - blinkMin: 10, - blinkMax: 800, - threshold: 0.5, - mask: humanConfig.face.detector.mask, - rotation: humanConfig.face.detector.rotation, - cropFactor: humanConfig.face.detector.cropFactor, - ...matchOptions -}; -var ok = { - faceCount: false, - faceConfidence: false, - facingCenter: false, - lookingCenter: false, - blinkDetected: false, - faceSize: false, - antispoofCheck: false, - livenessCheck: false, - elapsedMs: 0 -}; -var allOk = () => ok.faceCount && ok.faceSize && ok.blinkDetected && ok.facingCenter && ok.lookingCenter && ok.faceConfidence && ok.antispoofCheck && ok.livenessCheck; -var current = { face: null, record: null }; -var blink = { - start: 0, - end: 0, - time: 0 -}; -var human = new Human(humanConfig); -human.env["perfadd"] = false; -human.draw.options.font = 'small-caps 18px "Lato"'; -human.draw.options.lineHeight = 20; -var dom = { - video: document.getElementById("video"), - canvas: document.getElementById("canvas"), - log: document.getElementById("log"), - fps: document.getElementById("fps"), - match: document.getElementById("match"), - name: document.getElementById("name"), - save: document.getElementById("save"), - delete: document.getElementById("delete"), - retry: document.getElementById("retry"), - source: document.getElementById("source"), - ok: document.getElementById("ok") -}; -var timestamp = { detect: 0, draw: 0 }; -var fps = { detect: 0, draw: 0 }; -var startTime = 0; -var log2 = (...msg) => { - dom.log.innerText += msg.join(" ") + "\n"; - console.log(...msg); -}; -var printFPS = (msg) => dom.fps.innerText = msg; -async function webCam() { - printFPS("starting webcam..."); - const cameraOptions = { audio: false, video: { facingMode: "user", resizeMode: "none", width: { ideal: document.body.clientWidth } } }; - const stream = await navigator.mediaDevices.getUserMedia(cameraOptions); - const ready = new Promise((resolve) => { - dom.video.onloadeddata = () => resolve(true); - }); - dom.video.srcObject = stream; - dom.video.play(); - await ready; - dom.canvas.width = dom.video.videoWidth; - dom.canvas.height = dom.video.videoHeight; - if (human.env.initial) - log2("video:", dom.video.videoWidth, dom.video.videoHeight, "|", stream.getVideoTracks()[0].label); - dom.canvas.onclick = () => { - if (dom.video.paused) - dom.video.play(); - else - dom.video.pause(); - }; -} -async function detectionLoop() { - if (!dom.video.paused) { - if (current.face && current.face.tensor) - human.tf.dispose(current.face.tensor); - await human.detect(dom.video); - const now = human.now(); - fps.detect = 1e3 / (now - timestamp.detect); - timestamp.detect = now; - requestAnimationFrame(detectionLoop); - } -} -async function validationLoop() { - const interpolated = await human.next(human.result); - await human.draw.canvas(dom.video, dom.canvas); - await human.draw.all(dom.canvas, interpolated); - const now = human.now(); - fps.draw = 1e3 / (now - timestamp.draw); - timestamp.draw = now; - printFPS(`fps: ${fps.detect.toFixed(1).padStart(5, " ")} detect | ${fps.draw.toFixed(1).padStart(5, " ")} draw`); - ok.faceCount = human.result.face.length === 1; - if (ok.faceCount) { - const gestures = Object.values(human.result.gesture).map((gesture) => gesture.gesture); - if (gestures.includes("blink left eye") || gestures.includes("blink right eye")) - blink.start = human.now(); - if (blink.start > 0 && !gestures.includes("blink left eye") && !gestures.includes("blink right eye")) - blink.end = human.now(); - ok.blinkDetected = ok.blinkDetected || Math.abs(blink.end - blink.start) > options.blinkMin && Math.abs(blink.end - blink.start) < options.blinkMax; - if (ok.blinkDetected && blink.time === 0) - blink.time = Math.trunc(blink.end - blink.start); - ok.facingCenter = gestures.includes("facing center"); - ok.lookingCenter = gestures.includes("looking center"); - ok.faceConfidence = (human.result.face[0].boxScore || 0) > options.minConfidence && (human.result.face[0].faceScore || 0) > options.minConfidence; - ok.antispoofCheck = (human.result.face[0].real || 0) > options.minConfidence; - ok.livenessCheck = (human.result.face[0].live || 0) > options.minConfidence; - ok.faceSize = human.result.face[0].box[2] >= options.minSize && human.result.face[0].box[3] >= options.minSize; - } - let y = 32; - for (const [key, val] of Object.entries(ok)) { - let el = document.getElementById(`ok-${key}`); - if (!el) { - el = document.createElement("div"); - el.innerText = key; - el.className = "ok"; - el.style.top = `${y}px`; - dom.ok.appendChild(el); - } - if (typeof val === "boolean") - el.style.backgroundColor = val ? "lightgreen" : "lightcoral"; - else - el.innerText = `${key}:${val}`; - y += 28; - } - if (allOk()) { - dom.video.pause(); - return human.result.face[0]; - } - if (ok.elapsedMs > options.maxTime) { - dom.video.pause(); - return human.result.face[0]; - } else { - ok.elapsedMs = Math.trunc(human.now() - startTime); - return new Promise((resolve) => { - setTimeout(async () => { - const res = await validationLoop(); - if (res) - resolve(human.result.face[0]); - }, 30); - }); - } -} -async function saveRecords() { - var _a, _b, _c, _d; - if (dom.name.value.length > 0) { - const image = (_a = dom.canvas.getContext("2d")) == null ? void 0 : _a.getImageData(0, 0, dom.canvas.width, dom.canvas.height); - const rec = { id: 0, name: dom.name.value, descriptor: (_b = current.face) == null ? void 0 : _b.embedding, image }; - await save(rec); - log2("saved face record:", rec.name, "descriptor length:", (_d = (_c = current.face) == null ? void 0 : _c.embedding) == null ? void 0 : _d.length); - log2("known face records:", await count()); - } else { - log2("invalid name"); - } -} -async function deleteRecord() { - if (current.record && current.record.id > 0) { - await remove(current.record); - } -} -async function detectFace() { - var _a, _b; - (_a = dom.canvas.getContext("2d")) == null ? void 0 : _a.clearRect(0, 0, options.minSize, options.minSize); - if (!current.face || !current.face.tensor || !current.face.embedding) - return false; - console.log("face record:", current.face); - human.tf.browser.toPixels(current.face.tensor, dom.canvas); - if (await count() === 0) { - log2("face database is empty"); - document.body.style.background = "black"; - dom.delete.style.display = "none"; - return false; - } - const db2 = await load(); - const descriptors = db2.map((rec) => rec.descriptor).filter((desc) => desc.length > 0); - const res = await human.match(current.face.embedding, descriptors, matchOptions); - current.record = db2[res.index] || null; - if (current.record) { - log2(`best match: ${current.record.name} | id: ${current.record.id} | similarity: ${Math.round(1e3 * res.similarity) / 10}%`); - dom.name.value = current.record.name; - dom.source.style.display = ""; - (_b = dom.source.getContext("2d")) == null ? void 0 : _b.putImageData(current.record.image, 0, 0); - } - document.body.style.background = res.similarity > options.threshold ? "darkgreen" : "maroon"; - return res.similarity > options.threshold; -} -async function main() { - var _a, _b, _c, _d; - ok.faceCount = false; - ok.faceConfidence = false; - ok.facingCenter = false; - ok.blinkDetected = false; - ok.faceSize = false; - ok.antispoofCheck = false; - ok.livenessCheck = false; - ok.elapsedMs = 0; - dom.match.style.display = "none"; - dom.retry.style.display = "none"; - dom.source.style.display = "none"; - document.body.style.background = "black"; - await webCam(); - await detectionLoop(); - startTime = human.now(); - current.face = await validationLoop(); - dom.canvas.width = ((_b = (_a = current.face) == null ? void 0 : _a.tensor) == null ? void 0 : _b.shape[1]) || options.minSize; - dom.canvas.height = ((_d = (_c = current.face) == null ? void 0 : _c.tensor) == null ? void 0 : _d.shape[0]) || options.minSize; - dom.source.width = dom.canvas.width; - dom.source.height = dom.canvas.height; - dom.canvas.style.width = ""; - dom.match.style.display = "flex"; - dom.save.style.display = "flex"; - dom.delete.style.display = "flex"; - dom.retry.style.display = "block"; - if (!allOk()) { - log2("did not find valid face"); - return false; - } else { - return detectFace(); - } -} -async function init() { - var _a, _b, _c; - log2("human version:", human.version, "| tfjs version:", human.tf.version["tfjs-core"]); - log2("face embedding model:", ((_a = humanConfig.face["description"]) == null ? void 0 : _a.enabled) ? "faceres" : "", ((_b = humanConfig.face["mobilefacenet"]) == null ? void 0 : _b.enabled) ? "mobilefacenet" : "", ((_c = humanConfig.face["insightface"]) == null ? void 0 : _c.enabled) ? "insightface" : ""); - log2("options:", JSON.stringify(options).replace(/{|}|"|\[|\]/g, "").replace(/,/g, " ")); - printFPS("loading..."); - log2("known face records:", await count()); - await webCam(); - await human.load(); - printFPS("initializing..."); - dom.retry.addEventListener("click", main); - dom.save.addEventListener("click", saveRecords); - dom.delete.addEventListener("click", deleteRecord); - await human.warmup(); - await main(); -} -window.onload = init; +import{Human as H}from"../../dist/human.esm.js";var l,R="human",p="person",g=(...t)=>console.log("indexdb",...t);async function v(){return l?!0:new Promise(t=>{let i=indexedDB.open(R,1);i.onerror=n=>g("error:",n),i.onupgradeneeded=n=>{g("create:",n.target),l=n.target.result,l.createObjectStore(p,{keyPath:"id",autoIncrement:!0})},i.onsuccess=n=>{l=n.target.result,g("open:",l),t(!0)}})}async function x(){let t=[];return l||await v(),new Promise(i=>{let n=l.transaction([p],"readwrite").objectStore(p).openCursor(null,"next");n.onerror=s=>g("load error:",s),n.onsuccess=s=>{s.target.result?(t.push(s.target.result.value),s.target.result.continue()):i(t)}})}async function y(){return l||await v(),new Promise(t=>{let i=l.transaction([p],"readwrite").objectStore(p).count();i.onerror=n=>g("count error:",n),i.onsuccess=()=>t(i.result)})}async function C(t){l||await v();let i={name:t.name,descriptor:t.descriptor,image:t.image};l.transaction([p],"readwrite").objectStore(p).put(i),g("save:",i)}async function D(t){l||await v(),l.transaction([p],"readwrite").objectStore(p).delete(t.id),g("delete:",t)}var b={modelBasePath:"../../models",filter:{equalization:!0},face:{enabled:!0,detector:{rotation:!0,return:!0,cropFactor:1.6,mask:!1},description:{enabled:!0},iris:{enabled:!0},emotion:{enabled:!1},antispoof:{enabled:!0},liveness:{enabled:!0}},body:{enabled:!1},hand:{enabled:!1},object:{enabled:!1},gesture:{enabled:!0}},I={order:2,multiplier:25,min:.2,max:.8},c={minConfidence:.6,minSize:224,maxTime:1e4,blinkMin:10,blinkMax:800,threshold:.5,mask:b.face.detector.mask,rotation:b.face.detector.rotation,cropFactor:b.face.detector.cropFactor,...I},o={faceCount:!1,faceConfidence:!1,facingCenter:!1,lookingCenter:!1,blinkDetected:!1,faceSize:!1,antispoofCheck:!1,livenessCheck:!1,elapsedMs:0},M=()=>o.faceCount&&o.faceSize&&o.blinkDetected&&o.facingCenter&&o.lookingCenter&&o.faceConfidence&&o.antispoofCheck&&o.livenessCheck,r={face:null,record:null},u={start:0,end:0,time:0},a=new H(b);a.env.perfadd=!1;a.draw.options.font='small-caps 18px "Lato"';a.draw.options.lineHeight=20;var e={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("fps"),match:document.getElementById("match"),name:document.getElementById("name"),save:document.getElementById("save"),delete:document.getElementById("delete"),retry:document.getElementById("retry"),source:document.getElementById("source"),ok:document.getElementById("ok")},w={detect:0,draw:0},h={detect:0,draw:0},E=0,m=(...t)=>{e.log.innerText+=t.join(" ")+` +`,console.log(...t)},k=t=>e.fps.innerText=t;async function S(){k("starting webcam...");let t={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth}}},i=await navigator.mediaDevices.getUserMedia(t),n=new Promise(s=>{e.video.onloadeddata=()=>s(!0)});e.video.srcObject=i,e.video.play(),await n,e.canvas.width=e.video.videoWidth,e.canvas.height=e.video.videoHeight,a.env.initial&&m("video:",e.video.videoWidth,e.video.videoHeight,"|",i.getVideoTracks()[0].label),e.canvas.onclick=()=>{e.video.paused?e.video.play():e.video.pause()}}async function T(){if(!e.video.paused){r.face&&r.face.tensor&&a.tf.dispose(r.face.tensor),await a.detect(e.video);let t=a.now();h.detect=1e3/(t-w.detect),w.detect=t,requestAnimationFrame(T)}}async function L(){let t=await a.next(a.result);await a.draw.canvas(e.video,e.canvas),await a.draw.all(e.canvas,t);let i=a.now();if(h.draw=1e3/(i-w.draw),w.draw=i,k(`fps: ${h.detect.toFixed(1).padStart(5," ")} detect | ${h.draw.toFixed(1).padStart(5," ")} draw`),o.faceCount=a.result.face.length===1,o.faceCount){let s=Object.values(a.result.gesture).map(f=>f.gesture);(s.includes("blink left eye")||s.includes("blink right eye"))&&(u.start=a.now()),u.start>0&&!s.includes("blink left eye")&&!s.includes("blink right eye")&&(u.end=a.now()),o.blinkDetected=o.blinkDetected||Math.abs(u.end-u.start)>c.blinkMin&&Math.abs(u.end-u.start)c.minConfidence&&(a.result.face[0].faceScore||0)>c.minConfidence,o.antispoofCheck=(a.result.face[0].real||0)>c.minConfidence,o.livenessCheck=(a.result.face[0].live||0)>c.minConfidence,o.faceSize=a.result.face[0].box[2]>=c.minSize&&a.result.face[0].box[3]>=c.minSize}let n=32;for(let[s,f]of Object.entries(o)){let d=document.getElementById(`ok-${s}`);d||(d=document.createElement("div"),d.innerText=s,d.className="ok",d.style.top=`${n}px`,e.ok.appendChild(d)),typeof f=="boolean"?d.style.backgroundColor=f?"lightgreen":"lightcoral":d.innerText=`${s}:${f}`,n+=28}return M()||o.elapsedMs>c.maxTime?(e.video.pause(),a.result.face[0]):(o.elapsedMs=Math.trunc(a.now()-E),new Promise(s=>{setTimeout(async()=>{await L()&&s(a.result.face[0])},30)}))}async function z(){var t,i,n,s;if(e.name.value.length>0){let f=(t=e.canvas.getContext("2d"))==null?void 0:t.getImageData(0,0,e.canvas.width,e.canvas.height),d={id:0,name:e.name.value,descriptor:(i=r.face)==null?void 0:i.embedding,image:f};await C(d),m("saved face record:",d.name,"descriptor length:",(s=(n=r.face)==null?void 0:n.embedding)==null?void 0:s.length),m("known face records:",await y())}else m("invalid name")}async function P(){r.record&&r.record.id>0&&await D(r.record)}async function j(){var s,f;if((s=e.canvas.getContext("2d"))==null||s.clearRect(0,0,c.minSize,c.minSize),!r.face||!r.face.tensor||!r.face.embedding)return!1;if(console.log("face record:",r.face),a.tf.browser.toPixels(r.face.tensor,e.canvas),await y()===0)return m("face database is empty"),document.body.style.background="black",e.delete.style.display="none",!1;let t=await x(),i=t.map(d=>d.descriptor).filter(d=>d.length>0),n=await a.match(r.face.embedding,i,I);return r.record=t[n.index]||null,r.record&&(m(`best match: ${r.record.name} | id: ${r.record.id} | similarity: ${Math.round(1e3*n.similarity)/10}%`),e.name.value=r.record.name,e.source.style.display="",(f=e.source.getContext("2d"))==null||f.putImageData(r.record.image,0,0)),document.body.style.background=n.similarity>c.threshold?"darkgreen":"maroon",n.similarity>c.threshold}async function B(){var t,i,n,s;return o.faceCount=!1,o.faceConfidence=!1,o.facingCenter=!1,o.blinkDetected=!1,o.faceSize=!1,o.antispoofCheck=!1,o.livenessCheck=!1,o.elapsedMs=0,e.match.style.display="none",e.retry.style.display="none",e.source.style.display="none",document.body.style.background="black",await S(),await T(),E=a.now(),r.face=await L(),e.canvas.width=((i=(t=r.face)==null?void 0:t.tensor)==null?void 0:i.shape[1])||c.minSize,e.canvas.height=((s=(n=r.face)==null?void 0:n.tensor)==null?void 0:s.shape[0])||c.minSize,e.source.width=e.canvas.width,e.source.height=e.canvas.height,e.canvas.style.width="",e.match.style.display="flex",e.save.style.display="flex",e.delete.style.display="flex",e.retry.style.display="block",M()?j():(m("did not find valid face"),!1)}async function q(){var t,i,n;m("human version:",a.version,"| tfjs version:",a.tf.version["tfjs-core"]),m("face embedding model:",(t=b.face.description)!=null&&t.enabled?"faceres":"",(i=b.face.mobilefacenet)!=null&&i.enabled?"mobilefacenet":"",(n=b.face.insightface)!=null&&n.enabled?"insightface":""),m("options:",JSON.stringify(c).replace(/{|}|"|\[|\]/g,"").replace(/,/g," ")),k("loading..."),m("known face records:",await y()),await S(),await a.load(),k("initializing..."),e.retry.addEventListener("click",B),e.save.addEventListener("click",z),e.delete.addEventListener("click",P),await a.warmup(),await B()}window.onload=q; //# sourceMappingURL=index.js.map diff --git a/demo/faceid/index.js.map b/demo/faceid/index.js.map index 0f0832c2..708d5f43 100644 --- a/demo/faceid/index.js.map +++ b/demo/faceid/index.js.map @@ -2,6 +2,6 @@ "version": 3, "sources": ["index.ts", "indexdb.ts"], "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport { Human, TensorLike, FaceResult } from '../../dist/human.esm.js'; // equivalent of @vladmandic/Human\nimport * as indexDb from './indexdb'; // methods to deal with indexdb\n\nconst humanConfig = { // user configuration for human, used to fine-tune behavior\n modelBasePath: '../../models',\n filter: { equalization: true }, // lets run with histogram equilizer\n face: {\n enabled: true,\n detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, // return tensor is used to get detected face image\n description: { enabled: true }, // default model for face descriptor extraction is faceres\n // mobilefacenet: { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }, // alternative model\n // insightface: { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }, // alternative model\n iris: { enabled: true }, // needed to determine gaze direction\n emotion: { enabled: false }, // not needed\n antispoof: { enabled: true }, // enable optional antispoof module\n liveness: { enabled: true }, // enable optional liveness module\n },\n body: { enabled: false },\n hand: { enabled: false },\n object: { enabled: false },\n gesture: { enabled: true }, // parses face and iris gestures\n};\n\n// const matchOptions = { order: 2, multiplier: 1000, min: 0.0, max: 1.0 }; // for embedding model\nconst matchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }; // for faceres model\n\nconst options = {\n minConfidence: 0.6, // overal face confidence for box, face, gender, real, live\n minSize: 224, // min input to face descriptor model before degradation\n maxTime: 10000, // max time before giving up\n blinkMin: 10, // minimum duration of a valid blink\n blinkMax: 800, // maximum duration of a valid blink\n threshold: 0.5, // minimum similarity\n mask: humanConfig.face.detector.mask,\n rotation: humanConfig.face.detector.rotation,\n cropFactor: humanConfig.face.detector.cropFactor,\n ...matchOptions,\n};\n\nconst ok = { // must meet all rules\n faceCount: false,\n faceConfidence: false,\n facingCenter: false,\n lookingCenter: false,\n blinkDetected: false,\n faceSize: false,\n antispoofCheck: false,\n livenessCheck: false,\n elapsedMs: 0, // total time while waiting for valid face\n};\nconst allOk = () => ok.faceCount && ok.faceSize && ok.blinkDetected && ok.facingCenter && ok.lookingCenter && ok.faceConfidence && ok.antispoofCheck && ok.livenessCheck;\nconst current: { face: FaceResult | null, record: indexDb.FaceRecord | null } = { face: null, record: null }; // current face record and matched database record\n\nconst blink = { // internal timers for blink start/end/duration\n start: 0,\n end: 0,\n time: 0,\n};\n\n// let db: Array<{ name: string, source: string, embedding: number[] }> = []; // holds loaded face descriptor database\nconst human = new Human(humanConfig); // create instance of human with overrides from user configuration\n\nhuman.env['perfadd'] = false; // is performance data showing instant or total values\nhuman.draw.options.font = 'small-caps 18px \"Lato\"'; // set font used to draw labels when using draw methods\nhuman.draw.options.lineHeight = 20;\n\nconst dom = { // grab instances of dom objects so we dont have to look them up later\n video: document.getElementById('video') as HTMLVideoElement,\n canvas: document.getElementById('canvas') as HTMLCanvasElement,\n log: document.getElementById('log') as HTMLPreElement,\n fps: document.getElementById('fps') as HTMLPreElement,\n match: document.getElementById('match') as HTMLDivElement,\n name: document.getElementById('name') as HTMLInputElement,\n save: document.getElementById('save') as HTMLSpanElement,\n delete: document.getElementById('delete') as HTMLSpanElement,\n retry: document.getElementById('retry') as HTMLDivElement,\n source: document.getElementById('source') as HTMLCanvasElement,\n ok: document.getElementById('ok') as HTMLDivElement,\n};\nconst timestamp = { detect: 0, draw: 0 }; // holds information used to calculate performance and possible memory leaks\nconst fps = { detect: 0, draw: 0 }; // holds calculated fps information for both detect and screen refresh\nlet startTime = 0;\n\nconst log = (...msg) => { // helper method to output messages\n dom.log.innerText += msg.join(' ') + '\\n';\n // eslint-disable-next-line no-console\n console.log(...msg);\n};\nconst printFPS = (msg) => dom.fps.innerText = msg; // print status element\n\nasync function webCam() { // initialize webcam\n printFPS('starting webcam...');\n // @ts-ignore resizeMode is not yet defined in tslib\n const cameraOptions: MediaStreamConstraints = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth } } };\n const stream: MediaStream = await navigator.mediaDevices.getUserMedia(cameraOptions);\n const ready = new Promise((resolve) => { dom.video.onloadeddata = () => resolve(true); });\n dom.video.srcObject = stream;\n dom.video.play();\n await ready;\n dom.canvas.width = dom.video.videoWidth;\n dom.canvas.height = dom.video.videoHeight;\n if (human.env.initial) log('video:', dom.video.videoWidth, dom.video.videoHeight, '|', stream.getVideoTracks()[0].label);\n dom.canvas.onclick = () => { // pause when clicked on screen and resume on next click\n if (dom.video.paused) dom.video.play();\n else dom.video.pause();\n };\n}\n\nasync function detectionLoop() { // main detection loop\n if (!dom.video.paused) {\n if (current.face && current.face.tensor) human.tf.dispose(current.face.tensor); // dispose previous tensor\n await human.detect(dom.video); // actual detection; were not capturing output in a local variable as it can also be reached via human.result\n const now = human.now();\n fps.detect = 1000 / (now - timestamp.detect);\n timestamp.detect = now;\n requestAnimationFrame(detectionLoop); // start new frame immediately\n }\n}\n\nasync function validationLoop(): Promise { // main screen refresh loop\n const interpolated = await human.next(human.result); // smoothen result using last-known results\n await human.draw.canvas(dom.video, dom.canvas); // draw canvas to screen\n await human.draw.all(dom.canvas, interpolated); // draw labels, boxes, lines, etc.\n const now = human.now();\n fps.draw = 1000 / (now - timestamp.draw);\n timestamp.draw = now;\n printFPS(`fps: ${fps.detect.toFixed(1).padStart(5, ' ')} detect | ${fps.draw.toFixed(1).padStart(5, ' ')} draw`); // write status\n ok.faceCount = human.result.face.length === 1; // must be exactly detected face\n if (ok.faceCount) { // skip the rest if no face\n const gestures: string[] = Object.values(human.result.gesture).map((gesture) => gesture.gesture); // flatten all gestures\n if (gestures.includes('blink left eye') || gestures.includes('blink right eye')) blink.start = human.now(); // blink starts when eyes get closed\n if (blink.start > 0 && !gestures.includes('blink left eye') && !gestures.includes('blink right eye')) blink.end = human.now(); // if blink started how long until eyes are back open\n ok.blinkDetected = ok.blinkDetected || (Math.abs(blink.end - blink.start) > options.blinkMin && Math.abs(blink.end - blink.start) < options.blinkMax);\n if (ok.blinkDetected && blink.time === 0) blink.time = Math.trunc(blink.end - blink.start);\n ok.facingCenter = gestures.includes('facing center');\n ok.lookingCenter = gestures.includes('looking center'); // must face camera and look at camera\n ok.faceConfidence = (human.result.face[0].boxScore || 0) > options.minConfidence && (human.result.face[0].faceScore || 0) > options.minConfidence;\n ok.antispoofCheck = (human.result.face[0].real || 0) > options.minConfidence;\n ok.livenessCheck = (human.result.face[0].live || 0) > options.minConfidence;\n ok.faceSize = human.result.face[0].box[2] >= options.minSize && human.result.face[0].box[3] >= options.minSize;\n }\n let y = 32;\n for (const [key, val] of Object.entries(ok)) {\n let el = document.getElementById(`ok-${key}`);\n if (!el) {\n el = document.createElement('div');\n el.innerText = key;\n el.className = 'ok';\n el.style.top = `${y}px`;\n dom.ok.appendChild(el);\n }\n if (typeof val === 'boolean') el.style.backgroundColor = val ? 'lightgreen' : 'lightcoral';\n else el.innerText = `${key}:${val}`;\n y += 28;\n }\n if (allOk()) { // all criteria met\n dom.video.pause();\n return human.result.face[0];\n }\n if (ok.elapsedMs > options.maxTime) { // give up\n dom.video.pause();\n return human.result.face[0];\n } else { // run again\n ok.elapsedMs = Math.trunc(human.now() - startTime);\n return new Promise((resolve) => {\n setTimeout(async () => {\n const res = await validationLoop(); // run validation loop until conditions are met\n if (res) resolve(human.result.face[0]); // recursive promise resolve\n }, 30); // use to slow down refresh from max refresh rate to target of 30 fps\n });\n }\n}\n\nasync function saveRecords() {\n if (dom.name.value.length > 0) {\n const image = dom.canvas.getContext('2d')?.getImageData(0, 0, dom.canvas.width, dom.canvas.height) as ImageData;\n const rec = { id: 0, name: dom.name.value, descriptor: current.face?.embedding as number[], image };\n await indexDb.save(rec);\n log('saved face record:', rec.name, 'descriptor length:', current.face?.embedding?.length);\n log('known face records:', await indexDb.count());\n } else {\n log('invalid name');\n }\n}\n\nasync function deleteRecord() {\n if (current.record && current.record.id > 0) {\n await indexDb.remove(current.record);\n }\n}\n\nasync function detectFace() {\n dom.canvas.getContext('2d')?.clearRect(0, 0, options.minSize, options.minSize);\n if (!current.face || !current.face.tensor || !current.face.embedding) return false;\n // eslint-disable-next-line no-console\n console.log('face record:', current.face);\n human.tf.browser.toPixels(current.face.tensor as unknown as TensorLike, dom.canvas);\n if (await indexDb.count() === 0) {\n log('face database is empty');\n document.body.style.background = 'black';\n dom.delete.style.display = 'none';\n return false;\n }\n const db = await indexDb.load();\n const descriptors = db.map((rec) => rec.descriptor).filter((desc) => desc.length > 0);\n const res = await human.match(current.face.embedding, descriptors, matchOptions);\n current.record = db[res.index] || null;\n if (current.record) {\n log(`best match: ${current.record.name} | id: ${current.record.id} | similarity: ${Math.round(1000 * res.similarity) / 10}%`);\n dom.name.value = current.record.name;\n dom.source.style.display = '';\n dom.source.getContext('2d')?.putImageData(current.record.image, 0, 0);\n }\n document.body.style.background = res.similarity > options.threshold ? 'darkgreen' : 'maroon';\n return res.similarity > options.threshold;\n}\n\nasync function main() { // main entry point\n ok.faceCount = false;\n ok.faceConfidence = false;\n ok.facingCenter = false;\n ok.blinkDetected = false;\n ok.faceSize = false;\n ok.antispoofCheck = false;\n ok.livenessCheck = false;\n ok.elapsedMs = 0;\n dom.match.style.display = 'none';\n dom.retry.style.display = 'none';\n dom.source.style.display = 'none';\n document.body.style.background = 'black';\n await webCam();\n await detectionLoop(); // start detection loop\n startTime = human.now();\n current.face = await validationLoop(); // start validation loop\n dom.canvas.width = current.face?.tensor?.shape[1] || options.minSize;\n dom.canvas.height = current.face?.tensor?.shape[0] || options.minSize;\n dom.source.width = dom.canvas.width;\n dom.source.height = dom.canvas.height;\n dom.canvas.style.width = '';\n dom.match.style.display = 'flex';\n dom.save.style.display = 'flex';\n dom.delete.style.display = 'flex';\n dom.retry.style.display = 'block';\n if (!allOk()) { // is all criteria met?\n log('did not find valid face');\n return false;\n } else {\n return detectFace();\n }\n}\n\nasync function init() {\n log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);\n log('face embedding model:', humanConfig.face['description']?.enabled ? 'faceres' : '', humanConfig.face['mobilefacenet']?.enabled ? 'mobilefacenet' : '', humanConfig.face['insightface']?.enabled ? 'insightface' : '');\n log('options:', JSON.stringify(options).replace(/{|}|\"|\\[|\\]/g, '').replace(/,/g, ' '));\n printFPS('loading...');\n log('known face records:', await indexDb.count());\n await webCam(); // start webcam\n await human.load(); // preload all models\n printFPS('initializing...');\n dom.retry.addEventListener('click', main);\n dom.save.addEventListener('click', saveRecords);\n dom.delete.addEventListener('click', deleteRecord);\n await human.warmup(); // warmup function to initialize backend for future faster detection\n await main();\n}\n\nwindow.onload = init;\n", "let db: IDBDatabase; // instance of indexdb\n\nconst database = 'human';\nconst table = 'person';\n\nexport type FaceRecord = { id: number, name: string, descriptor: number[], image: ImageData };\n\n// eslint-disable-next-line no-console\nconst log = (...msg) => console.log('indexdb', ...msg);\n\nexport async function open() {\n if (db) return true;\n return new Promise((resolve) => {\n const request: IDBOpenDBRequest = indexedDB.open(database, 1);\n request.onerror = (evt) => log('error:', evt);\n request.onupgradeneeded = (evt: IDBVersionChangeEvent) => { // create if doesnt exist\n log('create:', evt.target);\n db = (evt.target as IDBOpenDBRequest).result;\n db.createObjectStore(table, { keyPath: 'id', autoIncrement: true });\n };\n request.onsuccess = (evt) => { // open\n db = (evt.target as IDBOpenDBRequest).result as IDBDatabase;\n log('open:', db);\n resolve(true);\n };\n });\n}\n\nexport async function load(): Promise {\n const faceDB: Array = [];\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const cursor: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).openCursor(null, 'next');\n cursor.onerror = (evt) => log('load error:', evt);\n cursor.onsuccess = (evt) => {\n if ((evt.target as IDBRequest).result) {\n faceDB.push((evt.target as IDBRequest).result.value);\n (evt.target as IDBRequest).result.continue();\n } else {\n resolve(faceDB);\n }\n };\n });\n}\n\nexport async function count(): Promise {\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const store: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).count();\n store.onerror = (evt) => log('count error:', evt);\n store.onsuccess = () => resolve(store.result);\n });\n}\n\nexport async function save(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n const newRecord = { name: faceRecord.name, descriptor: faceRecord.descriptor, image: faceRecord.image }; // omit id as its autoincrement\n db.transaction([table], 'readwrite').objectStore(table).put(newRecord);\n log('save:', newRecord);\n}\n\nexport async function remove(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n db.transaction([table], 'readwrite').objectStore(table).delete(faceRecord.id); // delete based on id\n log('delete:', faceRecord);\n}\n"], - "mappings": "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", - "names": ["log", "db"] + "mappings": "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", + "names": ["Human", "db", "database", "table", "log", "msg", "open", "resolve", "request", "evt", "load", "faceDB", "cursor", "count", "store", "save", "faceRecord", "newRecord", "remove", "humanConfig", "matchOptions", "options", "ok", "allOk", "current", "blink", "human", "Human", "dom", "timestamp", "fps", "startTime", "log", "msg", "printFPS", "webCam", "cameraOptions", "stream", "ready", "resolve", "detectionLoop", "now", "validationLoop", "interpolated", "gestures", "gesture", "y", "key", "val", "el", "saveRecords", "_a", "_b", "_c", "_d", "image", "rec", "save", "count", "deleteRecord", "remove", "detectFace", "db", "load", "descriptors", "desc", "res", "main", "init"] } diff --git a/demo/typescript/index.js b/demo/typescript/index.js index 2c86c503..2d02856b 100644 --- a/demo/typescript/index.js +++ b/demo/typescript/index.js @@ -4,108 +4,6 @@ author: ' */ -// demo/typescript/index.ts -import { Human } from "../../dist/human.esm.js"; -var humanConfig = { - async: false, - modelBasePath: "../../models", - filter: { enabled: true, equalization: false, flip: false }, - face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true } }, - body: { enabled: true }, - hand: { enabled: true }, - object: { enabled: false }, - gesture: { enabled: true } -}; -var human = new Human(humanConfig); -human.env["perfadd"] = false; -human.draw.options.font = 'small-caps 18px "Lato"'; -human.draw.options.lineHeight = 20; -var dom = { - video: document.getElementById("video"), - canvas: document.getElementById("canvas"), - log: document.getElementById("log"), - fps: document.getElementById("status"), - perf: document.getElementById("performance") -}; -var timestamp = { detect: 0, draw: 0, tensors: 0, start: 0 }; -var fps = { detectFPS: 0, drawFPS: 0, frames: 0, averageMs: 0 }; -var log = (...msg) => { - dom.log.innerText += msg.join(" ") + "\n"; - console.log(...msg); -}; -var status = (msg) => dom.fps.innerText = msg; -var perf = (msg) => dom.perf.innerText = "tensors:" + human.tf.memory().numTensors + " | performance: " + JSON.stringify(msg).replace(/"|{|}/g, "").replace(/,/g, " | "); -async function webCam() { - status("starting webcam..."); - const options = { audio: false, video: { facingMode: "user", resizeMode: "none", width: { ideal: document.body.clientWidth }, height: { ideal: document.body.clientHeight } } }; - const stream = await navigator.mediaDevices.getUserMedia(options); - const ready = new Promise((resolve) => { - dom.video.onloadeddata = () => resolve(true); - }); - dom.video.srcObject = stream; - dom.video.play(); - await ready; - dom.canvas.width = dom.video.videoWidth; - dom.canvas.height = dom.video.videoHeight; - const track = stream.getVideoTracks()[0]; - const capabilities = track.getCapabilities ? track.getCapabilities() : ""; - const settings = track.getSettings ? track.getSettings() : ""; - const constraints = track.getConstraints ? track.getConstraints() : ""; - log("video:", dom.video.videoWidth, dom.video.videoHeight, track.label, { stream, track, settings, constraints, capabilities }); - dom.canvas.onclick = () => { - if (dom.video.paused) - dom.video.play(); - else - dom.video.pause(); - }; -} -async function detectionLoop() { - if (!dom.video.paused) { - if (timestamp.start === 0) - timestamp.start = human.now(); - await human.detect(dom.video); - const tensors = human.tf.memory().numTensors; - if (tensors - timestamp.tensors !== 0) - log("allocated tensors:", tensors - timestamp.tensors); - timestamp.tensors = tensors; - fps.detectFPS = Math.round(1e3 * 1e3 / (human.now() - timestamp.detect)) / 1e3; - fps.frames++; - fps.averageMs = Math.round(1e3 * (human.now() - timestamp.start) / fps.frames) / 1e3; - if (fps.frames % 100 === 0 && !dom.video.paused) - log("performance", { ...fps, tensors: timestamp.tensors }); - } - timestamp.detect = human.now(); - requestAnimationFrame(detectionLoop); -} -async function drawLoop() { - if (!dom.video.paused) { - const interpolated = await human.next(human.result); - if (human.config.filter.flip) - await human.draw.canvas(interpolated.canvas, dom.canvas); - else - await human.draw.canvas(dom.video, dom.canvas); - await human.draw.all(dom.canvas, interpolated); - perf(interpolated.performance); - } - const now = human.now(); - fps.drawFPS = Math.round(1e3 * 1e3 / (now - timestamp.draw)) / 1e3; - timestamp.draw = now; - status(dom.video.paused ? "paused" : `fps: ${fps.detectFPS.toFixed(1).padStart(5, " ")} detect | ${fps.drawFPS.toFixed(1).padStart(5, " ")} draw`); - setTimeout(drawLoop, 30); -} -async function main() { - log("human version:", human.version, "| tfjs version:", human.tf.version["tfjs-core"]); - log("platform:", human.env.platform, "| agent:", human.env.agent); - status("loading..."); - await human.load(); - log("backend:", human.tf.getBackend(), "| available:", human.env.backends); - log("models stats:", human.getModelStats()); - log("models loaded:", Object.values(human.models).filter((model) => model !== null).length); - status("initializing..."); - await human.warmup(); - await webCam(); - await detectionLoop(); - await drawLoop(); -} -window.onload = main; +import{Human as p}from"../../dist/human.esm.js";var w={async:!1,modelBasePath:"../../models",filter:{enabled:!0,equalization:!1,flip:!1},face:{enabled:!0,detector:{rotation:!1},mesh:{enabled:!0},attention:{enabled:!1},iris:{enabled:!0},description:{enabled:!0},emotion:{enabled:!0}},body:{enabled:!0},hand:{enabled:!0},object:{enabled:!1},gesture:{enabled:!0}},e=new p(w);e.env.perfadd=!1;e.draw.options.font='small-caps 18px "Lato"';e.draw.options.lineHeight=20;var t={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("status"),perf:document.getElementById("performance")},n={detect:0,draw:0,tensors:0,start:0},o={detectFPS:0,drawFPS:0,frames:0,averageMs:0},i=(...a)=>{t.log.innerText+=a.join(" ")+` +`,console.log(...a)},r=a=>t.fps.innerText=a,b=a=>t.perf.innerText="tensors:"+e.tf.memory().numTensors+" | performance: "+JSON.stringify(a).replace(/"|{|}/g,"").replace(/,/g," | ");async function h(){r("starting webcam...");let a={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth},height:{ideal:document.body.clientHeight}}},d=await navigator.mediaDevices.getUserMedia(a),m=new Promise(u=>{t.video.onloadeddata=()=>u(!0)});t.video.srcObject=d,t.video.play(),await m,t.canvas.width=t.video.videoWidth,t.canvas.height=t.video.videoHeight;let s=d.getVideoTracks()[0],f=s.getCapabilities?s.getCapabilities():"",v=s.getSettings?s.getSettings():"",g=s.getConstraints?s.getConstraints():"";i("video:",t.video.videoWidth,t.video.videoHeight,s.label,{stream:d,track:s,settings:v,constraints:g,capabilities:f}),t.canvas.onclick=()=>{t.video.paused?t.video.play():t.video.pause()}}async function c(){if(!t.video.paused){n.start===0&&(n.start=e.now()),await e.detect(t.video);let a=e.tf.memory().numTensors;a-n.tensors!==0&&i("allocated tensors:",a-n.tensors),n.tensors=a,o.detectFPS=Math.round(1e3*1e3/(e.now()-n.detect))/1e3,o.frames++,o.averageMs=Math.round(1e3*(e.now()-n.start)/o.frames)/1e3,o.frames%100===0&&!t.video.paused&&i("performance",{...o,tensors:n.tensors})}n.detect=e.now(),requestAnimationFrame(c)}async function l(){if(!t.video.paused){let d=await e.next(e.result);e.config.filter.flip?await e.draw.canvas(d.canvas,t.canvas):await e.draw.canvas(t.video,t.canvas),await e.draw.all(t.canvas,d),b(d.performance)}let a=e.now();o.drawFPS=Math.round(1e3*1e3/(a-n.draw))/1e3,n.draw=a,r(t.video.paused?"paused":`fps: ${o.detectFPS.toFixed(1).padStart(5," ")} detect | ${o.drawFPS.toFixed(1).padStart(5," ")} draw`),setTimeout(l,30)}async function M(){i("human version:",e.version,"| tfjs version:",e.tf.version["tfjs-core"]),i("platform:",e.env.platform,"| agent:",e.env.agent),r("loading..."),await e.load(),i("backend:",e.tf.getBackend(),"| available:",e.env.backends),i("models stats:",e.getModelStats()),i("models loaded:",Object.values(e.models).filter(a=>a!==null).length),r("initializing..."),await e.warmup(),await h(),await c(),await l()}window.onload=M; //# sourceMappingURL=index.js.map diff --git a/demo/typescript/index.js.map b/demo/typescript/index.js.map index c2554622..bf3e4f62 100644 --- a/demo/typescript/index.js.map +++ b/demo/typescript/index.js.map @@ -2,6 +2,6 @@ "version": 3, "sources": ["index.ts"], "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport { Human, Config } from '../../dist/human.esm.js'; // equivalent of @vladmandic/Human\n\nconst humanConfig: Partial = { // user configuration for human, used to fine-tune behavior\n // backend: 'wasm' as const,\n // wasmPath: 'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@3.18.0/dist/',\n // cacheSensitivity: 0,\n async: false,\n modelBasePath: '../../models',\n filter: { enabled: true, equalization: false, flip: false },\n face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true } },\n body: { enabled: true },\n hand: { enabled: true },\n object: { enabled: false },\n gesture: { enabled: true },\n};\n\nconst human = new Human(humanConfig); // create instance of human with overrides from user configuration\n\nhuman.env['perfadd'] = false; // is performance data showing instant or total values\nhuman.draw.options.font = 'small-caps 18px \"Lato\"'; // set font used to draw labels when using draw methods\nhuman.draw.options.lineHeight = 20;\n// human.draw.options.fillPolygons = true;\n\nconst dom = { // grab instances of dom objects so we dont have to look them up later\n video: document.getElementById('video') as HTMLVideoElement,\n canvas: document.getElementById('canvas') as HTMLCanvasElement,\n log: document.getElementById('log') as HTMLPreElement,\n fps: document.getElementById('status') as HTMLPreElement,\n perf: document.getElementById('performance') as HTMLDivElement,\n};\nconst timestamp = { detect: 0, draw: 0, tensors: 0, start: 0 }; // holds information used to calculate performance and possible memory leaks\nconst fps = { detectFPS: 0, drawFPS: 0, frames: 0, averageMs: 0 }; // holds calculated fps information for both detect and screen refresh\n\nconst log = (...msg) => { // helper method to output messages\n dom.log.innerText += msg.join(' ') + '\\n';\n // eslint-disable-next-line no-console\n console.log(...msg);\n};\nconst status = (msg) => dom.fps.innerText = msg; // print status element\nconst perf = (msg) => dom.perf.innerText = 'tensors:' + human.tf.memory().numTensors + ' | performance: ' + JSON.stringify(msg).replace(/\"|{|}/g, '').replace(/,/g, ' | '); // print performance element\n\nasync function webCam() { // initialize webcam\n status('starting webcam...');\n // @ts-ignore resizeMode is not yet defined in tslib\n const options: MediaStreamConstraints = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth }, height: { ideal: document.body.clientHeight } } };\n const stream: MediaStream = await navigator.mediaDevices.getUserMedia(options);\n const ready = new Promise((resolve) => { dom.video.onloadeddata = () => resolve(true); });\n dom.video.srcObject = stream;\n dom.video.play();\n await ready;\n dom.canvas.width = dom.video.videoWidth;\n dom.canvas.height = dom.video.videoHeight;\n const track: MediaStreamTrack = stream.getVideoTracks()[0];\n const capabilities: MediaTrackCapabilities | string = track.getCapabilities ? track.getCapabilities() : '';\n const settings: MediaTrackSettings | string = track.getSettings ? track.getSettings() : '';\n const constraints: MediaTrackConstraints | string = track.getConstraints ? track.getConstraints() : '';\n log('video:', dom.video.videoWidth, dom.video.videoHeight, track.label, { stream, track, settings, constraints, capabilities });\n dom.canvas.onclick = () => { // pause when clicked on screen and resume on next click\n if (dom.video.paused) dom.video.play();\n else dom.video.pause();\n };\n}\n\nasync function detectionLoop() { // main detection loop\n if (!dom.video.paused) {\n if (timestamp.start === 0) timestamp.start = human.now();\n // log('profiling data:', await human.profile(dom.video));\n await human.detect(dom.video); // actual detection; were not capturing output in a local variable as it can also be reached via human.result\n const tensors = human.tf.memory().numTensors; // check current tensor usage for memory leaks\n if (tensors - timestamp.tensors !== 0) log('allocated tensors:', tensors - timestamp.tensors); // printed on start and each time there is a tensor leak\n timestamp.tensors = tensors;\n fps.detectFPS = Math.round(1000 * 1000 / (human.now() - timestamp.detect)) / 1000;\n fps.frames++;\n fps.averageMs = Math.round(1000 * (human.now() - timestamp.start) / fps.frames) / 1000;\n if (fps.frames % 100 === 0 && !dom.video.paused) log('performance', { ...fps, tensors: timestamp.tensors });\n }\n timestamp.detect = human.now();\n requestAnimationFrame(detectionLoop); // start new frame immediately\n}\n\nasync function drawLoop() { // main screen refresh loop\n if (!dom.video.paused) {\n const interpolated = await human.next(human.result); // smoothen result using last-known results\n if (human.config.filter.flip) await human.draw.canvas(interpolated.canvas as HTMLCanvasElement, dom.canvas); // draw processed image to screen canvas\n else await human.draw.canvas(dom.video, dom.canvas); // draw original video to screen canvas // better than using procesed image as this loop happens faster than processing loop\n await human.draw.all(dom.canvas, interpolated); // draw labels, boxes, lines, etc.\n perf(interpolated.performance); // write performance data\n }\n const now = human.now();\n fps.drawFPS = Math.round(1000 * 1000 / (now - timestamp.draw)) / 1000;\n timestamp.draw = now;\n status(dom.video.paused ? 'paused' : `fps: ${fps.detectFPS.toFixed(1).padStart(5, ' ')} detect | ${fps.drawFPS.toFixed(1).padStart(5, ' ')} draw`); // write status\n setTimeout(drawLoop, 30); // use to slow down refresh from max refresh rate to target of 30 fps\n}\n\nasync function main() { // main entry point\n log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);\n log('platform:', human.env.platform, '| agent:', human.env.agent);\n status('loading...');\n await human.load(); // preload all models\n log('backend:', human.tf.getBackend(), '| available:', human.env.backends);\n log('models stats:', human.getModelStats());\n log('models loaded:', Object.values(human.models).filter((model) => model !== null).length);\n status('initializing...');\n await human.warmup(); // warmup function to initialize backend for future faster detection\n await webCam(); // start webcam\n await detectionLoop(); // start detection loop\n await drawLoop(); // start draw loop\n}\n\nwindow.onload = main;\n"], - "mappings": "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", - "names": [] + "mappings": "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", + "names": ["Human", "humanConfig", "human", "dom", "timestamp", "fps", "log", "msg", "status", "perf", "webCam", "options", "stream", "ready", "resolve", "track", "capabilities", "settings", "constraints", "detectionLoop", "tensors", "drawLoop", "interpolated", "now", "main", "model"] } diff --git a/dist/human.d.ts b/dist/human.d.ts index 5817bde8..135dc8be 100644 --- a/dist/human.d.ts +++ b/dist/human.d.ts @@ -200,6 +200,11 @@ export declare interface Config { * default: true if indexdb is available (browsers), false if its not (nodejs) */ cacheModels: boolean; + /** Validate kernel ops used in model during model load + * default: true + * any errors will be printed on console but will be treated as non-fatal + */ + validateModels: boolean; /** Cache sensitivity * - values 0..1 where 0.01 means reset cache if input changed more than 1% * - set to 0 to disable caching @@ -1249,6 +1254,11 @@ declare class Human { where: string; expected?: string; }[]; + /** Check model for invalid kernel ops for current backend */ + check(): { + name: string; + missing: string[]; + }[]; /** Exports face matching methods {@link match#similarity} */ similarity: typeof match.similarity; /** Exports face matching methods {@link match#distance} */ @@ -1482,6 +1492,13 @@ export declare type IrisGesture = 'facing center' | `looking ${'left' | 'right' declare function isHTTPScheme(url: string): boolean; +export declare type KernelOps = { + name: string; + url: string; + missing: string[]; + ops: string[]; +}; + /** * List all models stored in registered storage mediums. * @@ -1871,10 +1888,12 @@ declare namespace models { export { reset, load, + validateModel, validate, Models, ModelStats, - getModelStats + getModelStats, + KernelOps } } export { models } @@ -2502,7 +2521,12 @@ declare type Url = string | io.IOHandler | io.IOHandlerSync; declare type UrlIOHandler = T extends string ? io.IOHandler : T; -declare function validate(instance: Human): Promise; +declare function validate(newInstance: Human): Array<{ + name: string; + missing: string[]; +}>; + +declare function validateModel(newInstance: Human | null, model: GraphModel | null, name: string): KernelOps | null; /** * A mutable `tf.Tensor`, useful for persisting state, e.g. for training. diff --git a/dist/human.esm-nobundle.d.ts b/dist/human.esm-nobundle.d.ts index 5817bde8..135dc8be 100644 --- a/dist/human.esm-nobundle.d.ts +++ b/dist/human.esm-nobundle.d.ts @@ -200,6 +200,11 @@ export declare interface Config { * default: true if indexdb is available (browsers), false if its not (nodejs) */ cacheModels: boolean; + /** Validate kernel ops used in model during model load + * default: true + * any errors will be printed on console but will be treated as non-fatal + */ + validateModels: boolean; /** Cache sensitivity * - values 0..1 where 0.01 means reset cache if input changed more than 1% * - set to 0 to disable caching @@ -1249,6 +1254,11 @@ declare class Human { where: string; expected?: string; }[]; + /** Check model for invalid kernel ops for current backend */ + check(): { + name: string; + missing: string[]; + }[]; /** Exports face matching methods {@link match#similarity} */ similarity: typeof match.similarity; /** Exports face matching methods {@link match#distance} */ @@ -1482,6 +1492,13 @@ export declare type IrisGesture = 'facing center' | `looking ${'left' | 'right' declare function isHTTPScheme(url: string): boolean; +export declare type KernelOps = { + name: string; + url: string; + missing: string[]; + ops: string[]; +}; + /** * List all models stored in registered storage mediums. * @@ -1871,10 +1888,12 @@ declare namespace models { export { reset, load, + validateModel, validate, Models, ModelStats, - getModelStats + getModelStats, + KernelOps } } export { models } @@ -2502,7 +2521,12 @@ declare type Url = string | io.IOHandler | io.IOHandlerSync; declare type UrlIOHandler = T extends string ? io.IOHandler : T; -declare function validate(instance: Human): Promise; +declare function validate(newInstance: Human): Array<{ + name: string; + missing: string[]; +}>; + +declare function validateModel(newInstance: Human | null, model: GraphModel | null, name: string): KernelOps | null; /** * A mutable `tf.Tensor`, useful for persisting state, e.g. for training. diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index 9bd20a36..36940dd4 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -4,264 +4,7 @@ author: ' */ -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __export = (target, all2) => { - for (var name in all2) - __defProp(target, name, { get: all2[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __reExport = (target, mod3, secondTarget) => (__copyProps(target, mod3, "default"), secondTarget && __copyProps(secondTarget, mod3, "default")); -var __publicField = (obj, key, value) => { - __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - return value; -}; -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/util/util.ts -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); -} -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(`modelpath error: expecting json file: ${path}`); - return path; -} -var now = () => { - if (typeof performance !== "undefined") - return performance.now(); - return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); -}; -function validate(defaults, config3, parent = "config", msgs = []) { - for (const key of Object.keys(config3)) { - if (typeof config3[key] === "object") { - validate(defaults[key], config3[key], key, msgs); - } else { - const defined = defaults && typeof defaults[key] !== "undefined"; - if (!defined) - msgs.push({ reason: "unknown property", where: `${parent}.${key} = ${config3[key]}` }); - const same = defaults && typeof defaults[key] === typeof config3[key]; - if (defined && !same) - msgs.push({ reason: "property type mismatch", where: `${parent}.${key} = ${config3[key]}`, expected: typeof defaults[key] }); - } - } - if (config3.debug && parent === "config" && msgs.length > 0) - log("invalid configuration", msgs); - return msgs; -} -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: "", - modelBasePath: "", - cacheModels: true, - validateModels: true, - wasmPath: "", - wasmPlatformFetch: false, - debug: false, - async: true, - warmup: "full", - cacheSensitivity: 0.7, - skipAllowed: false, - deallocate: false, - filter: { - enabled: true, - equalization: false, - 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: 1, - skipFrames: 99, - skipTime: 2500, - minConfidence: 0.2, - iouThreshold: 0.1, - mask: false, - return: false - }, - mesh: { - enabled: true, - modelPath: "facemesh.json", - keepInvalid: false - }, - attention: { - enabled: false, - modelPath: "facemesh-attention.json" - }, - iris: { - enabled: true, - modelPath: "iris.json" - }, - emotion: { - enabled: true, - minConfidence: 0.1, - skipFrames: 99, - skipTime: 1500, - modelPath: "emotion.json" - }, - description: { - enabled: true, - modelPath: "faceres.json", - skipFrames: 99, - skipTime: 3e3, - minConfidence: 0.1 - }, - antispoof: { - enabled: false, - skipFrames: 99, - skipTime: 4e3, - modelPath: "antispoof.json" - }, - liveness: { - enabled: false, - skipFrames: 99, - skipTime: 4e3, - modelPath: "liveness.json" - } - }, - body: { - enabled: true, - modelPath: "movenet-lightning.json", - maxDetected: -1, - minConfidence: 0.3, - skipFrames: 1, - skipTime: 200 - }, - hand: { - enabled: true, - rotation: true, - skipFrames: 99, - skipTime: 1e3, - minConfidence: 0.5, - iouThreshold: 0.2, - maxDetected: -1, - landmarks: true, - detector: { - modelPath: "handtrack.json" - }, - skeleton: { - modelPath: "handlandmark-full.json" - } - }, - object: { - enabled: false, - modelPath: "mb3-centernet.json", - minConfidence: 0.2, - iouThreshold: 0.4, - maxDetected: 10, - skipFrames: 99, - skipTime: 2e3 - }, - segmentation: { - enabled: false, - modelPath: "selfie.json", - blur: 8 - } -}; - -// dist/tfjs.esm.js -var tfjs_esm_exports = {}; -__export(tfjs_esm_exports, { - GraphModel: () => GraphModel, - Tensor: () => Tensor, - version: () => version8 -}); -__reExport(tfjs_esm_exports, dist_star); -__reExport(tfjs_esm_exports, dist_star2); -import * as dist_star from "@tensorflow/tfjs/dist/index.js"; -import * as dist_star2 from "@tensorflow/tfjs-backend-webgl/dist/index.js"; -import { Tensor } from "@tensorflow/tfjs/dist/index.js"; -import { GraphModel } from "@tensorflow/tfjs-converter/dist/index"; -var version = "3.19.0"; -var version2 = "3.19.0"; -var version3 = "3.19.0"; -var version4 = "3.19.0"; -var version5 = "3.19.0"; -var version6 = "3.19.0"; -var version7 = "3.19.0"; -var version8 = { - tfjs: version, - "tfjs-core": version2, - "tfjs-data": version3, - "tfjs-layers": version4, - "tfjs-converter": version5, - "tfjs-backend-webgl": version6, - "tfjs-backend-wasm": version7 -}; - -// src/image/imagefxshaders.ts -var vertexIdentity = ` +var e5=Object.defineProperty;var Io=Object.getOwnPropertyDescriptor;var jo=Object.getOwnPropertyNames;var No=Object.prototype.hasOwnProperty;var Oo=(e,t,o)=>t in e?e5(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var K0=(e,t)=>{for(var o in t)e5(e,o,{get:t[o],enumerable:!0})},F1=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of jo(t))!No.call(e,r)&&r!==o&&e5(e,r,{get:()=>t[r],enumerable:!(n=Io(t,r))||n.enumerable});return e},q=(e,t,o)=>(F1(e,t,"default"),o&&F1(o,t,"default"));var w=(e,t,o)=>(Oo(e,typeof t!="symbol"?t+"":t,o),o),G1=(e,t,o)=>{if(!t.has(e))throw TypeError("Cannot "+o)};var Ye=(e,t,o)=>(G1(e,t,"read from private field"),o?o.call(e):t.get(e)),Ke=(e,t,o)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,o)},Je=(e,t,o,n)=>(G1(e,t,"write to private field"),n?n.call(e,o):t.set(e,o),o);function u(...e){let t=new Date,o=`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}.${t.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(o,"Human:",...e)}function B1(e,t){let o=e.endsWith("/")?"":"/",r=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${o}${t}`;if(!r.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${r}`);return r}var g=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function t5(e,t,o="config",n=[]){for(let r of Object.keys(t))if(typeof t[r]=="object")t5(e[r],t[r],r,n);else{let s=e&&typeof e[r]!="undefined";s||n.push({reason:"unknown property",where:`${o}.${r} = ${t[r]}`});let a=e&&typeof e[r]==typeof t[r];s&&!a&&n.push({reason:"property type mismatch",where:`${o}.${r} = ${t[r]}`,expected:typeof e[r]})}return t.debug&&o==="config"&&n.length>0&&u("invalid configuration",n),n}function _(...e){let t=o=>o&&typeof o=="object";return e.reduce((o,n)=>(Object.keys(n||{}).forEach(r=>{let s=o[r],a=n[r];Array.isArray(s)&&Array.isArray(a)?o[r]=s.concat(...a):t(s)&&t(a)?o[r]=_(s,a):o[r]=a}),o),{})}var ie={backend:"",modelBasePath:"",cacheModels:!0,validateModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!1,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!0,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json",keepInvalid:!1},attention:{enabled:!1,modelPath:"facemesh-attention.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-full.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"selfie.json",blur:8}};var A={};K0(A,{GraphModel:()=>o5,Tensor:()=>Pe,version:()=>Qe});q(A,BA);q(A,HA);import*as BA from"@tensorflow/tfjs/dist/index.js";import*as HA from"@tensorflow/tfjs-backend-webgl/dist/index.js";import{Tensor as Pe}from"@tensorflow/tfjs/dist/index.js";import{GraphModel as o5}from"@tensorflow/tfjs-converter/dist/index";var Lo="3.19.0",Wo="3.19.0",Fo="3.19.0",Go="3.19.0",Bo="3.19.0",Ho="3.19.0",Vo="3.19.0",Qe={tfjs:Lo,"tfjs-core":Wo,"tfjs-data":Fo,"tfjs-layers":Go,"tfjs-converter":Bo,"tfjs-backend-webgl":Ho,"tfjs-backend-wasm":Vo};var H1=` precision highp float; attribute vec2 pos; attribute vec2 uv; @@ -271,8 +14,7 @@ var vertexIdentity = ` vUv = uv; gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.); } -`; -var colorMatrixWithAlpha = ` +`;var V1=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -284,8 +26,7 @@ var colorMatrixWithAlpha = ` 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]; } -`; -var colorMatrixWithoutAlpha = ` +`,D1=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -297,8 +38,7 @@ var colorMatrixWithoutAlpha = ` gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14]; gl_FragColor.a = c.a; } -`; -var pixelate = ` +`,Z1=` precision highp float; varying vec2 vUv; uniform vec2 size; @@ -311,8 +51,7 @@ var pixelate = ` vec2 coord = pixelate(vUv, size); gl_FragColor += texture2D(texture, coord); } -`; -var blur = ` +`,X1=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -335,8 +74,7 @@ var blur = ` 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; } -`; -var convolution = ` +`,q1=` precision highp float; varying vec2 vUv; uniform sampler2D texture; @@ -358,12981 +96,19 @@ var convolution = ` c31 * m[6] + c32 * m[7] + c33 * m[8]; gl_FragColor.a = c22.a; } -`; - -// src/image/imagefx.ts -var collect = (source, prefix, collection) => { - const r = new RegExp("\\b" + prefix + " \\w+ (\\w+)", "ig"); - source.replace(r, (match3, name) => { - collection[name] = 0; - return match3; - }); -}; -var GLProgram = class { - constructor(gl, vertexSource, fragmentSource) { - __publicField(this, "uniform", {}); - __publicField(this, "attribute", {}); - __publicField(this, "gl"); - __publicField(this, "id"); - __publicField(this, "compile", (source, type) => { - const shader = this.gl.createShader(type); - if (!shader) { - log("filter: could not create shader"); - return null; - } - this.gl.shaderSource(shader, source); - this.gl.compileShader(shader); - if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) { - log(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader)}`); - return null; - } - return shader; - }); - this.gl = gl; - const vertexShader = this.compile(vertexSource, this.gl.VERTEX_SHADER); - const fragmentShader = this.compile(fragmentSource, this.gl.FRAGMENT_SHADER); - this.id = this.gl.createProgram(); - if (!vertexShader || !fragmentShader) - return; - if (!this.id) { - log("filter: could not create webgl program"); - return; - } - this.gl.attachShader(this.id, vertexShader); - this.gl.attachShader(this.id, fragmentShader); - this.gl.linkProgram(this.id); - if (!this.gl.getProgramParameter(this.id, this.gl.LINK_STATUS)) { - log(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`); - return; - } - this.gl.useProgram(this.id); - collect(vertexSource, "attribute", this.attribute); - for (const a in this.attribute) - this.attribute[a] = this.gl.getAttribLocation(this.id, a); - collect(vertexSource, "uniform", this.uniform); - collect(fragmentSource, "uniform", this.uniform); - for (const u in this.uniform) - this.uniform[u] = this.gl.getUniformLocation(this.id, u); - } -}; -function GLImageFilter() { - let drawCount = 0; - let sourceTexture = null; - let lastInChain = false; - let currentFramebufferIndex = -1; - let tempFramebuffers = [null, null]; - let filterChain = []; - let vertexBuffer = null; - let currentProgram = null; - const fxcanvas = canvas(100, 100); - const shaderProgramCache = {}; - const DRAW = { INTERMEDIATE: 1 }; - const gl = fxcanvas.getContext("webgl"); - if (!gl) { - log("filter: cannot get webgl context"); - return; - } - this.gl = gl; - function resize(width, height) { - if (width === fxcanvas.width && height === fxcanvas.height) - return; - fxcanvas.width = width; - fxcanvas.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, fxcanvas.width, fxcanvas.height); - tempFramebuffers = [null, null]; - } - function createFramebufferTexture(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 }; - } - function getTempFramebuffer(index2) { - tempFramebuffers[index2] = tempFramebuffers[index2] || createFramebufferTexture(fxcanvas.width, fxcanvas.height); - return tempFramebuffers[index2]; - } - function draw(flags = 0) { - if (!currentProgram) - return; - let source = null; - let target = null; - let flipY = false; - if (drawCount === 0) - source = sourceTexture; - else - source = getTempFramebuffer(currentFramebufferIndex).texture || null; - drawCount++; - if (lastInChain && !(flags & DRAW.INTERMEDIATE)) { - target = null; - flipY = drawCount % 2 === 0; - } else { - currentFramebufferIndex = (currentFramebufferIndex + 1) % 2; - target = getTempFramebuffer(currentFramebufferIndex).fbo || null; - } - 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); - } - function compileShader(fragmentSource) { - if (shaderProgramCache[fragmentSource]) { - currentProgram = shaderProgramCache[fragmentSource]; - gl.useProgram((currentProgram ? currentProgram.id : null) || null); - return currentProgram; - } - currentProgram = new GLProgram(gl, vertexIdentity, fragmentSource); - if (!currentProgram) { - log("filter: could not get webgl program"); - return null; - } - 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; - } - const filter = { - colorMatrix: (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 ? colorMatrixWithoutAlpha : colorMatrixWithAlpha; - const program = compileShader(shader); - if (!program) - return; - gl.uniform1fv(program.uniform["m"], m); - draw(); - }, - brightness: (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 - ]); - }, - saturation: (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 - ]); - }, - desaturate: () => { - filter.saturation(-1); - }, - contrast: (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 - ]); - }, - negative: () => { - filter.contrast(-2); - }, - hue: (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 - ]); - }, - desaturateLuminance: () => { - 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 - ]); - }, - sepia: () => { - 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 - ]); - }, - brownie: () => { - 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 - ]); - }, - vintagePinhole: () => { - 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 - ]); - }, - kodachrome: () => { - 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 - ]); - }, - technicolor: () => { - 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 - ]); - }, - polaroid: () => { - 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 - ]); - }, - shiftToBGR: () => { - filter.colorMatrix([ - 0, - 0, - 1, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ]); - }, - convolution: (matrix) => { - const m = new Float32Array(matrix); - const pixelSizeX = 1 / fxcanvas.width; - const pixelSizeY = 1 / fxcanvas.height; - const program = compileShader(convolution); - if (!program) - return; - gl.uniform1fv(program.uniform["m"], m); - gl.uniform2f(program.uniform["px"], pixelSizeX, pixelSizeY); - draw(); - }, - detectEdges: () => { - filter.convolution.call(this, [ - 0, - 1, - 0, - 1, - -4, - 1, - 0, - 1, - 0 - ]); - }, - sobelX: () => { - filter.convolution.call(this, [ - -1, - 0, - 1, - -2, - 0, - 2, - -1, - 0, - 1 - ]); - }, - sobelY: () => { - filter.convolution.call(this, [ - -1, - -2, - -1, - 0, - 0, - 0, - 1, - 2, - 1 - ]); - }, - sharpen: (amount) => { - const a = amount || 1; - filter.convolution.call(this, [ - 0, - -1 * a, - 0, - -1 * a, - 1 + 4 * a, - -1 * a, - 0, - -1 * a, - 0 - ]); - }, - emboss: (size2) => { - const s = size2 || 1; - filter.convolution.call(this, [ - -2 * s, - -1 * s, - 0, - -1 * s, - 1, - 1 * s, - 0, - 1 * s, - 2 * s - ]); - }, - blur: (size2) => { - const blurSizeX = size2 / 7 / fxcanvas.width; - const blurSizeY = size2 / 7 / fxcanvas.height; - const program = compileShader(blur); - if (!program) - return; - gl.uniform2f(program.uniform["px"], 0, blurSizeY); - draw(DRAW.INTERMEDIATE); - gl.uniform2f(program.uniform["px"], blurSizeX, 0); - draw(); - }, - pixelate: (size2) => { - const blurSizeX = size2 / fxcanvas.width; - const blurSizeY = size2 / fxcanvas.height; - const program = compileShader(pixelate); - if (!program) - return; - gl.uniform2f(program.uniform["size"], blurSizeX, blurSizeY); - draw(); - } - }; - this.add = function(name) { - const args = Array.prototype.slice.call(arguments, 1); - const func = filter[name]; - filterChain.push({ func, args }); - }; - this.reset = function() { - filterChain = []; - }; - this.get = function() { - return filterChain; - }; - this.apply = function(image25) { - resize(image25.width, image25.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, image25); - for (let i = 0; i < filterChain.length; i++) { - lastInChain = i === filterChain.length - 1; - const f = filterChain[i]; - f.func.apply(this, f.args || []); - } - return fxcanvas; - }; - this.draw = function(image25) { - this.add("brightness", 0); - return this.apply(image25); - }; -} - -// src/image/enhance.ts -async function histogramEqualization(inputImage) { - const squeeze12 = inputImage.shape.length === 4 ? tfjs_esm_exports.squeeze(inputImage) : inputImage; - const channels = tfjs_esm_exports.split(squeeze12, 3, 2); - const min2 = [tfjs_esm_exports.min(channels[0]), tfjs_esm_exports.min(channels[1]), tfjs_esm_exports.min(channels[2])]; - const max4 = [tfjs_esm_exports.max(channels[0]), tfjs_esm_exports.max(channels[1]), tfjs_esm_exports.max(channels[2])]; - const absMax = await Promise.all(max4.map((channel) => channel.data())); - const maxValue = 0.99 * Math.max(absMax[0][0], absMax[1][0], absMax[2][0]); - const sub11 = [tfjs_esm_exports.sub(channels[0], min2[0]), tfjs_esm_exports.sub(channels[1], min2[1]), tfjs_esm_exports.sub(channels[2], min2[2])]; - const range = [tfjs_esm_exports.sub(max4[0], min2[0]), tfjs_esm_exports.sub(max4[1], min2[1]), tfjs_esm_exports.sub(max4[2], min2[2])]; - const fact = [tfjs_esm_exports.div(maxValue, range[0]), tfjs_esm_exports.div(maxValue, range[1]), tfjs_esm_exports.div(maxValue, range[2])]; - const enh = [tfjs_esm_exports.mul(sub11[0], fact[0]), tfjs_esm_exports.mul(sub11[1], fact[1]), tfjs_esm_exports.mul(sub11[2], fact[2])]; - const rgb2 = tfjs_esm_exports.stack([enh[0], enh[1], enh[2]], 2); - const reshape8 = tfjs_esm_exports.reshape(rgb2, [1, squeeze12.shape[0], squeeze12.shape[1], 3]); - tfjs_esm_exports.dispose([...channels, ...min2, ...max4, ...sub11, ...range, ...fact, ...enh, rgb2, squeeze12]); - return reshape8; -} - -// src/image/image.ts -var maxSize = 3840; -var inCanvas = null; -var outCanvas = null; -var tmpCanvas = null; -var fx; -var last = { - inputSum: 0, - cacheDiff: 1, - sumMethod: 0, - inputTensor: void 0 -}; -function canvas(width, height) { - let c; - if (env.browser) { - if (env.worker) { - if (typeof OffscreenCanvas === "undefined") - throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported"); - c = new OffscreenCanvas(width, height); - } else { - if (typeof document === "undefined") - throw new Error("canvas error: attempted to run in browser but DOM is not defined"); - c = document.createElement("canvas"); - c.width = width; - c.height = height; - } - } else { - if (typeof env.Canvas !== "undefined") - c = new env.Canvas(width, height); - else if (typeof globalThis.Canvas !== "undefined") - c = new globalThis.Canvas(width, height); - } - return c; -} -function copy(input, output) { - const outputCanvas = output || canvas(input.width, input.height); - const ctx = outputCanvas.getContext("2d"); - ctx.drawImage(input, 0, 0); - return outputCanvas; -} -async function process2(input, config3, getTensor = true) { - if (!input) { - if (config3.debug) - log("input error: input is missing"); - return { tensor: null, canvas: null }; - } - if (!(input instanceof Tensor) && !(typeof Image !== "undefined" && input instanceof Image) && !(typeof env.Canvas !== "undefined" && input instanceof env.Canvas) && !(typeof globalThis.Canvas !== "undefined" && input instanceof globalThis.Canvas) && !(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("input error: type is not recognized"); - } - if (input instanceof Tensor) { - let tensor3 = null; - if (input["isDisposedInternal"]) - throw new Error("input error: attempted to use tensor but it is disposed"); - if (!input["shape"]) - throw new Error("input error: attempted to use tensor without a shape"); - if (input.shape.length === 3) { - if (input.shape[2] === 3) { - tensor3 = tfjs_esm_exports.expandDims(input, 0); - } else if (input.shape[2] === 4) { - const rgb2 = tfjs_esm_exports.slice3d(input, [0, 0, 0], [-1, -1, 3]); - tensor3 = tfjs_esm_exports.expandDims(rgb2, 0); - tfjs_esm_exports.dispose(rgb2); - } - } else if (input.shape.length === 4) { - if (input.shape[3] === 3) { - tensor3 = tfjs_esm_exports.clone(input); - } else if (input.shape[3] === 4) { - tensor3 = tfjs_esm_exports.slice4d(input, [0, 0, 0, 0], [-1, -1, -1, 3]); - } - } - if (tensor3 == null || tensor3.shape.length !== 4 || tensor3.shape[0] !== 1 || tensor3.shape[3] !== 3) - throw new Error(`input error: attempted to use tensor with unrecognized shape: ${input["shape"]}`); - if (tensor3.dtype === "int32") { - const cast5 = tfjs_esm_exports.cast(tensor3, "float32"); - tfjs_esm_exports.dispose(tensor3); - tensor3 = cast5; - } - return { tensor: tensor3, canvas: config3.filter.return ? outCanvas : null }; - } else { - if (typeof input["readyState"] !== "undefined" && input["readyState"] <= 2) { - if (config3.debug) - log("input stream is not ready"); - return { tensor: null, canvas: inCanvas }; - } - 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) { - if (config3.debug) - log("cannot determine input dimensions"); - return { tensor: null, canvas: inCanvas }; - } - let targetWidth = originalWidth; - let targetHeight = originalHeight; - if (targetWidth > maxSize) { - targetWidth = maxSize; - targetHeight = Math.trunc(targetWidth * originalHeight / originalWidth); - } - if (targetHeight > maxSize) { - targetHeight = maxSize; - targetWidth = Math.trunc(targetHeight * originalWidth / originalHeight); - } - if ((config3.filter.width || 0) > 0) - targetWidth = config3.filter.width; - else if ((config3.filter.height || 0) > 0) - targetWidth = originalWidth * ((config3.filter.height || 0) / originalHeight); - if ((config3.filter.height || 0) > 0) - targetHeight = config3.filter.height; - else if ((config3.filter.width || 0) > 0) - targetHeight = originalHeight * ((config3.filter.width || 0) / originalWidth); - if (!targetWidth || !targetHeight) - throw new Error("input error: cannot determine dimension"); - if (!inCanvas || (inCanvas == null ? void 0 : inCanvas.width) !== targetWidth || (inCanvas == null ? void 0 : inCanvas.height) !== targetHeight) - inCanvas = canvas(targetWidth, targetHeight); - const inCtx = inCanvas.getContext("2d"); - if (typeof ImageData !== "undefined" && input instanceof ImageData) { - inCtx.putImageData(input, 0, 0); - } else { - if (config3.filter.flip && typeof inCtx.translate !== "undefined") { - inCtx.translate(originalWidth, 0); - inCtx.scale(-1, 1); - inCtx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height); - inCtx.setTransform(1, 0, 0, 1, 0, 0); - } else { - inCtx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height); - } - } - if (!outCanvas || inCanvas.width !== outCanvas.width || (inCanvas == null ? void 0 : inCanvas.height) !== (outCanvas == null ? void 0 : outCanvas.height)) - outCanvas = canvas(inCanvas.width, inCanvas.height); - if (config3.filter.enabled && env.webgl.supported) { - if (!fx) - fx = env.browser ? new GLImageFilter() : null; - env.filter = !!fx; - if (!fx || !fx.add) { - if (config3.debug) - log("input process error: cannot initialize filters"); - env.webgl.supported = false; - config3.filter.enabled = false; - copy(inCanvas, outCanvas); - } else { - fx.reset(); - if (config3.filter.brightness !== 0) - fx.add("brightness", config3.filter.brightness); - if (config3.filter.contrast !== 0) - fx.add("contrast", config3.filter.contrast); - if (config3.filter.sharpness !== 0) - fx.add("sharpen", config3.filter.sharpness); - if (config3.filter.blur !== 0) - fx.add("blur", config3.filter.blur); - if (config3.filter.saturation !== 0) - fx.add("saturation", config3.filter.saturation); - if (config3.filter.hue !== 0) - fx.add("hue", config3.filter.hue); - if (config3.filter.negative) - fx.add("negative"); - if (config3.filter.sepia) - fx.add("sepia"); - if (config3.filter.vintage) - fx.add("brownie"); - if (config3.filter.sepia) - fx.add("sepia"); - if (config3.filter.kodachrome) - fx.add("kodachrome"); - if (config3.filter.technicolor) - fx.add("technicolor"); - if (config3.filter.polaroid) - fx.add("polaroid"); - if (config3.filter.pixelate !== 0) - fx.add("pixelate", config3.filter.pixelate); - if (fx.get() > 0) - outCanvas = fx.apply(inCanvas); - else - outCanvas = fx.draw(inCanvas); - } - } else { - copy(inCanvas, outCanvas); - if (fx) - fx = null; - env.filter = !!fx; - } - if (!getTensor) - return { tensor: null, canvas: outCanvas }; - if (!outCanvas) - throw new Error("canvas error: cannot create output"); - let pixels; - let depth = 3; - if (typeof ImageData !== "undefined" && input instanceof ImageData || input["data"] && input["width"] && input["height"]) { - if (env.browser && tfjs_esm_exports.browser) { - pixels = tfjs_esm_exports.browser ? tfjs_esm_exports.browser.fromPixels(input) : null; - } else { - depth = input["data"].length / input["height"] / input["width"]; - const arr = new Uint8Array(input["data"]["buffer"]); - pixels = tfjs_esm_exports.tensor(arr, [input["height"], input["width"], depth], "int32"); - } - } else { - if (!tmpCanvas || outCanvas.width !== tmpCanvas.width || outCanvas.height !== tmpCanvas.height) - tmpCanvas = canvas(outCanvas.width, outCanvas.height); - if (tfjs_esm_exports.browser && env.browser) { - if (config3.backend === "webgl" || config3.backend === "humangl" || config3.backend === "webgpu") { - pixels = tfjs_esm_exports.browser.fromPixels(outCanvas); - } else { - tmpCanvas = copy(outCanvas); - pixels = tfjs_esm_exports.browser.fromPixels(tmpCanvas); - } - } else { - const tempCanvas = copy(outCanvas); - const tempCtx = tempCanvas.getContext("2d"); - const tempData = tempCtx.getImageData(0, 0, targetWidth, targetHeight); - depth = tempData.data.length / targetWidth / targetHeight; - const arr = new Uint8Array(tempData.data.buffer); - pixels = tfjs_esm_exports.tensor(arr, [targetWidth, targetHeight, depth]); - } - } - if (depth === 4) { - const rgb2 = tfjs_esm_exports.slice3d(pixels, [0, 0, 0], [-1, -1, 3]); - tfjs_esm_exports.dispose(pixels); - pixels = rgb2; - } - if (!pixels) - throw new Error("input error: cannot create tensor"); - const casted = tfjs_esm_exports.cast(pixels, "float32"); - const tensor3 = config3.filter.equalization ? await histogramEqualization(casted) : tfjs_esm_exports.expandDims(casted, 0); - tfjs_esm_exports.dispose([pixels, casted]); - return { tensor: tensor3, canvas: config3.filter.return ? outCanvas : null }; - } -} -async function skip(config3, input) { - let skipFrame = false; - if (config3.cacheSensitivity === 0 || !input.shape || input.shape.length !== 4 || input.shape[1] > 2048 || input.shape[2] > 2048) - return skipFrame; - if (!last.inputTensor) { - last.inputTensor = tfjs_esm_exports.clone(input); - } else if (last.inputTensor.shape[1] !== input.shape[1] || last.inputTensor.shape[2] !== input.shape[2]) { - tfjs_esm_exports.dispose(last.inputTensor); - last.inputTensor = tfjs_esm_exports.clone(input); - } else { - const t = {}; - t.diff = tfjs_esm_exports.sub(input, last.inputTensor); - t.squared = tfjs_esm_exports.mul(t.diff, t.diff); - t.sum = tfjs_esm_exports.sum(t.squared); - const diffSum = await t.sum.data(); - const diffRelative = diffSum[0] / (input.shape[1] || 1) / (input.shape[2] || 1) / 255 / 3; - tfjs_esm_exports.dispose([last.inputTensor, t.diff, t.squared, t.sum]); - last.inputTensor = tfjs_esm_exports.clone(input); - skipFrame = diffRelative <= (config3.cacheSensitivity || 0); - } - return skipFrame; -} -async function compare(config3, input1, input2) { - const t = {}; - if (!input1 || !input2 || input1.shape.length !== 4 || input1.shape.length !== input2.shape.length) { - if (!config3.debug) - log("invalid input tensor or tensor shapes do not match:", input1.shape, input2.shape); - return 0; - } - if (input1.shape[0] !== 1 || input2.shape[0] !== 1 || input1.shape[3] !== 3 || input2.shape[3] !== 3) { - if (!config3.debug) - log("input tensors must be of shape [1, height, width, 3]:", input1.shape, input2.shape); - return 0; - } - t.input1 = tfjs_esm_exports.clone(input1); - t.input2 = input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2] ? tfjs_esm_exports.image.resizeBilinear(input2, [input1.shape[1], input1.shape[2]]) : tfjs_esm_exports.clone(input2); - t.diff = tfjs_esm_exports.sub(t.input1, t.input2); - t.squared = tfjs_esm_exports.mul(t.diff, t.diff); - t.sum = tfjs_esm_exports.sum(t.squared); - const diffSum = await t.sum.data(); - const diffRelative = diffSum[0] / (input1.shape[1] || 1) / (input1.shape[2] || 1) / 255 / 3; - tfjs_esm_exports.dispose([t.input1, t.input2, t.diff, t.squared, t.sum]); - return diffRelative; -} - -// src/util/env.ts -var Env = class { - constructor() { - __publicField(this, "browser"); - __publicField(this, "node"); - __publicField(this, "worker"); - __publicField(this, "platform", ""); - __publicField(this, "agent", ""); - __publicField(this, "backends", []); - __publicField(this, "initial"); - __publicField(this, "filter"); - __publicField(this, "tfjs"); - __publicField(this, "offscreen"); - __publicField(this, "perfadd", false); - __publicField(this, "wasm", { - supported: void 0, - backend: void 0, - simd: void 0, - multithread: void 0 - }); - __publicField(this, "webgl", { - supported: void 0, - backend: void 0, - version: void 0, - renderer: void 0 - }); - __publicField(this, "webgpu", { - supported: void 0, - backend: void 0, - adapter: void 0 - }); - __publicField(this, "cpu", { - model: void 0, - flags: [] - }); - __publicField(this, "kernels", []); - __publicField(this, "Canvas"); - __publicField(this, "Image"); - __publicField(this, "ImageData"); - this.browser = typeof navigator !== "undefined"; - this.node = typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"; - this.tfjs = { version: version8["tfjs-core"] }; - this.offscreen = typeof OffscreenCanvas !== "undefined"; - this.initial = true; - this.worker = this.browser && this.offscreen ? typeof WorkerGlobalScope !== "undefined" : void 0; - if (typeof navigator !== "undefined") { - const raw = navigator.userAgent.match(/\(([^()]+)\)/g); - if (raw && raw[0]) { - const platformMatch = raw[0].match(/\(([^()]+)\)/g); - this.platform = platformMatch && platformMatch[0] ? platformMatch[0].replace(/\(|\)/g, "") : ""; - this.agent = navigator.userAgent.replace(raw[0], ""); - if (this.platform[1]) - this.agent = this.agent.replace(raw[1], ""); - this.agent = this.agent.replace(/ /g, " "); - } - } else if (typeof process !== "undefined") { - this.platform = `${process.platform} ${process.arch}`; - this.agent = `NodeJS ${process.version}`; - } - } - async updateBackend() { - this.backends = Object.keys(tfjs_esm_exports.engine().registryFactory); - this.wasm.supported = typeof WebAssembly !== "undefined"; - this.wasm.backend = this.backends.includes("wasm"); - if (this.wasm.supported && this.wasm.backend && tfjs_esm_exports.getBackend() === "wasm") { - this.wasm.simd = tfjs_esm_exports.env().get("WASM_HAS_SIMD_SUPPORT"); - this.wasm.multithread = tfjs_esm_exports.env().get("WASM_HAS_MULTITHREAD_SUPPORT"); - } - const c = canvas(100, 100); - const ctx = c ? c.getContext("webgl2") : void 0; - this.webgl.supported = typeof ctx !== "undefined"; - this.webgl.backend = this.backends.includes("webgl"); - if (this.webgl.supported && this.webgl.backend && (tfjs_esm_exports.getBackend() === "webgl" || tfjs_esm_exports.getBackend() === "humangl")) { - const gl = tfjs_esm_exports.backend().gpgpu !== "undefined" ? await tfjs_esm_exports.backend().getGPGPUContext().gl : null; - if (gl) { - this.webgl.version = gl.getParameter(gl.VERSION); - this.webgl.renderer = gl.getParameter(gl.RENDERER); - } - } - this.webgpu.supported = this.browser && typeof navigator["gpu"] !== "undefined"; - this.webgpu.backend = this.backends.includes("webgpu"); - try { - if (this.webgpu.supported) - this.webgpu.adapter = (await navigator["gpu"].requestAdapter()).name; - } catch (e) { - this.webgpu.supported = false; - } - try { - this.kernels = tfjs_esm_exports.getKernelsForBackend(tfjs_esm_exports.getBackend()).map((kernel) => kernel.kernelName.toLowerCase()); - } catch (e) { - } - } - updateCPU() { - const cpu = { model: "", flags: [] }; - if (this.node && this.platform.startsWith("linux")) { - } - if (!this["cpu"]) - Object.defineProperty(this, "cpu", { value: cpu }); - else - this["cpu"] = cpu; - } -}; -var env = new Env(); - -// models/models.json -var models_exports = {}; -__export(models_exports, { - age: () => age, - antispoof: () => antispoof, - blazeface: () => blazeface, - "blazeface-back": () => blazeface_back, - "blazeface-front": () => blazeface_front, - "blazepose-detector2d": () => blazepose_detector2d, - "blazepose-detector3d": () => blazepose_detector3d, - "blazepose-full": () => blazepose_full, - "blazepose-heavy": () => blazepose_heavy, - "blazepose-lite": () => blazepose_lite, - default: () => models_default, - efficientpose: () => efficientpose, - emotion: () => emotion, - faceboxes: () => faceboxes, - facemesh: () => facemesh, - "facemesh-attention": () => facemesh_attention, - "facemesh-attention-alt": () => facemesh_attention_alt, - "facemesh-detection-full": () => facemesh_detection_full, - "facemesh-detection-short": () => facemesh_detection_short, - "facemesh-orig": () => facemesh_orig, - faceres: () => faceres, - "faceres-deep": () => faceres_deep, - gear: () => gear, - gender: () => gender, - "gender-ssrnet-imdb": () => gender_ssrnet_imdb, - handdetect: () => handdetect, - "handlandmark-full": () => handlandmark_full, - "handlandmark-lite": () => handlandmark_lite, - "handlandmark-sparse": () => handlandmark_sparse, - handskeleton: () => handskeleton, - handtrack: () => handtrack, - iris: () => iris, - liveness: () => liveness, - "mb3-centernet": () => mb3_centernet, - meet: () => meet, - mobileface: () => mobileface, - mobilefacenet: () => mobilefacenet, - "movenet-lightning": () => movenet_lightning, - "movenet-multipose": () => movenet_multipose, - "movenet-thunder": () => movenet_thunder, - nanodet: () => nanodet, - posenet: () => posenet, - selfie: () => selfie -}); -var age = 161240; -var antispoof = 853098; -var blazeface_back = 538928; -var blazeface_front = 402048; -var blazeface = 538928; -var blazepose_detector2d = 7499400; -var blazepose_detector3d = 5928856; -var blazepose_full = 6338290; -var blazepose_heavy = 27501554; -var blazepose_lite = 2725490; -var efficientpose = 5651240; -var emotion = 820516; -var faceboxes = 2013002; -var facemesh_attention_alt = 2387598; -var facemesh_attention = 2382414; -var facemesh_detection_full = 1026192; -var facemesh_detection_short = 201268; -var facemesh_orig = 2955780; -var facemesh = 1477958; -var faceres_deep = 13957620; -var faceres = 6978814; -var gear = 1498916; -var gender_ssrnet_imdb = 161236; -var gender = 201808; -var handdetect = 3515612; -var handlandmark_full = 5431368; -var handlandmark_lite = 2023432; -var handlandmark_sparse = 5286322; -var handskeleton = 5502280; -var handtrack = 2964837; -var iris = 2599092; -var liveness = 592976; -var mb3_centernet = 4030290; -var meet = 372228; -var mobileface = 2183192; -var mobilefacenet = 5171976; -var movenet_lightning = 4650216; -var movenet_multipose = 9448838; -var movenet_thunder = 12477112; -var nanodet = 7574558; -var posenet = 5032780; -var selfie = 212886; -var models_default = { - age, - antispoof, - "blazeface-back": blazeface_back, - "blazeface-front": blazeface_front, - blazeface, - "blazepose-detector2d": blazepose_detector2d, - "blazepose-detector3d": blazepose_detector3d, - "blazepose-full": blazepose_full, - "blazepose-heavy": blazepose_heavy, - "blazepose-lite": blazepose_lite, - efficientpose, - emotion, - faceboxes, - "facemesh-attention-alt": facemesh_attention_alt, - "facemesh-attention": facemesh_attention, - "facemesh-detection-full": facemesh_detection_full, - "facemesh-detection-short": facemesh_detection_short, - "facemesh-orig": facemesh_orig, - facemesh, - "faceres-deep": faceres_deep, - faceres, - gear, - "gender-ssrnet-imdb": gender_ssrnet_imdb, - gender, - handdetect, - "handlandmark-full": handlandmark_full, - "handlandmark-lite": handlandmark_lite, - "handlandmark-sparse": handlandmark_sparse, - handskeleton, - handtrack, - iris, - liveness, - "mb3-centernet": mb3_centernet, - meet, - mobileface, - mobilefacenet, - "movenet-lightning": movenet_lightning, - "movenet-multipose": movenet_multipose, - "movenet-thunder": movenet_thunder, - nanodet, - posenet, - selfie -}; - -// src/models.ts -var models_exports2 = {}; -__export(models_exports2, { - Models: () => Models, - getModelStats: () => getModelStats, - load: () => load20, - reset: () => reset, - validate: () => validate2, - validateModel: () => validateModel -}); - -// src/gear/gear.ts -var model; -var last2 = []; -var raceNames = ["white", "black", "asian", "indian", "other"]; -var ageWeights = [15, 23, 28, 35.5, 45.5, 55.5, 65]; -var lastCount = 0; -var lastTime = 0; -var skipped = Number.MAX_SAFE_INTEGER; -async function load(config3) { - var _a; - if (env.initial) - model = null; - if (!model) - model = await loadModel((_a = config3.face["gear"]) == null ? void 0 : _a.modelPath); - else if (config3.debug) - log("cached model:", model["modelUrl"]); - return model; -} -async function predict(image25, config3, idx, count2) { - var _a, _b; - if (!model) - return { age: 0, gender: "unknown", genderScore: 0, race: [] }; - const skipFrame = skipped < (((_a = config3.face["gear"]) == null ? void 0 : _a.skipFrames) || 0); - const skipTime = (((_b = config3.face["gear"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime; - if (config3.skipAllowed && skipTime && skipFrame && lastCount === count2 && last2[idx]) { - skipped++; - return last2[idx]; - } - skipped = 0; - return new Promise(async (resolve) => { - var _a2, _b2; - if (!(model == null ? void 0 : model.inputs[0].shape)) - return; - const t = {}; - const box = [[0, 0.1, 0.9, 0.9]]; - t.resize = tfjs_esm_exports.image.cropAndResize(image25, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]); - const obj = { age: 0, gender: "unknown", genderScore: 0, race: [] }; - if ((_a2 = config3.face["gear"]) == null ? void 0 : _a2.enabled) - [t.age, t.gender, t.race] = model.execute(t.resize, ["age_output", "gender_output", "race_output"]); - const gender2 = await t.gender.data(); - obj.gender = gender2[0] > gender2[1] ? "male" : "female"; - obj.genderScore = Math.round(100 * (gender2[0] > gender2[1] ? gender2[0] : gender2[1])) / 100; - const race = await t.race.data(); - for (let i = 0; i < race.length; i++) { - if (race[i] > (((_b2 = config3.face["gear"]) == null ? void 0 : _b2.minConfidence) || 0.2)) - obj.race.push({ score: Math.round(100 * race[i]) / 100, race: raceNames[i] }); - } - obj.race.sort((a, b) => b.score - a.score); - const ageDistribution = Array.from(await t.age.data()); - const ageSorted = ageDistribution.map((a, i) => [ageWeights[i], a]).sort((a, b) => b[1] - a[1]); - let age2 = ageSorted[0][0]; - for (let i = 1; i < ageSorted.length; i++) - age2 += ageSorted[i][1] * (ageSorted[i][0] - age2); - obj.age = Math.round(10 * age2) / 10; - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - last2[idx] = obj; - lastCount = count2; - lastTime = now(); - resolve(obj); - }); -} - -// src/tfjs/constants.ts -var constants = { - tf255: 255, - tf1: 1, - tf2: 2, - tf05: 0.5, - tf127: 127.5, - rgb: [0.2989, 0.587, 0.114] -}; -function init() { - constants.tf255 = tfjs_esm_exports.scalar(255, "float32"); - constants.tf1 = tfjs_esm_exports.scalar(1, "float32"); - constants.tf2 = tfjs_esm_exports.scalar(2, "float32"); - constants.tf05 = tfjs_esm_exports.scalar(0.5, "float32"); - constants.tf127 = tfjs_esm_exports.scalar(127.5, "float32"); - constants.rgb = tfjs_esm_exports.tensor1d([0.2989, 0.587, 0.114], "float32"); -} - -// src/gear/ssrnet-age.ts -var model2; -var last3 = []; -var lastCount2 = 0; -var lastTime2 = 0; -var skipped2 = Number.MAX_SAFE_INTEGER; -async function load2(config3) { - if (env.initial) - model2 = null; - if (!model2) - model2 = await loadModel(config3.face["ssrnet"].modelPathAge); - else if (config3.debug) - log("cached model:", model2["modelUrl"]); - return model2; -} -async function predict2(image25, config3, idx, count2) { - var _a, _b, _c, _d; - if (!model2) - return { age: 0 }; - const skipFrame = skipped2 < (((_a = config3.face["ssrnet"]) == null ? void 0 : _a.skipFrames) || 0); - const skipTime = (((_b = config3.face["ssrnet"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime2; - if (config3.skipAllowed && skipFrame && skipTime && lastCount2 === count2 && ((_c = last3[idx]) == null ? void 0 : _c.age) && ((_d = last3[idx]) == null ? void 0 : _d.age) > 0) { - skipped2++; - return last3[idx]; - } - skipped2 = 0; - return new Promise(async (resolve) => { - if (!(model2 == null ? void 0 : model2.inputs) || !model2.inputs[0] || !model2.inputs[0].shape) - return; - const t = {}; - t.resize = tfjs_esm_exports.image.resizeBilinear(image25, [model2.inputs[0].shape[2], model2.inputs[0].shape[1]], false); - t.enhance = tfjs_esm_exports.mul(t.resize, constants.tf255); - const obj = { age: 0 }; - if (config3.face["ssrnet"].enabled) - t.age = model2.execute(t.enhance); - if (t.age) { - const data = await t.age.data(); - obj.age = Math.trunc(10 * data[0]) / 10; - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - last3[idx] = obj; - lastCount2 = count2; - lastTime2 = now(); - resolve(obj); - }); -} - -// src/gear/ssrnet-gender.ts -var model3; -var last4 = []; -var lastCount3 = 0; -var lastTime3 = 0; -var skipped3 = Number.MAX_SAFE_INTEGER; -var rgb = [0.2989, 0.587, 0.114]; -async function load3(config3) { - if (env.initial) - model3 = null; - if (!model3) - model3 = await loadModel(config3.face["ssrnet"].modelPathGender); - else if (config3.debug) - log("cached model:", model3["modelUrl"]); - return model3; -} -async function predict3(image25, config3, idx, count2) { - var _a, _b, _c, _d; - if (!model3) - return { gender: "unknown", genderScore: 0 }; - const skipFrame = skipped3 < (((_a = config3.face["ssrnet"]) == null ? void 0 : _a.skipFrames) || 0); - const skipTime = (((_b = config3.face["ssrnet"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime3; - if (config3.skipAllowed && skipFrame && skipTime && lastCount3 === count2 && ((_c = last4[idx]) == null ? void 0 : _c.gender) && ((_d = last4[idx]) == null ? void 0 : _d.genderScore) > 0) { - skipped3++; - return last4[idx]; - } - skipped3 = 0; - return new Promise(async (resolve) => { - if (!(model3 == null ? void 0 : model3.inputs[0].shape)) - return; - const t = {}; - t.resize = tfjs_esm_exports.image.resizeBilinear(image25, [model3.inputs[0].shape[2], model3.inputs[0].shape[1]], false); - t.enhance = tfjs_esm_exports.tidy(() => { - const [red, green, blue] = tfjs_esm_exports.split(t.resize, 3, 3); - 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]); - const grayscale = tfjs_esm_exports.addN([redNorm, greenNorm, blueNorm]); - const normalize = tfjs_esm_exports.mul(tfjs_esm_exports.sub(grayscale, constants.tf05), 2); - return normalize; - }); - const obj = { gender: "unknown", genderScore: 0 }; - if (config3.face["ssrnet"].enabled) - t.gender = model3.execute(t.enhance); - const data = await t.gender.data(); - obj.gender = data[0] > data[1] ? "female" : "male"; - obj.genderScore = data[0] > data[1] ? Math.trunc(100 * data[0]) / 100 : Math.trunc(100 * data[1]) / 100; - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - last4[idx] = obj; - lastCount3 = count2; - lastTime3 = now(); - resolve(obj); - }); -} - -// src/face/antispoof.ts -var model4; -var cached = []; -var skipped4 = Number.MAX_SAFE_INTEGER; -var lastCount4 = 0; -var lastTime4 = 0; -async function load4(config3) { - var _a; - if (env.initial) - model4 = null; - if (!model4) - model4 = await loadModel((_a = config3.face.antispoof) == null ? void 0 : _a.modelPath); - else if (config3.debug) - log("cached model:", model4["modelUrl"]); - return model4; -} -async function predict4(image25, config3, idx, count2) { - var _a, _b; - if (!model4) - return 0; - const skipTime = (((_a = config3.face.antispoof) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime4; - const skipFrame = skipped4 < (((_b = config3.face.antispoof) == null ? void 0 : _b.skipFrames) || 0); - if (config3.skipAllowed && skipTime && skipFrame && lastCount4 === count2 && cached[idx]) { - skipped4++; - return cached[idx]; - } - skipped4 = 0; - return new Promise(async (resolve) => { - const resize = tfjs_esm_exports.image.resizeBilinear(image25, [(model4 == null ? void 0 : model4.inputs[0].shape) ? model4.inputs[0].shape[2] : 0, (model4 == null ? void 0 : model4.inputs[0].shape) ? model4.inputs[0].shape[1] : 0], false); - const res = model4 == null ? void 0 : model4.execute(resize); - const num = (await res.data())[0]; - cached[idx] = Math.round(100 * num) / 100; - lastCount4 = count2; - lastTime4 = now(); - tfjs_esm_exports.dispose([resize, res]); - resolve(cached[idx]); - }); -} - -// src/face/facemeshcoords.ts -var meshAnnotations = { - 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: [185, 40, 39, 37, 0, 267, 269, 270, 409], - lipsLowerOuter: [61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291], - lipsUpperInner: [191, 80, 81, 82, 13, 312, 311, 310, 415], - lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], - lipsLowerSemiOuter: [76, 77, 90, 180, 85, 16, 315, 404, 320, 307, 306], - lipsUpperSemiOuter: [184, 74, 73, 72, 11, 302, 303, 304, 408], - lipsLowerSemiInner: [62, 96, 89, 179, 86, 15, 316, 403, 319, 325, 292], - lipsUpperSemiInner: [183, 42, 41, 38, 12, 268, 271, 272, 407], - 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 meshLandmarks = { - count: 468, - mouth: 13, - symmetryLine: [13, meshAnnotations["midwayBetweenEyes"][0]] -}; -var blazeFaceLandmarks = { - leftEye: 0, - rightEye: 1, - nose: 2, - mouth: 3, - leftEar: 4, - rightEar: 5, - symmetryLine: [3, 2] -}; -var irisIndices = [ - { key: "EyeUpper0", indices: [9, 10, 11, 12, 13, 14, 15] }, - { key: "EyeUpper1", indices: [25, 26, 27, 28, 29, 30, 31] }, - { key: "EyeUpper2", indices: [41, 42, 43, 44, 45, 46, 47] }, - { key: "EyeLower0", indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] }, - { key: "EyeLower1", indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] }, - { key: "EyeLower2", indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] }, - { key: "EyeLower3", indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] }, - { key: "EyebrowUpper", indices: [63, 64, 65, 66, 67, 68, 69, 70] }, - { key: "EyebrowLower", indices: [48, 49, 50, 51, 52, 53] } -]; -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]); -function connectionsToIndices(connections) { - const indices = connections.map((connection) => connection[0]); - indices.push(connections[connections.length - 1][1]); - return indices; -} -var pairsLips = [ - [61, 146], - [146, 91], - [91, 181], - [181, 84], - [84, 17], - [17, 314], - [314, 405], - [405, 321], - [321, 375], - [375, 291], - [61, 185], - [185, 40], - [40, 39], - [39, 37], - [37, 0], - [0, 267], - [267, 269], - [269, 270], - [270, 409], - [409, 291], - [78, 95], - [95, 88], - [88, 178], - [178, 87], - [87, 14], - [14, 317], - [317, 402], - [402, 318], - [318, 324], - [324, 308], - [78, 191], - [191, 80], - [80, 81], - [81, 82], - [82, 13], - [13, 312], - [312, 311], - [311, 310], - [310, 415], - [415, 308] -]; -var pairsLeftEye = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]]; -var pairsLeftEyebrow = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]]; -var pairsLeftIris = [[474, 475], [475, 476], [476, 477], [477, 474]]; -var pairsRightEye = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]]; -var pairsRightEyebrow = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]]; -var pairsRightIris = [[469, 470], [470, 471], [471, 472], [472, 469]]; -var pairsFaceContour = [ - [10, 338], - [338, 297], - [297, 332], - [332, 284], - [284, 251], - [251, 389], - [389, 356], - [356, 454], - [454, 323], - [323, 361], - [361, 288], - [288, 397], - [397, 365], - [365, 379], - [379, 378], - [378, 400], - [400, 377], - [377, 152], - [152, 148], - [148, 176], - [176, 149], - [149, 150], - [150, 136], - [136, 172], - [172, 58], - [58, 132], - [132, 93], - [93, 234], - [234, 127], - [127, 162], - [162, 21], - [21, 54], - [54, 103], - [103, 67], - [67, 109], - [109, 10] -]; -var contourKeypoints = { - lips: connectionsToIndices(pairsLips), - leftEye: connectionsToIndices(pairsLeftEye), - leftEyebrow: connectionsToIndices(pairsLeftEyebrow), - leftIris: connectionsToIndices(pairsLeftIris), - rightEye: connectionsToIndices(pairsRightEye), - rightEyebrow: connectionsToIndices(pairsRightEyebrow), - rightIris: connectionsToIndices(pairsRightIris), - faceOval: connectionsToIndices(pairsFaceContour) -}; - -// src/face/facemeshutil.ts -var getBoxSize = (box) => [Math.abs(box.endPoint[0] - box.startPoint[0]), Math.abs(box.endPoint[1] - box.startPoint[1])]; -var getBoxCenter = (box) => [box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2, 1]; -var clampBox = (box, input) => box ? [ - Math.trunc(Math.max(0, box.startPoint[0])), - Math.trunc(Math.max(0, box.startPoint[1])), - Math.trunc(Math.min(input.shape[2] || 0, box.endPoint[0]) - Math.max(0, box.startPoint[0])), - Math.trunc(Math.min(input.shape[1] || 0, box.endPoint[1]) - Math.max(0, box.startPoint[1])) -] : [0, 0, 0, 0]; -var getRawBox = (box, input) => box ? [ - box.startPoint[0] / (input.shape[2] || 0), - box.startPoint[1] / (input.shape[1] || 0), - (box.endPoint[0] - box.startPoint[0]) / (input.shape[2] || 0), - (box.endPoint[1] - box.startPoint[1]) / (input.shape[1] || 0) -] : [0, 0, 0, 0]; -var scaleBoxCoordinates = (box, factor) => { - const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]]; - const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]]; - return { startPoint, endPoint, landmarks: box.landmarks, confidence: box.confidence }; -}; -var cutAndResize = (box, image25, cropSize) => { - const h = image25.shape[1]; - const w = image25.shape[2]; - const cutBox = [box.startPoint[1] / h, box.startPoint[0] / w, box.endPoint[1] / h, box.endPoint[0] / w]; - const crop = tfjs_esm_exports.image.cropAndResize(image25, [cutBox], [0], cropSize); - const norm = tfjs_esm_exports.div(crop, constants.tf255); - tfjs_esm_exports.dispose(crop); - return norm; -}; -var enlargeBox = (box, factor) => { - const center = getBoxCenter(box); - const size2 = getBoxSize(box); - const halfSize = [factor * size2[0] / 2, factor * size2[1] / 2]; - return { startPoint: [center[0] - halfSize[0], center[1] - halfSize[1]], endPoint: [center[0] + halfSize[0], center[1] + halfSize[1]], landmarks: box.landmarks, confidence: box.confidence }; -}; -var squarifyBox = (box) => { - const centers = getBoxCenter(box); - const size2 = getBoxSize(box); - const halfSize = Math.max(...size2) / 2; - return { startPoint: [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)], endPoint: [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)], landmarks: box.landmarks, confidence: box.confidence }; -}; -var calculateLandmarksBoundingBox = (landmarks) => { - const x = landmarks.map((d) => d[0]); - const y = landmarks.map((d) => d[1]); - return { startPoint: [Math.min(...x), Math.min(...y)], endPoint: [Math.max(...x), Math.max(...y)], landmarks }; -}; -var fixedRotationMatrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; -var normalizeRadians = (angle) => angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); -var computeRotation = (point1, point2) => normalizeRadians(Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0])); -var buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]]; -var dot = (v1, v2) => { - let product = 0; - for (let i = 0; i < v1.length; i++) - product += v1[i] * v2[i]; - return product; -}; -var getColumnFrom2DArr = (arr, columnIndex) => { - const column = []; - for (let i = 0; i < arr.length; i++) - column.push(arr[i][columnIndex]); - return column; -}; -var multiplyTransformMatrices = (mat1, mat2) => { - const product = []; - const size2 = mat1.length; - for (let row = 0; row < size2; row++) { - product.push([]); - for (let col = 0; col < size2; col++) - product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col))); - } - return product; -}; -var 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); -}; -var 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]]; -}; -var rotatePoint = (homogeneousCoordinate, rotationMatrix) => [dot(homogeneousCoordinate, rotationMatrix[0]), dot(homogeneousCoordinate, rotationMatrix[1])]; -function generateAnchors(inputSize10) { - const spec = inputSize10 === 192 ? { strides: [4], anchors: [1] } : { strides: [inputSize10 / 16, inputSize10 / 8], anchors: [2, 6] }; - const anchors3 = []; - for (let i = 0; i < spec.strides.length; i++) { - const stride = spec.strides[i]; - const gridRows = Math.floor((inputSize10 + stride - 1) / stride); - const gridCols = Math.floor((inputSize10 + 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; -} -function transformRawCoords(coordsRaw, box, angle, rotationMatrix, inputSize10) { - const boxSize = getBoxSize(box); - const coordsScaled = coordsRaw.map((coord) => [ - boxSize[0] / inputSize10 * (coord[0] - inputSize10 / 2), - boxSize[1] / inputSize10 * (coord[1] - inputSize10 / 2), - coord[2] || 0 - ]); - const largeAngle = angle && angle !== 0 && Math.abs(angle) > 0.2; - const coordsRotationMatrix = largeAngle ? buildRotationMatrix(angle, [0, 0]) : fixedRotationMatrix; - const coordsRotated = largeAngle ? coordsScaled.map((coord) => [...rotatePoint(coord, coordsRotationMatrix), coord[2]]) : coordsScaled; - const inverseRotationMatrix = largeAngle ? invertTransformMatrix(rotationMatrix) : fixedRotationMatrix; - const boxCenter = getBoxCenter(box); - const offsets = [dot(boxCenter, inverseRotationMatrix[0]), dot(boxCenter, inverseRotationMatrix[1])]; - return coordsRotated.map((coord) => [ - Math.trunc(coord[0] + offsets[0]), - Math.trunc(coord[1] + offsets[1]), - Math.trunc(coord[2] || 0) - ]); -} -function correctFaceRotation(rotate, box, input, inputSize10) { - const symmetryLine = box.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; - let angle = 0; - let rotationMatrix = fixedRotationMatrix; - let face4; - if (rotate && env.kernels.includes("rotatewithoffset")) { - angle = computeRotation(box.landmarks[symmetryLine[0]], box.landmarks[symmetryLine[1]]); - const largeAngle = angle && angle !== 0 && Math.abs(angle) > 0.2; - if (largeAngle) { - const center = getBoxCenter(box); - const centerRaw = [center[0] / input.shape[2], center[1] / input.shape[1]]; - const rotated = tfjs_esm_exports.image.rotateWithOffset(input, angle, 0, centerRaw); - rotationMatrix = buildRotationMatrix(-angle, center); - face4 = cutAndResize(box, rotated, [inputSize10, inputSize10]); - tfjs_esm_exports.dispose(rotated); - } else { - face4 = cutAndResize(box, input, [inputSize10, inputSize10]); - } - } else { - face4 = cutAndResize(box, input, [inputSize10, inputSize10]); - } - return [angle, rotationMatrix, face4]; -} -var findFaceCenter = (mesh) => { - const x = mesh.map((m) => m[0]); - const y = mesh.map((m) => m[1]); - return [Math.min(...x) + (Math.max(...x) - Math.min(...x)) / 2, Math.min(...y) + (Math.max(...y) - Math.min(...y)) / 2]; -}; -var calculateFaceBox = (mesh, previousBox) => { - const center = findFaceCenter(mesh); - const boxSize = getBoxSize(previousBox); - const calculatedBox = { - startPoint: [center[0] - boxSize[0] / 2, center[1] - boxSize[1] / 2], - endPoint: [center[0] + boxSize[0] / 2, center[1] + boxSize[1] / 2] - }; - return calculatedBox; -}; - -// src/face/blazeface.ts -var keypointsCount = 6; -var faceBoxScaleFactor = 1.4; -var model5; -var anchors = null; -var inputSize = 0; -var inputSizeT = null; -var size = () => inputSize; -async function load5(config3) { - var _a; - if (env.initial) - model5 = null; - if (!model5) - model5 = await loadModel((_a = config3.face.detector) == null ? void 0 : _a.modelPath); - else if (config3.debug) - log("cached model:", model5["modelUrl"]); - inputSize = model5.inputs[0].shape ? model5.inputs[0].shape[2] : 0; - inputSizeT = tfjs_esm_exports.scalar(inputSize, "int32"); - anchors = tfjs_esm_exports.tensor2d(generateAnchors(inputSize)); - return model5; -} -function decodeBoxes(boxOutputs) { - const t = {}; - t.boxStarts = tfjs_esm_exports.slice(boxOutputs, [0, 1], [-1, 2]); - t.centers = tfjs_esm_exports.add(t.boxStarts, anchors); - t.boxSizes = tfjs_esm_exports.slice(boxOutputs, [0, 3], [-1, 2]); - t.boxSizesNormalized = tfjs_esm_exports.div(t.boxSizes, inputSizeT); - t.centersNormalized = tfjs_esm_exports.div(t.centers, inputSizeT); - t.halfBoxSize = tfjs_esm_exports.div(t.boxSizesNormalized, constants.tf2); - t.starts = tfjs_esm_exports.sub(t.centersNormalized, t.halfBoxSize); - t.ends = tfjs_esm_exports.add(t.centersNormalized, t.halfBoxSize); - t.startNormalized = tfjs_esm_exports.mul(t.starts, inputSizeT); - t.endNormalized = tfjs_esm_exports.mul(t.ends, inputSizeT); - const boxes = tfjs_esm_exports.concat2d([t.startNormalized, t.endNormalized], 1); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return boxes; -} -async function getBoxes(inputImage, config3) { - var _a, _b, _c, _d; - if (!inputImage || inputImage["isDisposedInternal"] || inputImage.shape.length !== 4 || inputImage.shape[1] < 1 || inputImage.shape[2] < 1) - return []; - const t = {}; - t.resized = tfjs_esm_exports.image.resizeBilinear(inputImage, [inputSize, inputSize]); - t.div = tfjs_esm_exports.div(t.resized, constants.tf127); - t.normalized = tfjs_esm_exports.sub(t.div, constants.tf05); - const res = model5 == null ? void 0 : model5.execute(t.normalized); - if (Array.isArray(res) && res.length > 2) { - const sorted = res.sort((a, b) => a.size - b.size); - t.concat384 = tfjs_esm_exports.concat([sorted[0], sorted[2]], 2); - t.concat512 = tfjs_esm_exports.concat([sorted[1], sorted[3]], 2); - t.concat = tfjs_esm_exports.concat([t.concat512, t.concat384], 1); - t.batch = tfjs_esm_exports.squeeze(t.concat, 0); - } else if (Array.isArray(res)) { - t.batch = tfjs_esm_exports.squeeze(res[0]); - } else { - t.batch = tfjs_esm_exports.squeeze(res); - } - tfjs_esm_exports.dispose(res); - t.boxes = decodeBoxes(t.batch); - t.logits = tfjs_esm_exports.slice(t.batch, [0, 0], [-1, 1]); - t.sigmoid = tfjs_esm_exports.sigmoid(t.logits); - t.scores = tfjs_esm_exports.squeeze(t.sigmoid); - t.nms = tfjs_esm_exports.image.nonMaxSuppression(t.boxes, t.scores, ((_a = config3.face.detector) == null ? void 0 : _a.maxDetected) || 0, ((_b = config3.face.detector) == null ? void 0 : _b.iouThreshold) || 0, ((_c = config3.face.detector) == null ? void 0 : _c.minConfidence) || 0); - const nms = await t.nms.array(); - const boxes = []; - const scores = await t.scores.data(); - for (let i = 0; i < nms.length; i++) { - const confidence = scores[nms[i]]; - if (confidence > (((_d = config3.face.detector) == null ? void 0 : _d.minConfidence) || 0)) { - const b = {}; - b.bbox = tfjs_esm_exports.slice(t.boxes, [nms[i], 0], [1, -1]); - b.slice = tfjs_esm_exports.slice(t.batch, [nms[i], keypointsCount - 1], [1, -1]); - b.squeeze = tfjs_esm_exports.squeeze(b.slice); - b.landmarks = tfjs_esm_exports.reshape(b.squeeze, [keypointsCount, -1]); - const points = await b.bbox.data(); - const rawBox = { - startPoint: [points[0], points[1]], - endPoint: [points[2], points[3]], - landmarks: await b.landmarks.array(), - confidence - }; - const scaledBox = scaleBoxCoordinates(rawBox, [(inputImage.shape[2] || 0) / inputSize, (inputImage.shape[1] || 0) / inputSize]); - const enlargedBox = enlargeBox(scaledBox, config3.face["scale"] || faceBoxScaleFactor); - const squaredBox = squarifyBox(enlargedBox); - boxes.push(squaredBox); - Object.keys(b).forEach((tensor3) => tfjs_esm_exports.dispose(b[tensor3])); - } - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return boxes; -} - -// src/body/blazeposecoords.ts -var blazeposecoords_exports = {}; -__export(blazeposecoords_exports, { - connected: () => connected, - kpt: () => kpt -}); -var kpt = [ - "nose", - "leftEyeInside", - "leftEye", - "leftEyeOutside", - "rightEyeInside", - "rightEye", - "rightEyeOutside", - "leftEar", - "rightEar", - "leftMouth", - "rightMouth", - "leftShoulder", - "rightShoulder", - "leftElbow", - "rightElbow", - "leftWrist", - "rightWrist", - "leftPinky", - "rightPinky", - "leftIndex", - "rightIndex", - "leftThumb", - "rightThumb", - "leftHip", - "rightHip", - "leftKnee", - "rightKnee", - "leftAnkle", - "rightAnkle", - "leftHeel", - "rightHeel", - "leftFoot", - "rightFoot", - "bodyCenter", - "bodyTop", - "leftPalm", - "leftHand", - "rightPalm", - "rightHand" -]; -var connected = { - shoulders: ["leftShoulder", "rightShoulder"], - hips: ["rightHip", "leftHip"], - mouth: ["leftMouth", "rightMouth"], - leftLegUpper: ["leftHip", "leftKnee"], - leftLegLower: ["leftKnee", "leftAnkle"], - leftFoot: ["leftAnkle", "leftHeel", "leftFoot"], - leftTorso: ["leftShoulder", "leftHip"], - leftArmUpper: ["leftShoulder", "leftElbow"], - leftArmLower: ["leftElbow", "leftWrist"], - leftHand: ["leftWrist", "leftPalm"], - leftHandPinky: ["leftPalm", "leftPinky"], - leftHandIndex: ["leftPalm", "leftIndex"], - leftHandThumb: ["leftPalm", "leftThumb"], - leftEyeOutline: ["leftEyeInside", "leftEyeOutside"], - rightLegUpper: ["rightHip", "rightKnee"], - rightLegLower: ["rightKnee", "rightAnkle"], - rightFoot: ["rightAnkle", "rightHeel", "rightFoot"], - rightTorso: ["rightShoulder", "rightHip"], - rightArmUpper: ["rightShoulder", "rightElbow"], - rightArmLower: ["rightElbow", "rightWrist"], - rightHand: ["rightWrist", "rightPalm"], - rightHandPinky: ["rightPalm", "rightPinky"], - rightHandIndex: ["rightPalm", "rightIndex"], - rightHandThumb: ["rightPalm", "rightThumb"], - rightEyeOutline: ["rightEyeInside", "rightEyeOutside"] -}; - -// src/body/blazeposedetector.ts -var inputSize2 = 224; -var anchorTensor; -var numLayers = 5; -var strides = [8, 16, 32, 32, 32]; -async function createAnchors() { - const anchors3 = []; - let layerId = 0; - while (layerId < numLayers) { - let anchorCount = 0; - let lastSameStrideLayer = layerId; - while (lastSameStrideLayer < strides.length && strides[lastSameStrideLayer] === strides[layerId]) { - anchorCount += 2; - lastSameStrideLayer++; - } - const stride = strides[layerId]; - const featureMapHeight = Math.ceil(inputSize2 / stride); - const featureMapWidth = Math.ceil(inputSize2 / stride); - for (let y = 0; y < featureMapHeight; ++y) { - for (let x = 0; x < featureMapWidth; ++x) { - for (let anchorId = 0; anchorId < anchorCount; ++anchorId) { - anchors3.push({ x: (x + 0.5) / featureMapWidth, y: (y + 0.5) / featureMapHeight }); - } - } - } - layerId = lastSameStrideLayer; - } - anchorTensor = { x: tfjs_esm_exports.tensor1d(anchors3.map((a) => a.x)), y: tfjs_esm_exports.tensor1d(anchors3.map((a) => a.y)) }; -} - -// src/util/box.ts -function calc(keypoints, outputSize2 = [1, 1]) { - const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; - const min2 = [Math.min(...coords[0]), Math.min(...coords[1])]; - const max4 = [Math.max(...coords[0]), Math.max(...coords[1])]; - const box = [min2[0], min2[1], max4[0] - min2[0], max4[1] - min2[1]]; - const boxRaw = [box[0] / outputSize2[0], box[1] / outputSize2[1], box[2] / outputSize2[0], box[3] / outputSize2[1]]; - return { box, boxRaw }; -} -function square(keypoints, outputSize2 = [1, 1]) { - const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; - const min2 = [Math.min(...coords[0]), Math.min(...coords[1])]; - const max4 = [Math.max(...coords[0]), Math.max(...coords[1])]; - const center = [(min2[0] + max4[0]) / 2, (min2[1] + max4[1]) / 2]; - const dist = Math.max(center[0] - min2[0], center[1] - min2[1], -center[0] + max4[0], -center[1] + max4[1]); - const box = [Math.trunc(center[0] - dist), Math.trunc(center[1] - dist), Math.trunc(2 * dist), Math.trunc(2 * dist)]; - const boxRaw = [box[0] / outputSize2[0], box[1] / outputSize2[1], box[2] / outputSize2[0], box[3] / outputSize2[1]]; - return { box, boxRaw }; -} -function scale(box, scaleFact) { - const dist = [box[2] * scaleFact, box[3] * scaleFact]; - const newBox = [ - box[0] - (dist[0] - box[2]) / 2, - box[1] - (dist[1] - box[3]) / 2, - dist[0], - dist[1] - ]; - return newBox; -} - -// src/body/blazepose.ts -var env3 = { initial: true }; -var models = { detector: null, landmarks: null }; -var inputSize3 = { detector: [224, 224], landmarks: [256, 256] }; -var skipped5 = Number.MAX_SAFE_INTEGER; -var outputNodes = { - landmarks: ["ld_3d", "activation_segmentation", "activation_heatmap", "world_3d", "output_poseflag"], - detector: [] -}; -var cache = null; -var cropBox; -var padding = [[0, 0], [0, 0], [0, 0], [0, 0]]; -var lastTime5 = 0; -var sigmoid3 = (x) => 1 - 1 / (1 + Math.exp(x)); -async function loadDetect(config3) { - if (env3.initial) - models.detector = null; - if (!models.detector && config3.body["detector"] && config3.body["detector"]["modelPath"] || "") { - models.detector = await loadModel(config3.body["detector"]["modelPath"]); - const inputs = Object.values(models.detector.modelSignature["inputs"]); - inputSize3.detector[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; - inputSize3.detector[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; - } else if (config3.debug && models.detector) - log("cached model:", models.detector["modelUrl"]); - await createAnchors(); - return models.detector; -} -async function loadPose(config3) { - if (env3.initial) - models.landmarks = null; - if (!models.landmarks) { - models.landmarks = await loadModel(config3.body.modelPath); - const inputs = Object.values(models.landmarks.modelSignature["inputs"]); - inputSize3.landmarks[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; - inputSize3.landmarks[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; - } else if (config3.debug) - log("cached model:", models.landmarks["modelUrl"]); - return models.landmarks; -} -async function prepareImage(input, size2) { - const t = {}; - if (!input.shape || !input.shape[1] || !input.shape[2]) - return input; - let final; - if (cropBox) { - t.cropped = tfjs_esm_exports.image.cropAndResize(input, [cropBox], [0], [input.shape[1], input.shape[2]]); - } - if (input.shape[1] !== input.shape[2]) { - const height = [ - input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, - input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0 - ]; - const width = [ - input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, - input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0 - ]; - padding = [ - [0, 0], - height, - width, - [0, 0] - ]; - t.pad = tfjs_esm_exports.pad(t.cropped || input, padding); - t.resize = tfjs_esm_exports.image.resizeBilinear(t.pad, [size2, size2]); - final = tfjs_esm_exports.div(t.resize, constants.tf255); - } else if (input.shape[1] !== size2) { - t.resize = tfjs_esm_exports.image.resizeBilinear(t.cropped || input, [size2, size2]); - final = tfjs_esm_exports.div(t.resize, constants.tf255); - } else { - final = tfjs_esm_exports.div(t.cropped || input, constants.tf255); - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return final; -} -function rescaleKeypoints(keypoints, outputSize2) { - for (const kpt4 of keypoints) { - kpt4.position = [ - Math.trunc(kpt4.position[0] * (outputSize2[0] + padding[2][0] + padding[2][1]) / outputSize2[0] - padding[2][0]), - Math.trunc(kpt4.position[1] * (outputSize2[1] + padding[1][0] + padding[1][1]) / outputSize2[1] - padding[1][0]), - kpt4.position[2] - ]; - kpt4.positionRaw = [kpt4.position[0] / outputSize2[0], kpt4.position[1] / outputSize2[1], 2 * kpt4.position[2] / (outputSize2[0] + outputSize2[1])]; - } - if (cropBox) { - for (const kpt4 of keypoints) { - kpt4.positionRaw = [ - kpt4.positionRaw[0] + cropBox[1], - kpt4.positionRaw[1] + cropBox[0], - kpt4.positionRaw[2] - ]; - kpt4.position = [ - Math.trunc(kpt4.positionRaw[0] * outputSize2[0]), - Math.trunc(kpt4.positionRaw[1] * outputSize2[1]), - kpt4.positionRaw[2] - ]; - } - } - return keypoints; -} -async function fixKeypoints(keypoints) { - const leftPalm = keypoints.find((k) => k.part === "leftPalm"); - const leftWrist = keypoints.find((k) => k.part === "leftWrist"); - const leftIndex = keypoints.find((k) => k.part === "leftIndex"); - leftPalm.position[2] = ((leftWrist.position[2] || 0) + (leftIndex.position[2] || 0)) / 2; - const rightPalm = keypoints.find((k) => k.part === "rightPalm"); - const rightWrist = keypoints.find((k) => k.part === "rightWrist"); - const rightIndex = keypoints.find((k) => k.part === "rightIndex"); - rightPalm.position[2] = ((rightWrist.position[2] || 0) + (rightIndex.position[2] || 0)) / 2; -} -async function detectLandmarks(input, config3, outputSize2) { - var _a; - const t = {}; - [t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = (_a = models.landmarks) == null ? void 0 : _a.execute(input, outputNodes.landmarks); - const poseScore = (await t.poseflag.data())[0]; - const points = await t.ld.data(); - const distances = await t.world.data(); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - const keypointsRelative = []; - const depth = 5; - for (let i = 0; i < points.length / depth; i++) { - const score = sigmoid3(points[depth * i + 3]); - const presence = sigmoid3(points[depth * i + 4]); - const adjScore = Math.trunc(100 * score * presence * poseScore) / 100; - const positionRaw = [points[depth * i + 0] / inputSize3.landmarks[0], points[depth * i + 1] / inputSize3.landmarks[1], points[depth * i + 2] + 0]; - const position = [Math.trunc(outputSize2[0] * positionRaw[0]), Math.trunc(outputSize2[1] * positionRaw[1]), positionRaw[2]]; - const distance2 = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0]; - keypointsRelative.push({ part: kpt[i], positionRaw, position, distance: distance2, score: adjScore }); - } - if (poseScore < (config3.body.minConfidence || 0)) - return null; - fixKeypoints(keypointsRelative); - const keypoints = rescaleKeypoints(keypointsRelative, outputSize2); - const kpts = keypoints.map((k) => k.position); - const boxes = calc(kpts, [outputSize2[0], outputSize2[1]]); - const annotations2 = {}; - for (const [name, indexes] of Object.entries(connected)) { - const pt = []; - for (let i = 0; i < indexes.length - 1; i++) { - const pt0 = keypoints.find((kpt4) => kpt4.part === indexes[i]); - const pt1 = keypoints.find((kpt4) => kpt4.part === indexes[i + 1]); - if (pt0 && pt1) - pt.push([pt0.position, pt1.position]); - } - annotations2[name] = pt; - } - const body4 = { id: 0, score: Math.trunc(100 * poseScore) / 100, box: boxes.box, boxRaw: boxes.boxRaw, keypoints, annotations: annotations2 }; - return body4; -} -async function predict5(input, config3) { - const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0]; - const skipTime = (config3.body.skipTime || 0) > now() - lastTime5; - const skipFrame = skipped5 < (config3.body.skipFrames || 0); - if (config3.skipAllowed && skipTime && skipFrame && cache !== null) { - skipped5++; - } else { - const t = {}; - t.landmarks = await prepareImage(input, 256); - cache = await detectLandmarks(t.landmarks, config3, outputSize2); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - lastTime5 = now(); - skipped5 = 0; - } - return cache ? [cache] : []; -} - -// 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/centernet.ts -var model6; -var inputSize4 = 0; -var last5 = []; -var lastTime6 = 0; -var skipped6 = Number.MAX_SAFE_INTEGER; -async function load6(config3) { - if (env.initial) - model6 = null; - if (!model6) { - model6 = await loadModel(config3.object.modelPath); - const inputs = Object.values(model6.modelSignature["inputs"]); - inputSize4 = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; - } else if (config3.debug) - log("cached model:", model6["modelUrl"]); - return model6; -} -async function process3(res, outputShape, config3) { - if (!res) - return []; - const t = {}; - const results = []; - const detections = await res.array(); - t.squeeze = tfjs_esm_exports.squeeze(res); - const arr = tfjs_esm_exports.split(t.squeeze, 6, 1); - t.stack = tfjs_esm_exports.stack([arr[1], arr[0], arr[3], arr[2]], 1); - t.boxes = tfjs_esm_exports.squeeze(t.stack); - t.scores = tfjs_esm_exports.squeeze(arr[4]); - t.classes = tfjs_esm_exports.squeeze(arr[5]); - tfjs_esm_exports.dispose([res, ...arr]); - t.nms = tfjs_esm_exports.image.nonMaxSuppression(t.boxes, t.scores, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence || 0); - const nms = await t.nms.data(); - let i = 0; - for (const id of Array.from(nms)) { - const score = Math.trunc(100 * detections[0][id][4]) / 100; - const classVal = detections[0][id][5]; - const label = labels[classVal].label; - const [x, y] = [ - detections[0][id][0] / inputSize4, - detections[0][id][1] / inputSize4 - ]; - const boxRaw = [ - x, - y, - detections[0][id][2] / inputSize4 - x, - detections[0][id][3] / inputSize4 - y - ]; - const box = [ - Math.trunc(boxRaw[0] * outputShape[0]), - Math.trunc(boxRaw[1] * outputShape[1]), - Math.trunc(boxRaw[2] * outputShape[0]), - Math.trunc(boxRaw[3] * outputShape[1]) - ]; - results.push({ id: i++, score, class: classVal, label, box, boxRaw }); - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return results; -} -async function predict6(input, config3) { - const skipTime = (config3.object.skipTime || 0) > now() - lastTime6; - const skipFrame = skipped6 < (config3.object.skipFrames || 0); - if (config3.skipAllowed && skipTime && skipFrame && last5.length > 0) { - skipped6++; - return last5; - } - skipped6 = 0; - return new Promise(async (resolve) => { - const outputSize2 = [input.shape[2] || 0, input.shape[1] || 0]; - const resize = tfjs_esm_exports.image.resizeBilinear(input, [inputSize4, inputSize4]); - const objectT = config3.object.enabled ? model6 == null ? void 0 : model6.execute(resize, ["tower_0/detections"]) : null; - lastTime6 = now(); - tfjs_esm_exports.dispose(resize); - const obj = await process3(objectT, outputSize2, config3); - last5 = obj; - resolve(obj); - }); -} - -// src/body/efficientposecoords.ts -var efficientposecoords_exports = {}; -__export(efficientposecoords_exports, { - connected: () => connected2, - kpt: () => kpt2 -}); -var kpt2 = [ - "head", - "neck", - "rightShoulder", - "rightElbow", - "rightWrist", - "chest", - "leftShoulder", - "leftElbow", - "leftWrist", - "bodyCenter", - "rightHip", - "rightKnee", - "rightAnkle", - "leftHip", - "leftKnee", - "leftAnkle" -]; -var connected2 = { - leftLeg: ["leftHip", "leftKnee", "leftAnkle"], - rightLeg: ["rightHip", "rightKnee", "rightAnkle"], - torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"], - leftArm: ["leftShoulder", "leftElbow", "leftWrist"], - rightArm: ["rightShoulder", "rightElbow", "rightWrist"], - head: [] -}; - -// src/body/efficientpose.ts -var model7; -var lastTime7 = 0; -var cache2 = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} }; -var skipped7 = Number.MAX_SAFE_INTEGER; -async function load7(config3) { - if (env.initial) - model7 = null; - if (!model7) - model7 = await loadModel(config3.body.modelPath); - else if (config3.debug) - log("cached model:", model7["modelUrl"]); - return model7; -} -async function max2d(inputs, minScore) { - const [width, height] = inputs.shape; - const reshaped = tfjs_esm_exports.reshape(inputs, [height * width]); - const max4 = tfjs_esm_exports.max(reshaped, 0); - const newScore = (await max4.data())[0]; - if (newScore > minScore) { - const coordinates = tfjs_esm_exports.argMax(reshaped, 0); - const mod3 = tfjs_esm_exports.mod(coordinates, width); - const x = (await mod3.data())[0]; - const div14 = tfjs_esm_exports.div(coordinates, width); - const y = (await div14.data())[0]; - tfjs_esm_exports.dispose([reshaped, max4, coordinates, mod3, div14]); - return [x, y, newScore]; - } else { - tfjs_esm_exports.dispose([reshaped, max4]); - return [0, 0, newScore]; - } -} -async function predict7(image25, config3) { - const skipTime = (config3.body.skipTime || 0) > now() - lastTime7; - const skipFrame = skipped7 < (config3.body.skipFrames || 0); - if (config3.skipAllowed && skipTime && skipFrame && Object.keys(cache2.keypoints).length > 0) { - skipped7++; - return [cache2]; - } - skipped7 = 0; - return new Promise(async (resolve) => { - var _a; - const tensor3 = tfjs_esm_exports.tidy(() => { - if (!(model7 == null ? void 0 : model7.inputs[0].shape)) - return null; - const resize = tfjs_esm_exports.image.resizeBilinear(image25, [model7.inputs[0].shape[2], model7.inputs[0].shape[1]], false); - const enhance2 = tfjs_esm_exports.mul(resize, constants.tf2); - const norm = tfjs_esm_exports.sub(enhance2, constants.tf1); - return norm; - }); - let resT; - if (config3.body.enabled) - resT = model7 == null ? void 0 : model7.execute(tensor3); - lastTime7 = now(); - tfjs_esm_exports.dispose(tensor3); - if (resT) { - cache2.keypoints.length = 0; - const squeeze12 = tfjs_esm_exports.squeeze(resT); - tfjs_esm_exports.dispose(resT); - const stack5 = tfjs_esm_exports.unstack(squeeze12, 2); - tfjs_esm_exports.dispose(squeeze12); - for (let id = 0; id < stack5.length; id++) { - const [x2, y2, partScore] = await max2d(stack5[id], config3.body.minConfidence); - if (partScore > (((_a = config3.body) == null ? void 0 : _a.minConfidence) || 0)) { - cache2.keypoints.push({ - score: Math.round(100 * partScore) / 100, - part: kpt2[id], - positionRaw: [ - x2 / model7.inputs[0].shape[2], - y2 / model7.inputs[0].shape[1] - ], - position: [ - Math.round(image25.shape[2] * x2 / model7.inputs[0].shape[2]), - Math.round(image25.shape[1] * y2 / model7.inputs[0].shape[1]) - ] - }); - } - } - stack5.forEach((s) => tfjs_esm_exports.dispose(s)); - } - cache2.score = cache2.keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); - const x = cache2.keypoints.map((a) => a.position[0]); - const y = cache2.keypoints.map((a) => a.position[1]); - cache2.box = [ - Math.min(...x), - Math.min(...y), - Math.max(...x) - Math.min(...x), - Math.max(...y) - Math.min(...y) - ]; - const xRaw = cache2.keypoints.map((a) => a.positionRaw[0]); - const yRaw = cache2.keypoints.map((a) => a.positionRaw[1]); - cache2.boxRaw = [ - Math.min(...xRaw), - Math.min(...yRaw), - Math.max(...xRaw) - Math.min(...xRaw), - Math.max(...yRaw) - Math.min(...yRaw) - ]; - for (const [name, indexes] of Object.entries(connected2)) { - const pt = []; - for (let i = 0; i < indexes.length - 1; i++) { - const pt0 = cache2.keypoints.find((kpt4) => kpt4.part === indexes[i]); - const pt1 = cache2.keypoints.find((kpt4) => kpt4.part === indexes[i + 1]); - if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) - pt.push([pt0.position, pt1.position]); - } - cache2.annotations[name] = pt; - } - resolve([cache2]); - }); -} - -// src/gear/emotion.ts -var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"]; -var model8; -var last6 = []; -var lastCount5 = 0; -var lastTime8 = 0; -var skipped8 = Number.MAX_SAFE_INTEGER; -async function load8(config3) { - var _a; - if (env.initial) - model8 = null; - if (!model8) - model8 = await loadModel((_a = config3.face.emotion) == null ? void 0 : _a.modelPath); - else if (config3.debug) - log("cached model:", model8["modelUrl"]); - return model8; -} -async function predict8(image25, config3, idx, count2) { - var _a, _b; - if (!model8) - return []; - const skipFrame = skipped8 < (((_a = config3.face.emotion) == null ? void 0 : _a.skipFrames) || 0); - const skipTime = (((_b = config3.face.emotion) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime8; - if (config3.skipAllowed && skipTime && skipFrame && lastCount5 === count2 && last6[idx] && last6[idx].length > 0) { - skipped8++; - return last6[idx]; - } - skipped8 = 0; - return new Promise(async (resolve) => { - var _a2, _b2; - const obj = []; - if ((_a2 = config3.face.emotion) == null ? void 0 : _a2.enabled) { - const t = {}; - const inputSize10 = (model8 == null ? void 0 : model8.inputs[0].shape) ? model8.inputs[0].shape[2] : 0; - t.resize = tfjs_esm_exports.image.resizeBilinear(image25, [inputSize10, inputSize10], false); - t.channels = tfjs_esm_exports.mul(t.resize, constants.rgb); - t.grayscale = tfjs_esm_exports.sum(t.channels, 3, true); - t.grayscaleSub = tfjs_esm_exports.sub(t.grayscale, constants.tf05); - t.grayscaleMul = tfjs_esm_exports.mul(t.grayscaleSub, constants.tf2); - t.emotion = model8 == null ? void 0 : model8.execute(t.grayscaleMul); - lastTime8 = now(); - const data = await t.emotion.data(); - for (let i = 0; i < data.length; i++) { - if (data[i] > (((_b2 = config3.face.emotion) == null ? void 0 : _b2.minConfidence) || 0)) - obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] }); - } - obj.sort((a, b) => b.score - a.score); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - } - last6[idx] = obj; - lastCount5 = count2; - resolve(obj); - }); -} - -// src/face/mobilefacenet.ts -var model9; -var last7 = []; -var lastCount6 = 0; -var lastTime9 = 0; -var skipped9 = Number.MAX_SAFE_INTEGER; -async function load9(config3) { - if (env.initial) - model9 = null; - if (!model9) - model9 = await loadModel(config3.face["mobilefacenet"].modelPath); - else if (config3.debug) - log("cached model:", model9["modelUrl"]); - return model9; -} -async function predict9(input, config3, idx, count2) { - var _a, _b; - if (!model9) - return []; - const skipFrame = skipped9 < (((_a = config3.face["mobilefacenet"]) == null ? void 0 : _a.skipFrames) || 0); - const skipTime = (((_b = config3.face["mobilefacenet"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime9; - if (config3.skipAllowed && skipTime && skipFrame && lastCount6 === count2 && last7[idx]) { - skipped9++; - return last7[idx]; - } - return new Promise(async (resolve) => { - var _a2; - let data = []; - if (((_a2 = config3.face["mobilefacenet"]) == null ? void 0 : _a2.enabled) && (model9 == null ? void 0 : model9.inputs[0].shape)) { - const t = {}; - t.crop = tfjs_esm_exports.image.resizeBilinear(input, [model9.inputs[0].shape[2], model9.inputs[0].shape[1]], false); - t.data = model9 == null ? void 0 : model9.execute(t.crop); - const output = await t.data.data(); - data = Array.from(output); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - } - last7[idx] = data; - lastCount6 = count2; - lastTime9 = now(); - resolve(data); - }); -} - -// src/face/insightface.ts -var model10; -var last8 = []; -var lastCount7 = 0; -var lastTime10 = 0; -var skipped10 = Number.MAX_SAFE_INTEGER; -async function load10(config3) { - if (env.initial) - model10 = null; - if (!model10) - model10 = await loadModel(config3.face["insightface"].modelPath); - else if (config3.debug) - log("cached model:", model10["modelUrl"]); - return model10; -} -async function predict10(input, config3, idx, count2) { - var _a, _b; - if (!model10) - return []; - const skipFrame = skipped10 < (((_a = config3.face["insightface"]) == null ? void 0 : _a.skipFrames) || 0); - const skipTime = (((_b = config3.face["insightface"]) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime10; - if (config3.skipAllowed && skipTime && skipFrame && lastCount7 === count2 && last8[idx]) { - skipped10++; - return last8[idx]; - } - return new Promise(async (resolve) => { - var _a2; - let data = []; - if (((_a2 = config3.face["insightface"]) == null ? void 0 : _a2.enabled) && (model10 == null ? void 0 : model10.inputs[0].shape)) { - const t = {}; - t.crop = tfjs_esm_exports.image.resizeBilinear(input, [model10.inputs[0].shape[2], model10.inputs[0].shape[1]], false); - t.data = model10 == null ? void 0 : model10.execute(t.crop); - const output = await t.data.data(); - data = Array.from(output); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - } - last8[idx] = data; - lastCount7 = count2; - lastTime10 = now(); - resolve(data); - }); -} - -// src/face/iris.ts -var model11; -var inputSize5 = 0; -var irisEnlarge = 2.3; -var leftOutline = meshAnnotations["leftEyeLower0"]; -var rightOutline = meshAnnotations["rightEyeLower0"]; -var eyeLandmarks = { - leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]], - rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]] -}; -var irisLandmarks = { - upperCenter: 3, - lowerCenter: 4, - index: 71, - numCoordinates: 76 -}; -async function load11(config3) { - var _a; - if (env.initial) - model11 = null; - if (!model11) - model11 = await loadModel((_a = config3.face.iris) == null ? void 0 : _a.modelPath); - else if (config3.debug) - log("cached model:", model11["modelUrl"]); - inputSize5 = model11.inputs[0].shape ? model11.inputs[0].shape[2] : 0; - if (inputSize5 === -1) - inputSize5 = 64; - return model11; -} -function replaceIrisCoords(rawCoords, newCoords, prefix, keys) { - for (let i = 0; i < irisIndices.length; i++) { - const { key, indices } = irisIndices[i]; - const originalIndices = meshAnnotations[`${prefix}${key}`]; - if (!keys || keys.includes(key)) { - for (let j = 0; j < indices.length; j++) { - const index2 = indices[j]; - rawCoords[originalIndices[j]] = [ - newCoords[index2][0], - newCoords[index2][1], - (newCoords[index2][2] + rawCoords[originalIndices[j]][2]) / 2 - ]; - } - } - } -} -var getLeftToRightEyeDepthDifference = (rawCoords) => { - const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2]; - const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2]; - return leftEyeZ - rightEyeZ; -}; -var getEyeBox = (rawCoords, face4, eyeInnerCornerIndex, eyeOuterCornerIndex, meshSize, flip = false) => { - const box = squarifyBox(enlargeBox(calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), irisEnlarge)); - const boxSize = getBoxSize(box); - let crop = tfjs_esm_exports.image.cropAndResize(face4, [[ - box.startPoint[1] / meshSize, - box.startPoint[0] / meshSize, - box.endPoint[1] / meshSize, - box.endPoint[0] / meshSize - ]], [0], [inputSize5, inputSize5]); - if (flip && env.kernels.includes("flipleftright")) { - const flipped = tfjs_esm_exports.image.flipLeftRight(crop); - tfjs_esm_exports.dispose(crop); - crop = flipped; - } - return { box, boxSize, crop }; -}; -var 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 / inputSize5 : x / inputSize5) * eyeBoxSize[0] + eyeBox.startPoint[0], - y / inputSize5 * eyeBoxSize[1] + eyeBox.startPoint[1], - z - ]); - } - return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) }; -}; -var getAdjustedIrisCoords = (rawCoords, irisCoords, direction) => { - const upperCenterZ = rawCoords[meshAnnotations[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2]; - const lowerCenterZ = rawCoords[meshAnnotations[`${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 function augmentIris(rawCoords, face4, config3, meshSize) { - if (!model11) { - if (config3.debug) - log("face mesh iris detection requested, but model is not loaded"); - return rawCoords; - } - const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = getEyeBox(rawCoords, face4, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], meshSize, true); - const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = getEyeBox(rawCoords, face4, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1], meshSize, true); - const combined = tfjs_esm_exports.concat([leftEyeCrop, rightEyeCrop]); - tfjs_esm_exports.dispose(leftEyeCrop); - tfjs_esm_exports.dispose(rightEyeCrop); - const eyePredictions = model11.execute(combined); - tfjs_esm_exports.dispose(combined); - const eyePredictionsData = await eyePredictions.data(); - tfjs_esm_exports.dispose(eyePredictions); - const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3); - const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true); - const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3); - const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize, false); - const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords); - if (Math.abs(leftToRightEyeDepthDifference) < 30) { - replaceIrisCoords(rawCoords, leftEyeRawCoords, "left", null); - replaceIrisCoords(rawCoords, rightEyeRawCoords, "right", null); - } else if (leftToRightEyeDepthDifference < 1) { - replaceIrisCoords(rawCoords, leftEyeRawCoords, "left", ["EyeUpper0", "EyeLower0"]); - } else { - replaceIrisCoords(rawCoords, rightEyeRawCoords, "right", ["EyeUpper0", "EyeLower0"]); - } - const adjustedLeftIrisCoords = getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, "left"); - const adjustedRightIrisCoords = getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, "right"); - const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords); - return newCoords; -} - -// src/face/constants.ts -var LIPS_CONNECTIONS = [ - [61, 146], - [146, 91], - [91, 181], - [181, 84], - [84, 17], - [17, 314], - [314, 405], - [405, 321], - [321, 375], - [375, 291], - [61, 185], - [185, 40], - [40, 39], - [39, 37], - [37, 0], - [0, 267], - [267, 269], - [269, 270], - [270, 409], - [409, 291], - [78, 95], - [95, 88], - [88, 178], - [178, 87], - [87, 14], - [14, 317], - [317, 402], - [402, 318], - [318, 324], - [324, 308], - [78, 191], - [191, 80], - [80, 81], - [81, 82], - [82, 13], - [13, 312], - [312, 311], - [311, 310], - [310, 415], - [415, 308] -]; -var LEFT_EYE_CONNECTIONS = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]]; -var LEFT_EYEBROW_CONNECTIONS = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]]; -var LEFT_IRIS_CONNECTIONS = [[474, 475], [475, 476], [476, 477], [477, 474]]; -var RIGHT_EYE_CONNECTIONS = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]]; -var RIGHT_EYEBROW_CONNECTIONS = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]]; -var RIGHT_IRIS_CONNECTIONS = [[469, 470], [470, 471], [471, 472], [472, 469]]; -var FACE_OVAL_CONNECTIONS = [ - [10, 338], - [338, 297], - [297, 332], - [332, 284], - [284, 251], - [251, 389], - [389, 356], - [356, 454], - [454, 323], - [323, 361], - [361, 288], - [288, 397], - [397, 365], - [365, 379], - [379, 378], - [378, 400], - [400, 377], - [377, 152], - [152, 148], - [148, 176], - [176, 149], - [149, 150], - [150, 136], - [136, 172], - [172, 58], - [58, 132], - [132, 93], - [93, 234], - [234, 127], - [127, 162], - [162, 21], - [21, 54], - [54, 103], - [103, 67], - [67, 109], - [109, 10] -]; -function connectionsToIndices2(connections) { - const indices = connections.map((connection) => connection[0]); - indices.push(connections[connections.length - 1][1]); - return indices; -} -var MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR = { - lips: connectionsToIndices2(LIPS_CONNECTIONS), - leftEye: connectionsToIndices2(LEFT_EYE_CONNECTIONS), - leftEyebrow: connectionsToIndices2(LEFT_EYEBROW_CONNECTIONS), - leftIris: connectionsToIndices2(LEFT_IRIS_CONNECTIONS), - rightEye: connectionsToIndices2(RIGHT_EYE_CONNECTIONS), - rightEyebrow: connectionsToIndices2(RIGHT_EYEBROW_CONNECTIONS), - rightIris: connectionsToIndices2(RIGHT_IRIS_CONNECTIONS), - faceOval: connectionsToIndices2(FACE_OVAL_CONNECTIONS) -}; -var indexLabelPairs = Object.entries(MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR).map(([label, indices]) => indices.map((index2) => [index2, label])).flat(); -var MEDIAPIPE_FACE_MESH_KEYPOINTS = new Map(indexLabelPairs); -var LANDMARKS_REFINEMENT_LIPS_CONFIG = [ - 61, - 146, - 91, - 181, - 84, - 17, - 314, - 405, - 321, - 375, - 291, - 185, - 40, - 39, - 37, - 0, - 267, - 269, - 270, - 409, - 78, - 95, - 88, - 178, - 87, - 14, - 317, - 402, - 318, - 324, - 308, - 191, - 80, - 81, - 82, - 13, - 312, - 311, - 310, - 415, - 76, - 77, - 90, - 180, - 85, - 16, - 315, - 404, - 320, - 307, - 306, - 184, - 74, - 73, - 72, - 11, - 302, - 303, - 304, - 408, - 62, - 96, - 89, - 179, - 86, - 15, - 316, - 403, - 319, - 325, - 292, - 183, - 42, - 41, - 38, - 12, - 268, - 271, - 272, - 407 -]; -var LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG = [ - 33, - 7, - 163, - 144, - 145, - 153, - 154, - 155, - 133, - 246, - 161, - 160, - 159, - 158, - 157, - 173, - 130, - 25, - 110, - 24, - 23, - 22, - 26, - 112, - 243, - 247, - 30, - 29, - 27, - 28, - 56, - 190, - 226, - 31, - 228, - 229, - 230, - 231, - 232, - 233, - 244, - 113, - 225, - 224, - 223, - 222, - 221, - 189, - 35, - 124, - 46, - 53, - 52, - 65, - 143, - 111, - 117, - 118, - 119, - 120, - 121, - 128, - 245, - 156, - 70, - 63, - 105, - 66, - 107, - 55, - 193 -]; -var LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG = [ - 263, - 249, - 390, - 373, - 374, - 380, - 381, - 382, - 362, - 466, - 388, - 387, - 386, - 385, - 384, - 398, - 359, - 255, - 339, - 254, - 253, - 252, - 256, - 341, - 463, - 467, - 260, - 259, - 257, - 258, - 286, - 414, - 446, - 261, - 448, - 449, - 450, - 451, - 452, - 453, - 464, - 342, - 445, - 444, - 443, - 442, - 441, - 413, - 265, - 353, - 276, - 283, - 282, - 295, - 372, - 340, - 346, - 347, - 348, - 349, - 350, - 357, - 465, - 383, - 300, - 293, - 334, - 296, - 336, - 285, - 417 -]; - -// src/face/attention.ts -async function augment(rawCoords, results) { - const t = { - lips: await results.filter((r) => r.size === 160)[0].data(), - irisL: await results.filter((r) => r.size === 10)[0].data(), - eyeL: await results.filter((r) => r.size === 142)[0].data(), - irisR: await results.filter((r) => r.size === 10)[1].data(), - eyeR: await results.filter((r) => r.size === 142)[1].data() - }; - const irisLDepth = LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.length; - for (let i = 0; i < t.irisL.length / 2; i++) - rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], irisLDepth]); - const irisRDepth = LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.length; - for (let i = 0; i < t.irisR.length / 2; i++) - rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], irisRDepth]); - for (let i = 0; i < t.eyeL.length / 2; i++) - rawCoords[LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]] = [t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]][2]]; - for (let i = 0; i < t.eyeR.length / 2; i++) - rawCoords[LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]] = [t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]][2]]; - for (let i = 0; i < t.lips.length / 2; i++) - rawCoords[LANDMARKS_REFINEMENT_LIPS_CONFIG[i]] = [t.lips[2 * i + 0], t.lips[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_LIPS_CONFIG[i]][2]]; - return rawCoords; -} - -// src/face/facemesh.ts -var cache3 = { - boxes: [], - skipped: Number.MAX_SAFE_INTEGER, - timestamp: 0 -}; -var model12 = null; -var inputSize6 = 0; -async function predict11(input, config3) { - var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l; - const skipTime = (((_a = config3.face.detector) == null ? void 0 : _a.skipTime) || 0) > now() - cache3.timestamp; - const skipFrame = cache3.skipped < (((_b = config3.face.detector) == null ? void 0 : _b.skipFrames) || 0); - if (!config3.skipAllowed || !skipTime || !skipFrame || cache3.boxes.length === 0) { - cache3.boxes = await getBoxes(input, config3); - cache3.timestamp = now(); - cache3.skipped = 0; - } else { - cache3.skipped++; - } - const faces = []; - const newCache = []; - let id = 0; - for (let i = 0; i < cache3.boxes.length; i++) { - const box = cache3.boxes[i]; - let angle = 0; - let rotationMatrix; - const face4 = { - id: id++, - mesh: [], - meshRaw: [], - box: [0, 0, 0, 0], - boxRaw: [0, 0, 0, 0], - score: 0, - boxScore: 0, - faceScore: 0, - annotations: {} - }; - [angle, rotationMatrix, face4.tensor] = correctFaceRotation((_c = config3.face.detector) == null ? void 0 : _c.rotation, box, input, ((_d = config3.face.mesh) == null ? void 0 : _d.enabled) ? inputSize6 : size()); - if ((_e = config3 == null ? void 0 : config3.filter) == null ? void 0 : _e.equalization) { - const equilized = await histogramEqualization(face4.tensor); - tfjs_esm_exports.dispose(face4.tensor); - face4.tensor = equilized; - } - face4.boxScore = Math.round(100 * box.confidence) / 100; - if (!((_f = config3.face.mesh) == null ? void 0 : _f.enabled)) { - face4.box = clampBox(box, input); - face4.boxRaw = getRawBox(box, input); - face4.score = face4.boxScore; - face4.mesh = box.landmarks.map((pt) => [ - (box.startPoint[0] + box.endPoint[0]) / 2 + (box.endPoint[0] + box.startPoint[0]) * pt[0] / size(), - (box.startPoint[1] + box.endPoint[1]) / 2 + (box.endPoint[1] + box.startPoint[1]) * pt[1] / size() - ]); - face4.meshRaw = face4.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize6]); - for (const key of Object.keys(blazeFaceLandmarks)) { - face4.annotations[key] = [face4.mesh[blazeFaceLandmarks[key]]]; - } - } else if (!model12) { - if (config3.debug) - log("face mesh detection requested, but model is not loaded"); - } else { - if (((_g = config3.face.attention) == null ? void 0 : _g.enabled) && !env.kernels.includes("atan2")) { - tfjs_esm_exports.dispose(face4.tensor); - return faces; - } - const results = model12.execute(face4.tensor); - const confidenceT = results.find((t) => t.shape[t.shape.length - 1] === 1); - const faceConfidence = await confidenceT.data(); - face4.faceScore = Math.round(100 * faceConfidence[0]) / 100; - if (face4.faceScore < (((_h = config3.face.detector) == null ? void 0 : _h.minConfidence) || 1)) { - box.confidence = face4.faceScore; - if ((_i = config3.face.mesh) == null ? void 0 : _i.keepInvalid) { - face4.box = clampBox(box, input); - face4.boxRaw = getRawBox(box, input); - face4.score = face4.boxScore; - face4.mesh = box.landmarks.map((pt) => [ - (box.startPoint[0] + box.endPoint[0]) / 2 + (box.endPoint[0] + box.startPoint[0]) * pt[0] / size(), - (box.startPoint[1] + box.endPoint[1]) / 2 + (box.endPoint[1] + box.startPoint[1]) * pt[1] / size() - ]); - face4.meshRaw = face4.mesh.map((pt) => [pt[0] / (input.shape[2] || 1), pt[1] / (input.shape[1] || 1), (pt[2] || 0) / inputSize6]); - for (const key of Object.keys(blazeFaceLandmarks)) { - face4.annotations[key] = [face4.mesh[blazeFaceLandmarks[key]]]; - } - } - } else { - const meshT = results.find((t) => t.shape[t.shape.length - 1] === 1404); - const coordsReshaped = tfjs_esm_exports.reshape(meshT, [-1, 3]); - let rawCoords = await coordsReshaped.array(); - tfjs_esm_exports.dispose(coordsReshaped); - if ((_j = config3.face.attention) == null ? void 0 : _j.enabled) { - rawCoords = await augment(rawCoords, results); - } else if ((_k = config3.face.iris) == null ? void 0 : _k.enabled) { - rawCoords = await augmentIris(rawCoords, face4.tensor, config3, inputSize6); - } - face4.mesh = transformRawCoords(rawCoords, box, angle, rotationMatrix, inputSize6); - face4.meshRaw = face4.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize6]); - for (const key of Object.keys(meshAnnotations)) - face4.annotations[key] = meshAnnotations[key].map((index2) => face4.mesh[index2]); - face4.score = face4.faceScore; - const calculatedBox = { ...calculateFaceBox(face4.mesh, box), confidence: box.confidence, landmarks: box.landmarks }; - face4.box = clampBox(calculatedBox, input); - face4.boxRaw = getRawBox(calculatedBox, input); - newCache.push(calculatedBox); - } - tfjs_esm_exports.dispose(results); - } - if (face4.score > (((_l = config3.face.detector) == null ? void 0 : _l.minConfidence) || 1)) - faces.push(face4); - else - tfjs_esm_exports.dispose(face4.tensor); - } - cache3.boxes = newCache; - return faces; -} -async function load12(config3) { - var _a, _b, _c, _d, _e, _f; - if (env.initial) - model12 = null; - if (((_b = (_a = config3 == null ? void 0 : config3.face) == null ? void 0 : _a.attention) == null ? void 0 : _b.enabled) && (model12 == null ? void 0 : model12.signature)) { - if (Object.keys(((_c = model12 == null ? void 0 : model12.signature) == null ? void 0 : _c.outputs) || {}).length < 6) - model12 = null; - } - if (!model12) { - if ((_d = config3.face.attention) == null ? void 0 : _d.enabled) - model12 = await loadModel((_e = config3.face.attention) == null ? void 0 : _e.modelPath); - else - model12 = await loadModel((_f = config3.face.mesh) == null ? void 0 : _f.modelPath); - } else if (config3.debug) { - log("cached model:", model12["modelUrl"]); - } - inputSize6 = model12.inputs[0].shape ? model12.inputs[0].shape[2] : 0; - return model12; -} -var triangulation = TRI468; -var uvmap = UV468; - -// src/face/faceres.ts -var model13; -var last9 = []; -var lastTime11 = 0; -var lastCount8 = 0; -var skipped11 = Number.MAX_SAFE_INTEGER; -async function load13(config3) { - var _a; - if (env.initial) - model13 = null; - if (!model13) - model13 = await loadModel((_a = config3.face.description) == null ? void 0 : _a.modelPath); - else if (config3.debug) - log("cached model:", model13["modelUrl"]); - return model13; -} -function enhance(input) { - const tensor3 = input.image || input.tensor || input; - if (!(model13 == null ? void 0 : model13.inputs[0].shape)) - return tensor3; - const crop = tfjs_esm_exports.image.resizeBilinear(tensor3, [model13.inputs[0].shape[2], model13.inputs[0].shape[1]], false); - const norm = tfjs_esm_exports.mul(crop, constants.tf255); - tfjs_esm_exports.dispose(crop); - return norm; -} -async function predict12(image25, config3, idx, count2) { - var _a, _b, _c, _d; - if (!model13) - return { age: 0, gender: "unknown", genderScore: 0, descriptor: [] }; - const skipFrame = skipped11 < (((_a = config3.face.description) == null ? void 0 : _a.skipFrames) || 0); - const skipTime = (((_b = config3.face.description) == null ? void 0 : _b.skipTime) || 0) > now() - lastTime11; - if (config3.skipAllowed && skipFrame && skipTime && lastCount8 === count2 && ((_c = last9[idx]) == null ? void 0 : _c.age) && ((_d = last9[idx]) == null ? void 0 : _d.age) > 0) { - skipped11++; - return last9[idx]; - } - skipped11 = 0; - return new Promise(async (resolve) => { - var _a2, _b2; - const obj = { - age: 0, - gender: "unknown", - genderScore: 0, - descriptor: [] - }; - if ((_a2 = config3.face.description) == null ? void 0 : _a2.enabled) { - const enhanced = enhance(image25); - const resT = model13 == null ? void 0 : model13.execute(enhanced); - lastTime11 = now(); - tfjs_esm_exports.dispose(enhanced); - const genderT = await resT.find((t) => t.shape[1] === 1); - const gender2 = await genderT.data(); - const confidence = Math.trunc(200 * Math.abs(gender2[0] - 0.5)) / 100; - if (confidence > (((_b2 = config3.face.description) == null ? void 0 : _b2.minConfidence) || 0)) { - obj.gender = gender2[0] <= 0.5 ? "female" : "male"; - obj.genderScore = Math.min(0.99, confidence); - } - const argmax = tfjs_esm_exports.argMax(resT.find((t) => t.shape[1] === 100), 1); - const age2 = (await argmax.data())[0]; - tfjs_esm_exports.dispose(argmax); - const ageT = resT.find((t) => t.shape[1] === 100); - const all2 = await ageT.data(); - obj.age = Math.round(all2[age2 - 1] > all2[age2 + 1] ? 10 * age2 - 100 * all2[age2 - 1] : 10 * age2 + 100 * all2[age2 + 1]) / 10; - const desc = resT.find((t) => t.shape[1] === 1024); - const descriptor = desc ? await desc.data() : []; - obj.descriptor = Array.from(descriptor); - resT.forEach((t) => tfjs_esm_exports.dispose(t)); - } - last9[idx] = obj; - lastCount8 = count2; - resolve(obj); - }); -} - -// src/hand/handposeutil.ts -function getBoxSize2(box) { - return [ - Math.abs(box.endPoint[0] - box.startPoint[0]), - Math.abs(box.endPoint[1] - box.startPoint[1]) - ]; -} -function getBoxCenter2(box) { - return [ - box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, - box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2 - ]; -} -function cutBoxFromImageAndResize(box, image25, cropSize) { - const h = image25.shape[1]; - const w = image25.shape[2]; - const boxes = [[ - box.startPoint[1] / h, - box.startPoint[0] / w, - box.endPoint[1] / h, - box.endPoint[0] / w - ]]; - return tfjs_esm_exports.image.cropAndResize(image25, boxes, [0], cropSize); -} -function scaleBoxCoordinates2(box, factor) { - const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]]; - const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]]; - const palmLandmarks = box.palmLandmarks.map((coord) => { - const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]]; - return scaledCoord; - }); - return { startPoint, endPoint, palmLandmarks, confidence: box.confidence }; -} -function enlargeBox2(box, factor = 1.5) { - const center = getBoxCenter2(box); - const size2 = getBoxSize2(box); - const newHalfSize = [factor * size2[0] / 2, factor * size2[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: box.palmLandmarks }; -} -function squarifyBox2(box) { - const centers = getBoxCenter2(box); - const size2 = getBoxSize2(box); - const maxEdge = Math.max(...size2); - const halfSize = maxEdge / 2; - const startPoint = [centers[0] - halfSize, centers[1] - halfSize]; - const endPoint = [centers[0] + halfSize, centers[1] + halfSize]; - return { startPoint, endPoint, palmLandmarks: box.palmLandmarks }; -} -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 size2 = mat1.length; - for (let row = 0; row < size2; row++) { - product.push([]); - for (let col = 0; col < size2; 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/hand/handposeanchors.ts -var anchors2 = [ - { 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/hand/handposedetector.ts -var HandDetector = class { - constructor(model19) { - __publicField(this, "model"); - __publicField(this, "anchors"); - __publicField(this, "anchorsTensor"); - __publicField(this, "inputSize"); - __publicField(this, "inputSizeTensor"); - __publicField(this, "doubleInputSizeTensor"); - this.model = model19; - this.anchors = anchors2.map((anchor) => [anchor.x, anchor.y]); - this.anchorsTensor = tfjs_esm_exports.tensor2d(this.anchors); - this.inputSize = this.model && this.model.inputs && this.model.inputs[0].shape ? this.model.inputs[0].shape[2] : 0; - this.inputSizeTensor = tfjs_esm_exports.tensor1d([this.inputSize, this.inputSize]); - this.doubleInputSizeTensor = tfjs_esm_exports.tensor1d([this.inputSize * 2, this.inputSize * 2]); - } - normalizeBoxes(boxes) { - const t = {}; - t.boxOffsets = tfjs_esm_exports.slice(boxes, [0, 0], [-1, 2]); - t.boxSizes = tfjs_esm_exports.slice(boxes, [0, 2], [-1, 2]); - t.div = tfjs_esm_exports.div(t.boxOffsets, this.inputSizeTensor); - t.boxCenterPoints = tfjs_esm_exports.add(t.div, this.anchorsTensor); - t.halfBoxSizes = tfjs_esm_exports.div(t.boxSizes, this.doubleInputSizeTensor); - t.sub = tfjs_esm_exports.sub(t.boxCenterPoints, t.halfBoxSizes); - t.startPoints = tfjs_esm_exports.mul(t.sub, this.inputSizeTensor); - t.add = tfjs_esm_exports.add(t.boxCenterPoints, t.halfBoxSizes); - t.endPoints = tfjs_esm_exports.mul(t.add, this.inputSizeTensor); - const res = tfjs_esm_exports.concat2d([t.startPoints, t.endPoints], 1); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return res; - } - normalizeLandmarks(rawPalmLandmarks, index2) { - const t = {}; - t.reshape = tfjs_esm_exports.reshape(rawPalmLandmarks, [-1, 7, 2]); - t.div = tfjs_esm_exports.div(t.reshape, this.inputSizeTensor); - t.landmarks = tfjs_esm_exports.add(t.div, this.anchors[index2]); - const res = tfjs_esm_exports.mul(t.landmarks, this.inputSizeTensor); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return res; - } - async predict(input, config3) { - const t = {}; - t.resize = tfjs_esm_exports.image.resizeBilinear(input, [this.inputSize, this.inputSize]); - t.div = tfjs_esm_exports.div(t.resize, constants.tf127); - t.image = tfjs_esm_exports.sub(t.div, constants.tf1); - t.batched = this.model.execute(t.image); - t.predictions = tfjs_esm_exports.squeeze(t.batched); - t.slice = tfjs_esm_exports.slice(t.predictions, [0, 0], [-1, 1]); - t.sigmoid = tfjs_esm_exports.sigmoid(t.slice); - t.scores = tfjs_esm_exports.squeeze(t.sigmoid); - const scores = await t.scores.data(); - t.boxes = tfjs_esm_exports.slice(t.predictions, [0, 1], [-1, 4]); - t.norm = this.normalizeBoxes(t.boxes); - t.nms = tfjs_esm_exports.image.nonMaxSuppression(t.norm, t.scores, 3 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); - const nms = await t.nms.array(); - const hands = []; - for (const index2 of nms) { - const p = {}; - p.box = tfjs_esm_exports.slice(t.norm, [index2, 0], [1, -1]); - p.slice = tfjs_esm_exports.slice(t.predictions, [index2, 5], [1, 14]); - p.norm = this.normalizeLandmarks(p.slice, index2); - p.palmLandmarks = tfjs_esm_exports.reshape(p.norm, [-1, 2]); - const box = await p.box.data(); - const startPoint = box.slice(0, 2); - const endPoint = box.slice(2, 4); - const palmLandmarks = await p.palmLandmarks.array(); - const hand3 = { startPoint, endPoint, palmLandmarks, confidence: scores[index2] }; - const scaled = scaleBoxCoordinates2(hand3, [input.shape[2] / this.inputSize, input.shape[1] / this.inputSize]); - hands.push(scaled); - Object.keys(p).forEach((tensor3) => tfjs_esm_exports.dispose(p[tensor3])); - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return hands; - } -}; - -// src/hand/handposepipeline.ts -var palmBoxEnlargeFactor = 5; -var handBoxEnlargeFactor = 1.65; -var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2]; -var palmLandmarksPalmBase = 0; -var palmLandmarksMiddleFingerBase = 2; -var lastTime12 = 0; -var HandPipeline = class { - constructor(handDetector, handPoseModel2) { - __publicField(this, "handDetector"); - __publicField(this, "handPoseModel"); - __publicField(this, "inputSize"); - __publicField(this, "storedBoxes"); - __publicField(this, "skipped"); - __publicField(this, "detectedHands"); - this.handDetector = handDetector; - this.handPoseModel = handPoseModel2; - this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0; - this.storedBoxes = []; - this.skipped = Number.MAX_SAFE_INTEGER; - this.detectedHands = 0; - } - calculateLandmarksBoundingBox(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, box2, angle, rotationMatrix) { - const boxSize = getBoxSize2(box2); - 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(box2), 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(image25, config3) { - let useFreshBox = false; - let boxes; - const skipTime = (config3.hand.skipTime || 0) > now() - lastTime12; - const skipFrame = this.skipped < (config3.hand.skipFrames || 0); - if (config3.skipAllowed && skipTime && skipFrame) { - boxes = await this.handDetector.predict(image25, config3); - this.skipped = 0; - } - if (config3.skipAllowed) - 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] / image25.shape[2], palmCenter[1] / image25.shape[1]]; - const rotatedImage = config3.hand.rotation && env.kernels.includes("rotatewithoffset") ? tfjs_esm_exports.image.rotateWithOffset(image25, angle, 0, palmCenterNormalized) : image25.clone(); - const rotationMatrix = buildRotationMatrix2(-angle, palmCenter); - const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox; - const croppedInput = cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]); - const handImage = tfjs_esm_exports.div(croppedInput, constants.tf255); - tfjs_esm_exports.dispose(croppedInput); - tfjs_esm_exports.dispose(rotatedImage); - const [confidenceT, keypoints] = this.handPoseModel.execute(handImage); - lastTime12 = now(); - tfjs_esm_exports.dispose(handImage); - const confidence = (await confidenceT.data())[0]; - tfjs_esm_exports.dispose(confidenceT); - if (confidence >= config3.hand.minConfidence / 4) { - const keypointsReshaped = tfjs_esm_exports.reshape(keypoints, [-1, 3]); - const rawCoords = await keypointsReshaped.array(); - tfjs_esm_exports.dispose(keypoints); - tfjs_esm_exports.dispose(keypointsReshaped); - const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); - const nextBoundingBox = this.getBoxForHandLandmarks(coords); - this.storedBoxes[i] = { ...nextBoundingBox, confidence }; - const result = { - landmarks: coords, - confidence, - boxConfidence: currentBox.confidence, - fingerConfidence: confidence, - box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint } - }; - hands.push(result); - } else { - this.storedBoxes[i] = null; - } - tfjs_esm_exports.dispose(keypoints); - } else { - const enlarged = enlargeBox2(squarifyBox2(currentBox), handBoxEnlargeFactor); - const result = { - confidence: currentBox.confidence, - boxConfidence: currentBox.confidence, - fingerConfidence: 0, - box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint }, - landmarks: [] - }; - hands.push(result); - } - } - this.storedBoxes = this.storedBoxes.filter((a) => a !== null); - this.detectedHands = hands.length; - if (hands.length > config3.hand.maxDetected) - hands.length = config3.hand.maxDetected; - return hands; - } -}; - -// src/hand/fingerdef.ts -var Finger = { - thumb: 0, - index: 1, - middle: 2, - ring: 3, - pinky: 4, - all: [0, 1, 2, 3, 4], - nameMapping: { 0: "thumb", 1: "index", 2: "middle", 3: "ring", 4: "pinky" }, - pointsMapping: { - 0: [[0, 1], [1, 2], [2, 3], [3, 4]], - 1: [[0, 5], [5, 6], [6, 7], [7, 8]], - 2: [[0, 9], [9, 10], [10, 11], [11, 12]], - 3: [[0, 13], [13, 14], [14, 15], [15, 16]], - 4: [[0, 17], [17, 18], [18, 19], [19, 20]] - }, - getName: (value) => Finger.nameMapping[value], - getPoints: (value) => Finger.pointsMapping[value] -}; -var FingerCurl = { - none: 0, - half: 1, - full: 2, - nameMapping: { 0: "none", 1: "half", 2: "full" }, - getName: (value) => FingerCurl.nameMapping[value] -}; -var FingerDirection = { - verticalUp: 0, - verticalDown: 1, - horizontalLeft: 2, - horizontalRight: 3, - diagonalUpRight: 4, - diagonalUpLeft: 5, - diagonalDownRight: 6, - diagonalDownLeft: 7, - nameMapping: { 0: "verticalUp", 1: "verticalDown", 2: "horizontalLeft", 3: "horizontalRight", 4: "diagonalUpRight", 5: "diagonalUpLeft", 6: "diagonalDownRight", 7: "diagonalDownLeft" }, - getName: (value) => FingerDirection.nameMapping[value] -}; -var FingerGesture = class { - constructor(name) { - __publicField(this, "name"); - __publicField(this, "curls"); - __publicField(this, "directions"); - __publicField(this, "weights"); - __publicField(this, "weightsRelative"); - this.name = name; - this.curls = {}; - this.directions = {}; - this.weights = [1, 1, 1, 1, 1]; - this.weightsRelative = [1, 1, 1, 1, 1]; - } - curl(finger, curl, confidence) { - if (typeof this.curls[finger] === "undefined") - this.curls[finger] = []; - this.curls[finger].push([curl, confidence]); - } - direction(finger, position, confidence) { - if (!this.directions[finger]) - this.directions[finger] = []; - this.directions[finger].push([position, confidence]); - } - weight(finger, weight) { - this.weights[finger] = weight; - const total = this.weights.reduce((a, b) => a + b, 0); - this.weightsRelative = this.weights.map((el) => el * 5 / total); - } - matchAgainst(detectedCurls, detectedDirections) { - let confidence = 0; - for (const fingerIdx in detectedCurls) { - const detectedCurl = detectedCurls[fingerIdx]; - const expectedCurls = this.curls[fingerIdx]; - if (typeof expectedCurls === "undefined") { - confidence += this.weightsRelative[fingerIdx]; - continue; - } - for (const [expectedCurl, score] of expectedCurls) { - if (detectedCurl === expectedCurl) { - confidence += score * this.weightsRelative[fingerIdx]; - break; - } - } - } - for (const fingerIdx in detectedDirections) { - const detectedDirection = detectedDirections[fingerIdx]; - const expectedDirections = this.directions[fingerIdx]; - if (typeof expectedDirections === "undefined") { - confidence += this.weightsRelative[fingerIdx]; - continue; - } - for (const [expectedDirection, score] of expectedDirections) { - if (detectedDirection === expectedDirection) { - confidence += score * this.weightsRelative[fingerIdx]; - break; - } - } - } - return confidence / 10; - } -}; - -// src/hand/fingergesture.ts -var { thumb, index, middle, ring, pinky } = Finger; -var { none, half, full } = FingerCurl; -var { verticalUp, verticalDown, horizontalLeft, horizontalRight, diagonalUpRight, diagonalUpLeft, diagonalDownRight, diagonalDownLeft } = FingerDirection; -var ThumbsUp = new FingerGesture("thumbs up"); -ThumbsUp.curl(thumb, none, 1); -ThumbsUp.direction(thumb, verticalUp, 1); -ThumbsUp.direction(thumb, diagonalUpLeft, 0.25); -ThumbsUp.direction(thumb, diagonalUpRight, 0.25); -for (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) { - ThumbsUp.curl(finger, full, 1); - ThumbsUp.direction(finger, horizontalLeft, 1); - ThumbsUp.direction(finger, horizontalRight, 1); -} -var Victory = new FingerGesture("victory"); -Victory.curl(thumb, half, 0.5); -Victory.curl(thumb, none, 0.5); -Victory.direction(thumb, verticalUp, 1); -Victory.direction(thumb, diagonalUpLeft, 1); -Victory.curl(index, none, 1); -Victory.direction(index, verticalUp, 0.75); -Victory.direction(index, diagonalUpLeft, 1); -Victory.curl(middle, none, 1); -Victory.direction(middle, verticalUp, 1); -Victory.direction(middle, diagonalUpLeft, 0.75); -Victory.curl(ring, full, 1); -Victory.direction(ring, verticalUp, 0.2); -Victory.direction(ring, diagonalUpLeft, 1); -Victory.direction(ring, horizontalLeft, 0.2); -Victory.curl(pinky, full, 1); -Victory.direction(pinky, verticalUp, 0.2); -Victory.direction(pinky, diagonalUpLeft, 1); -Victory.direction(pinky, horizontalLeft, 0.2); -Victory.weight(index, 2); -Victory.weight(middle, 2); -var Point = new FingerGesture("point"); -Point.curl(thumb, full, 1); -Point.curl(index, none, 0.5); -Point.curl(middle, full, 0.5); -Point.curl(ring, full, 0.5); -Point.curl(pinky, full, 0.5); -Point.weight(index, 2); -Point.weight(middle, 2); -var MiddleFinger = new FingerGesture("middle finger"); -MiddleFinger.curl(thumb, none, 1); -MiddleFinger.curl(index, full, 0.5); -MiddleFinger.curl(middle, full, 0.5); -MiddleFinger.curl(ring, full, 0.5); -MiddleFinger.curl(pinky, full, 0.5); -MiddleFinger.weight(index, 2); -MiddleFinger.weight(middle, 2); -var OpenPalm = new FingerGesture("open palm"); -OpenPalm.curl(thumb, none, 0.75); -OpenPalm.curl(index, none, 0.75); -OpenPalm.curl(middle, none, 0.75); -OpenPalm.curl(ring, none, 0.75); -OpenPalm.curl(pinky, none, 0.75); -var fingergesture_default = [ThumbsUp, Victory, Point, MiddleFinger, OpenPalm]; - -// src/hand/fingerpose.ts -var minConfidence = 0.7; -var options = { - HALF_CURL_START_LIMIT: 60, - NO_CURL_START_LIMIT: 130, - DISTANCE_VOTE_POWER: 1.1, - SINGLE_ANGLE_VOTE_POWER: 0.9, - TOTAL_ANGLE_VOTE_POWER: 1.6 -}; -function calculateSlope(point1x, point1y, point2x, point2y) { - const value = (point1y - point2y) / (point1x - point2x); - let slope = Math.atan(value) * 180 / Math.PI; - if (slope <= 0) - slope = -slope; - else if (slope > 0) - slope = 180 - slope; - return slope; -} -function getSlopes(point1, point2) { - if (!point1 || !point2) - return [0, 0]; - const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]); - if (point1.length === 2) - return slopeXY; - const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]); - return [slopeXY, slopeYZ]; -} -function angleOrientationAt(angle, weightageAt = 1) { - let isVertical = 0; - let isDiagonal = 0; - let isHorizontal = 0; - if (angle >= 75 && angle <= 105) - isVertical = 1 * weightageAt; - else if (angle >= 25 && angle <= 155) - isDiagonal = 1 * weightageAt; - else - isHorizontal = 1 * weightageAt; - return [isVertical, isDiagonal, isHorizontal]; -} -function estimateFingerCurl(startPoint, midPoint, endPoint) { - const start_mid_x_dist = startPoint[0] - midPoint[0]; - const start_end_x_dist = startPoint[0] - endPoint[0]; - const mid_end_x_dist = midPoint[0] - endPoint[0]; - const start_mid_y_dist = startPoint[1] - midPoint[1]; - const start_end_y_dist = startPoint[1] - endPoint[1]; - const mid_end_y_dist = midPoint[1] - endPoint[1]; - const start_mid_z_dist = startPoint[2] - midPoint[2]; - const start_end_z_dist = startPoint[2] - endPoint[2]; - const mid_end_z_dist = midPoint[2] - endPoint[2]; - const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist); - const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist); - const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist); - let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist); - if (cos_in > 1) - cos_in = 1; - else if (cos_in < -1) - cos_in = -1; - let angleOfCurve = Math.acos(cos_in); - angleOfCurve = 57.2958 * angleOfCurve % 180; - let fingerCurl; - if (angleOfCurve > options.NO_CURL_START_LIMIT) - fingerCurl = FingerCurl.none; - else if (angleOfCurve > options.HALF_CURL_START_LIMIT) - fingerCurl = FingerCurl.half; - else - fingerCurl = FingerCurl.full; - return fingerCurl; -} -function estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) { - let estimatedDirection; - if (max_dist_x === Math.abs(start_end_x_dist)) { - if (start_end_x_dist > 0) - estimatedDirection = FingerDirection.horizontalLeft; - else - estimatedDirection = FingerDirection.horizontalRight; - } else if (max_dist_x === Math.abs(start_mid_x_dist)) { - if (start_mid_x_dist > 0) - estimatedDirection = FingerDirection.horizontalLeft; - else - estimatedDirection = FingerDirection.horizontalRight; - } else { - if (mid_end_x_dist > 0) - estimatedDirection = FingerDirection.horizontalLeft; - else - estimatedDirection = FingerDirection.horizontalRight; - } - return estimatedDirection; -} -function estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) { - let estimatedDirection; - if (max_dist_y === Math.abs(start_end_y_dist)) { - if (start_end_y_dist < 0) - estimatedDirection = FingerDirection.verticalDown; - else - estimatedDirection = FingerDirection.verticalUp; - } else if (max_dist_y === Math.abs(start_mid_y_dist)) { - if (start_mid_y_dist < 0) - estimatedDirection = FingerDirection.verticalDown; - else - estimatedDirection = FingerDirection.verticalUp; - } else { - if (mid_end_y_dist < 0) - estimatedDirection = FingerDirection.verticalDown; - else - estimatedDirection = FingerDirection.verticalUp; - } - return estimatedDirection; -} -function estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) { - let estimatedDirection; - const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y); - const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); - if (reqd_vertical_direction === FingerDirection.verticalUp) { - if (reqd_horizontal_direction === FingerDirection.horizontalLeft) - estimatedDirection = FingerDirection.diagonalUpLeft; - else - estimatedDirection = FingerDirection.diagonalUpRight; - } else { - if (reqd_horizontal_direction === FingerDirection.horizontalLeft) - estimatedDirection = FingerDirection.diagonalDownLeft; - else - estimatedDirection = FingerDirection.diagonalDownRight; - } - return estimatedDirection; -} -function calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) { - const start_mid_x_dist = startPoint[0] - midPoint[0]; - const start_end_x_dist = startPoint[0] - endPoint[0]; - const mid_end_x_dist = midPoint[0] - endPoint[0]; - const start_mid_y_dist = startPoint[1] - midPoint[1]; - const start_end_y_dist = startPoint[1] - endPoint[1]; - const mid_end_y_dist = midPoint[1] - endPoint[1]; - const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist)); - const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist)); - let voteVertical = 0; - let voteDiagonal = 0; - let voteHorizontal = 0; - const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 1e-5); - if (start_end_x_y_dist_ratio > 1.5) - voteVertical += options.DISTANCE_VOTE_POWER; - else if (start_end_x_y_dist_ratio > 0.66) - voteDiagonal += options.DISTANCE_VOTE_POWER; - else - voteHorizontal += options.DISTANCE_VOTE_POWER; - const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist); - const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist); - const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist); - const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist); - let calc_start_point_x = startPoint[0]; - let calc_start_point_y = startPoint[1]; - let calc_end_point_x = endPoint[0]; - let calc_end_point_y = endPoint[1]; - if (max_dist === start_mid_dist) { - calc_end_point_x = endPoint[0]; - calc_end_point_y = endPoint[1]; - } else if (max_dist === mid_end_dist) { - calc_start_point_x = midPoint[0]; - calc_start_point_y = midPoint[1]; - } - const calcStartPoint = [calc_start_point_x, calc_start_point_y]; - const calcEndPoint = [calc_end_point_x, calc_end_point_y]; - const totalAngle = getSlopes(calcStartPoint, calcEndPoint); - const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER); - voteVertical += votes[0]; - voteDiagonal += votes[1]; - voteHorizontal += votes[2]; - for (const fingerSlope of fingerSlopes) { - const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER); - voteVertical += fingerVotes[0]; - voteDiagonal += fingerVotes[1]; - voteHorizontal += fingerVotes[2]; - } - let estimatedDirection; - if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) { - estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y); - } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) { - estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); - } else { - estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x); - } - return estimatedDirection; -} -function estimate(landmarks) { - const slopesXY = []; - const slopesYZ = []; - const fingerCurls = []; - const fingerDirections = []; - if (!landmarks) - return { curls: fingerCurls, directions: fingerDirections }; - for (const finger of Finger.all) { - const points = Finger.getPoints(finger); - const slopeAtXY = []; - const slopeAtYZ = []; - for (const point2 of points) { - const point1 = landmarks[point2[0]]; - const point22 = landmarks[point2[1]]; - const slopes = getSlopes(point1, point22); - const slopeXY = slopes[0]; - const slopeYZ = slopes[1]; - slopeAtXY.push(slopeXY); - slopeAtYZ.push(slopeYZ); - } - slopesXY.push(slopeAtXY); - slopesYZ.push(slopeAtYZ); - } - for (const finger of Finger.all) { - const pointIndexAt = finger === Finger.thumb ? 1 : 0; - const fingerPointsAt = Finger.getPoints(finger); - const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]]; - const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]]; - const endPoint = landmarks[fingerPointsAt[3][1]]; - const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint); - const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt)); - fingerCurls[finger] = fingerCurled; - fingerDirections[finger] = fingerPosition; - } - return { curls: fingerCurls, directions: fingerDirections }; -} -function analyze(keypoints) { - if (!keypoints || keypoints.length === 0) - return null; - const estimatorRes = estimate(keypoints); - const landmarks = {}; - for (const fingerIdx of Finger.all) { - landmarks[Finger.getName(fingerIdx)] = { - curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]), - direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]) - }; - } - return landmarks; -} -function match(keypoints) { - const poses = []; - if (!keypoints || keypoints.length === 0) - return poses; - const estimatorRes = estimate(keypoints); - for (const gesture2 of fingergesture_default) { - const confidence = gesture2.matchAgainst(estimatorRes.curls, estimatorRes.directions); - if (confidence >= minConfidence) - poses.push({ name: gesture2.name, confidence }); - } - return poses; -} - -// src/hand/handpose.ts -var meshAnnotations2 = { - thumb: [1, 2, 3, 4], - index: [5, 6, 7, 8], - middle: [9, 10, 11, 12], - ring: [13, 14, 15, 16], - pinky: [17, 18, 19, 20], - palm: [0] -}; -var handDetectorModel; -var handPoseModel; -var handPipeline; -async function predict13(input, config3) { - const predictions = await handPipeline.estimateHands(input, config3); - if (!predictions) - return []; - const hands = []; - for (let i = 0; i < predictions.length; i++) { - const annotations2 = {}; - if (predictions[i].landmarks) { - for (const key of Object.keys(meshAnnotations2)) { - annotations2[key] = meshAnnotations2[key].map((index2) => predictions[i].landmarks[index2]); - } - } - const keypoints = predictions[i].landmarks; - let box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; - let boxRaw = [0, 0, 0, 0]; - if (keypoints && keypoints.length > 0) { - for (const pt of keypoints) { - if (pt[0] < box[0]) - box[0] = pt[0]; - if (pt[1] < box[1]) - box[1] = pt[1]; - if (pt[0] > box[2]) - box[2] = pt[0]; - if (pt[1] > box[3]) - box[3] = pt[1]; - } - box[2] -= box[0]; - box[3] -= box[1]; - 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)]; - } else { - box = 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]; - boxRaw = [ - 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) - ]; - } - const landmarks = analyze(keypoints); - hands.push({ - id: i, - score: Math.round(100 * predictions[i].confidence) / 100, - boxScore: Math.round(100 * predictions[i].boxConfidence) / 100, - fingerScore: Math.round(100 * predictions[i].fingerConfidence) / 100, - label: "hand", - box, - boxRaw, - keypoints, - annotations: annotations2, - landmarks - }); - } - return hands; -} -async function load14(config3) { - var _a, _b; - if (env.initial) { - handDetectorModel = null; - handPoseModel = null; - } - if (!handDetectorModel || !handPoseModel) { - [handDetectorModel, handPoseModel] = await Promise.all([ - config3.hand.enabled ? loadModel((_a = config3.hand.detector) == null ? void 0 : _a.modelPath) : null, - config3.hand.landmarks ? loadModel((_b = config3.hand.skeleton) == null ? void 0 : _b.modelPath) : null - ]); - } 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/tfjs/humangl.ts -var config2 = { - name: "humangl", - priority: 999, - canvas: null, - gl: null, - extensions: [], - webGLattr: { - alpha: false, - antialias: false, - premultipliedAlpha: false, - preserveDrawingBuffer: false, - depth: false, - stencil: false, - failIfMajorPerformanceCaveat: false, - desynchronized: true - } -}; -function extensions() { - const gl = config2.gl; - if (!gl) - return; - config2.extensions = gl.getSupportedExtensions(); -} -async function register(instance2) { - var _a; - if (instance2.config.backend !== "humangl") - return; - if (config2.name in tfjs_esm_exports.engine().registry && (!config2.gl || !config2.gl.getParameter(config2.gl.VERSION))) { - log("error: humangl backend invalid context"); - reset(instance2); - } - if (!tfjs_esm_exports.findBackend(config2.name)) { - try { - config2.canvas = await canvas(100, 100); - } catch (err) { - log("error: cannot create canvas:", err); - return; - } - try { - config2.gl = (_a = config2.canvas) == null ? void 0 : _a.getContext("webgl2", config2.webGLattr); - const glv2 = config2.gl.getParameter(config2.gl.VERSION).includes("2.0"); - if (!glv2) { - log("override: using fallback webgl backend as webgl 2.0 is not detected"); - instance2.config.backend = "webgl"; - return; - } - if (config2.canvas) { - config2.canvas.addEventListener("webglcontextlost", async (e) => { - log("error: humangl:", e.type); - log("possible browser memory leak using webgl or conflict with multiple backend registrations"); - instance2.emit("error"); - throw new Error("backend error: webgl context lost"); - }); - config2.canvas.addEventListener("webglcontextrestored", (e) => { - log("error: humangl context restored:", e); - }); - config2.canvas.addEventListener("webglcontextcreationerror", (e) => { - log("error: humangl context create:", e); - }); - } - } catch (err) { - log("error: cannot get WebGL context:", err); - return; - } - try { - tfjs_esm_exports.setWebGLContext(2, config2.gl); - } catch (err) { - log("error: cannot set WebGL 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; - } - const current = tfjs_esm_exports.backend().getGPGPUContext ? tfjs_esm_exports.backend().getGPGPUContext().gl : null; - if (current) { - log(`humangl webgl version:${current.getParameter(current.VERSION)} renderer:${current.getParameter(current.RENDERER)}`); - } else { - log("error: no current gl context:", current, config2.gl); - return; - } - try { - if (tfjs_esm_exports.env().flagRegistry["WEBGL_VERSION"]) - tfjs_esm_exports.env().set("WEBGL_VERSION", 2); - } catch (err) { - log("error: cannot set WebGL backend flags:", err); - return; - } - extensions(); - log("backend registered:", config2.name); - } -} - -// src/tfjs/backend.ts -function registerCustomOps() { - if (!env.kernels.includes("mod")) { - const kernelMod = { - kernelName: "Mod", - backendName: tfjs_esm_exports.getBackend(), - kernelFunc: (op) => tfjs_esm_exports.tidy(() => tfjs_esm_exports.sub(op.inputs.a, tfjs_esm_exports.mul(tfjs_esm_exports.div(op.inputs.a, op.inputs.b), op.inputs.b))) - }; - tfjs_esm_exports.registerKernel(kernelMod); - env.kernels.push("mod"); - } - if (!env.kernels.includes("floormod")) { - const kernelMod = { - kernelName: "FloorMod", - backendName: tfjs_esm_exports.getBackend(), - kernelFunc: (op) => tfjs_esm_exports.tidy(() => tfjs_esm_exports.floorDiv(op.inputs.a / op.inputs.b) * op.inputs.b + tfjs_esm_exports.mod(op.inputs.a, op.inputs.b)) - }; - tfjs_esm_exports.registerKernel(kernelMod); - env.kernels.push("floormod"); - } -} -async function check(instance2, force = false) { - instance2.state = "backend"; - if (force || env.initial || instance2.config.backend && instance2.config.backend.length > 0 && tfjs_esm_exports.getBackend() !== instance2.config.backend) { - const timeStamp = now(); - if (instance2.config.backend && instance2.config.backend.length > 0) { - if (typeof window === "undefined" && typeof WorkerGlobalScope !== "undefined" && instance2.config.debug) { - if (instance2.config.debug) - log("running inside web worker"); - } - if (env.browser && instance2.config.backend === "tensorflow") { - if (instance2.config.debug) - log("override: backend set to tensorflow while running in browser"); - instance2.config.backend = "humangl"; - } - if (env.node && (instance2.config.backend === "webgl" || instance2.config.backend === "humangl")) { - if (instance2.config.debug) - log(`override: backend set to ${instance2.config.backend} while running in nodejs`); - instance2.config.backend = "tensorflow"; - } - if (env.browser && instance2.config.backend === "webgpu") { - if (typeof navigator === "undefined" || typeof navigator["gpu"] === "undefined") { - log("override: backend set to webgpu but browser does not support webgpu"); - instance2.config.backend = "humangl"; - } else { - const adapter = await navigator["gpu"].requestAdapter(); - if (instance2.config.debug) - log("enumerated webgpu adapter:", adapter); - if (!adapter) { - log("override: backend set to webgpu but browser reports no available gpu"); - instance2.config.backend = "humangl"; - } else { - const adapterInfo = "requestAdapterInfo" in adapter ? await adapter.requestAdapterInfo() : void 0; - log("webgpu adapter info:", adapterInfo); - } - } - } - if (instance2.config.backend === "humangl") - await register(instance2); - const available = Object.keys(tfjs_esm_exports.engine().registryFactory); - if (instance2.config.debug) - log("available backends:", available); - if (!available.includes(instance2.config.backend)) { - log(`error: backend ${instance2.config.backend} not found in registry`); - instance2.config.backend = env.node ? "tensorflow" : "webgl"; - if (instance2.config.debug) - log(`override: setting backend ${instance2.config.backend}`); - } - if (instance2.config.debug) - log("setting backend:", instance2.config.backend); - if (instance2.config.backend === "wasm") { - if (tfjs_esm_exports.env().flagRegistry["CANVAS2D_WILL_READ_FREQUENTLY"]) - tfjs_esm_exports.env().set("CANVAS2D_WILL_READ_FREQUENTLY", true); - if (instance2.config.debug) - log("wasm path:", instance2.config.wasmPath); - if (typeof (tfjs_esm_exports == null ? void 0 : tfjs_esm_exports.setWasmPaths) !== "undefined") - await tfjs_esm_exports.setWasmPaths(instance2.config.wasmPath, instance2.config.wasmPlatformFetch); - else - throw new Error("backend error: attempting to use wasm backend but wasm path is not set"); - const simd = await tfjs_esm_exports.env().getAsync("WASM_HAS_SIMD_SUPPORT"); - const mt = await tfjs_esm_exports.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"); - if (instance2.config.debug) - log(`wasm execution: ${simd ? "SIMD" : "no SIMD"} ${mt ? "multithreaded" : "singlethreaded"}`); - if (instance2.config.debug && !simd) - log("warning: wasm simd support is not enabled"); - } - try { - await tfjs_esm_exports.setBackend(instance2.config.backend); - await tfjs_esm_exports.ready(); - init(); - } catch (err) { - log("error: cannot set backend:", instance2.config.backend, err); - return false; - } - } - if (tfjs_esm_exports.getBackend() === "humangl") { - if (tfjs_esm_exports.env().flagRegistry["CHECK_COMPUTATION_FOR_ERRORS"]) - tfjs_esm_exports.env().set("CHECK_COMPUTATION_FOR_ERRORS", false); - if (tfjs_esm_exports.env().flagRegistry["WEBGL_CPU_FORWARD"]) - tfjs_esm_exports.env().set("WEBGL_CPU_FORWARD", true); - if (tfjs_esm_exports.env().flagRegistry["WEBGL_USE_SHAPES_UNIFORMS"]) - tfjs_esm_exports.env().set("WEBGL_USE_SHAPES_UNIFORMS", true); - if (tfjs_esm_exports.env().flagRegistry["CPU_HANDOFF_SIZE_THRESHOLD"]) - tfjs_esm_exports.env().set("CPU_HANDOFF_SIZE_THRESHOLD", 256); - if (tfjs_esm_exports.env().flagRegistry["WEBGL_EXP_CONV"]) - tfjs_esm_exports.env().set("WEBGL_EXP_CONV", true); - if (tfjs_esm_exports.env().flagRegistry["USE_SETTIMEOUTCUSTOM"]) - tfjs_esm_exports.env().set("USE_SETTIMEOUTCUSTOM", true); - if (typeof instance2.config["deallocate"] !== "undefined" && instance2.config["deallocate"]) { - log("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:", true); - tfjs_esm_exports.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD", 0); - } - if (tfjs_esm_exports.backend().getGPGPUContext) { - const gl = await tfjs_esm_exports.backend().getGPGPUContext().gl; - if (instance2.config.debug) - log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`); - } - } - if (tfjs_esm_exports.getBackend() === "webgpu") { - } - tfjs_esm_exports.enableProdMode(); - await tfjs_esm_exports.ready(); - instance2.performance.initBackend = Math.trunc(now() - timeStamp); - instance2.config.backend = tfjs_esm_exports.getBackend(); - await env.updateBackend(); - registerCustomOps(); - } - return true; -} -function fakeOps(kernelNames, config3) { - for (const kernelName of kernelNames) { - const kernelConfig = { - kernelName, - backendName: config3.backend, - kernelFunc: () => { - if (config3.debug) - log("kernelFunc", kernelName, config3.backend); - } - }; - tfjs_esm_exports.registerKernel(kernelConfig); - } - env.kernels = tfjs_esm_exports.getKernelsForBackend(tfjs_esm_exports.getBackend()).map((kernel) => kernel.kernelName.toLowerCase()); -} - -// src/hand/handtrack.ts -var models2 = [null, null]; -var modelOutputNodes = ["StatefulPartitionedCall/Postprocessor/Slice", "StatefulPartitionedCall/Postprocessor/ExpandDims_1"]; -var inputSize7 = [[0, 0], [0, 0]]; -var classes = ["hand", "fist", "pinch", "point", "face", "tip", "pinchtip"]; -var faceIndex = 4; -var boxExpandFact = 1.6; -var maxDetectorResolution = 512; -var detectorExpandFact = 1.4; -var skipped12 = Number.MAX_SAFE_INTEGER; -var lastTime13 = 0; -var outputSize = [0, 0]; -var cache4 = { - boxes: [], - hands: [] -}; -var fingerMap = { - thumb: [1, 2, 3, 4], - index: [5, 6, 7, 8], - middle: [9, 10, 11, 12], - ring: [13, 14, 15, 16], - pinky: [17, 18, 19, 20], - base: [0], - palm: [0, 17, 13, 9, 5, 1, 0] -}; -async function loadDetect2(config3) { - var _a; - if (env.initial) - models2[0] = null; - if (!models2[0]) { - fakeOps(["tensorlistreserve", "enter", "tensorlistfromtensor", "merge", "loopcond", "switch", "exit", "tensorliststack", "nextiteration", "tensorlistsetitem", "tensorlistgetitem", "reciprocal", "shape", "split", "where"], config3); - models2[0] = await loadModel((_a = config3.hand.detector) == null ? void 0 : _a.modelPath); - const inputs = Object.values(models2[0].modelSignature["inputs"]); - inputSize7[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; - inputSize7[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; - } else if (config3.debug) - log("cached model:", models2[0]["modelUrl"]); - return models2[0]; -} -async function loadSkeleton(config3) { - var _a; - if (env.initial) - models2[1] = null; - if (!models2[1]) { - models2[1] = await loadModel((_a = config3.hand.skeleton) == null ? void 0 : _a.modelPath); - const inputs = Object.values(models2[1].modelSignature["inputs"]); - inputSize7[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0; - inputSize7[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; - } else if (config3.debug) - log("cached model:", models2[1]["modelUrl"]); - return models2[1]; -} -async function detectHands(input, config3) { - const hands = []; - if (!input || !models2[0]) - return hands; - const t = {}; - const ratio = (input.shape[2] || 1) / (input.shape[1] || 1); - const height = Math.min(Math.round((input.shape[1] || 0) / 8) * 8, maxDetectorResolution); - const width = Math.round(height * ratio / 8) * 8; - t.resize = tfjs_esm_exports.image.resizeBilinear(input, [height, width]); - t.cast = tfjs_esm_exports.cast(t.resize, "int32"); - [t.rawScores, t.rawBoxes] = await models2[0].executeAsync(t.cast, modelOutputNodes); - t.boxes = tfjs_esm_exports.squeeze(t.rawBoxes, [0, 2]); - t.scores = tfjs_esm_exports.squeeze(t.rawScores, [0]); - const classScores = tfjs_esm_exports.unstack(t.scores, 1); - tfjs_esm_exports.dispose(classScores[faceIndex]); - classScores.splice(faceIndex, 1); - t.filtered = tfjs_esm_exports.stack(classScores, 1); - tfjs_esm_exports.dispose(classScores); - t.max = tfjs_esm_exports.max(t.filtered, 1); - t.argmax = tfjs_esm_exports.argMax(t.filtered, 1); - let id = 0; - t.nms = tfjs_esm_exports.image.nonMaxSuppression(t.boxes, t.max, (config3.hand.maxDetected || 0) + 1, config3.hand.iouThreshold || 0, config3.hand.minConfidence || 1); - const nms = await t.nms.data(); - const scores = await t.max.data(); - const classNum = await t.argmax.data(); - for (const nmsIndex of Array.from(nms)) { - const boxSlice = tfjs_esm_exports.slice(t.boxes, nmsIndex, 1); - const boxYX = await boxSlice.data(); - tfjs_esm_exports.dispose(boxSlice); - const boxData = [boxYX[1], boxYX[0], boxYX[3] - boxYX[1], boxYX[2] - boxYX[0]]; - const boxRaw = scale(boxData, detectorExpandFact); - const boxFull = [Math.trunc(boxData[0] * outputSize[0]), Math.trunc(boxData[1] * outputSize[1]), Math.trunc(boxData[2] * outputSize[0]), Math.trunc(boxData[3] * outputSize[1])]; - const score = scores[nmsIndex]; - const label = classes[classNum[nmsIndex]]; - const hand3 = { id: id++, score, box: boxFull, boxRaw, label }; - hands.push(hand3); - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - hands.sort((a, b) => b.score - a.score); - if (hands.length > (config3.hand.maxDetected || 1)) - hands.length = config3.hand.maxDetected || 1; - return hands; -} -async function detectFingers(input, h, config3) { - const hand3 = { - id: h.id, - score: Math.round(100 * h.score) / 100, - boxScore: Math.round(100 * h.score) / 100, - fingerScore: 0, - box: h.box, - boxRaw: h.boxRaw, - label: h.label, - keypoints: [], - landmarks: {}, - annotations: {} - }; - if (input && models2[1] && config3.hand.landmarks && h.score > (config3.hand.minConfidence || 0)) { - const t = {}; - const boxCrop = [h.boxRaw[1], h.boxRaw[0], h.boxRaw[3] + h.boxRaw[1], h.boxRaw[2] + h.boxRaw[0]]; - t.crop = tfjs_esm_exports.image.cropAndResize(input, [boxCrop], [0], [inputSize7[1][0], inputSize7[1][1]], "bilinear"); - t.div = tfjs_esm_exports.div(t.crop, constants.tf255); - [t.score, t.keypoints] = models2[1].execute(t.div, ["Identity_1", "Identity"]); - const rawScore = (await t.score.data())[0]; - const score = (100 - Math.trunc(100 / (1 + Math.exp(rawScore)))) / 100; - if (score >= (config3.hand.minConfidence || 0)) { - hand3.fingerScore = score; - t.reshaped = tfjs_esm_exports.reshape(t.keypoints, [-1, 3]); - const coordsData = await t.reshaped.array(); - const coordsRaw = coordsData.map((kpt4) => [kpt4[0] / inputSize7[1][1], kpt4[1] / inputSize7[1][0], kpt4[2] || 0]); - const coordsNorm = coordsRaw.map((kpt4) => [kpt4[0] * h.boxRaw[2], kpt4[1] * h.boxRaw[3], kpt4[2] || 0]); - hand3.keypoints = coordsNorm.map((kpt4) => [outputSize[0] * (kpt4[0] + h.boxRaw[0]), outputSize[1] * (kpt4[1] + h.boxRaw[1]), kpt4[2] || 0]); - hand3.landmarks = analyze(hand3.keypoints); - for (const key of Object.keys(fingerMap)) { - hand3.annotations[key] = fingerMap[key].map((index2) => hand3.landmarks && hand3.keypoints[index2] ? hand3.keypoints[index2] : null); - } - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - } - return hand3; -} -async function predict14(input, config3) { - var _a, _b; - if (!models2[0] || !models2[1] || !((_a = models2[0]) == null ? void 0 : _a.inputs[0].shape) || !((_b = models2[1]) == null ? void 0 : _b.inputs[0].shape)) - return []; - outputSize = [input.shape[2] || 0, input.shape[1] || 0]; - skipped12++; - const skipTime = (config3.hand.skipTime || 0) > now() - lastTime13; - const skipFrame = skipped12 < (config3.hand.skipFrames || 0); - if (config3.skipAllowed && skipTime && skipFrame) { - return cache4.hands; - } - return new Promise(async (resolve) => { - const skipTimeExtended = 3 * (config3.hand.skipTime || 0) > now() - lastTime13; - const skipFrameExtended = skipped12 < 3 * (config3.hand.skipFrames || 0); - if (config3.skipAllowed && cache4.hands.length === config3.hand.maxDetected) { - cache4.hands = await Promise.all(cache4.boxes.map((handBox) => detectFingers(input, handBox, config3))); - } else if (config3.skipAllowed && skipTimeExtended && skipFrameExtended && cache4.hands.length > 0) { - cache4.hands = await Promise.all(cache4.boxes.map((handBox) => detectFingers(input, handBox, config3))); - } else { - cache4.boxes = await detectHands(input, config3); - lastTime13 = now(); - cache4.hands = await Promise.all(cache4.boxes.map((handBox) => detectFingers(input, handBox, config3))); - skipped12 = 0; - } - const oldCache = [...cache4.boxes]; - cache4.boxes.length = 0; - if (config3.cacheSensitivity > 0) { - for (let i = 0; i < cache4.hands.length; i++) { - const boxKpt = square(cache4.hands[i].keypoints, outputSize); - if (boxKpt.box[2] / (input.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input.shape[1] || 1) > 0.05 && cache4.hands[i].fingerScore && cache4.hands[i].fingerScore > (config3.hand.minConfidence || 0)) { - const boxScale = scale(boxKpt.box, boxExpandFact); - const boxScaleRaw = scale(boxKpt.boxRaw, boxExpandFact); - cache4.boxes.push({ ...oldCache[i], box: boxScale, boxRaw: boxScaleRaw }); - } - } - } - for (let i = 0; i < cache4.hands.length; i++) { - const bbox = calc(cache4.hands[i].keypoints, outputSize); - cache4.hands[i].box = bbox.box; - cache4.hands[i].boxRaw = bbox.boxRaw; - } - resolve(cache4.hands); - }); -} - -// src/face/liveness.ts -var model14; -var cached2 = []; -var skipped13 = Number.MAX_SAFE_INTEGER; -var lastCount9 = 0; -var lastTime14 = 0; -async function load15(config3) { - var _a; - if (env.initial) - model14 = null; - if (!model14) - model14 = await loadModel((_a = config3.face.liveness) == null ? void 0 : _a.modelPath); - else if (config3.debug) - log("cached model:", model14["modelUrl"]); - return model14; -} -async function predict15(image25, config3, idx, count2) { - var _a, _b; - if (!model14) - return 0; - const skipTime = (((_a = config3.face.liveness) == null ? void 0 : _a.skipTime) || 0) > now() - lastTime14; - const skipFrame = skipped13 < (((_b = config3.face.liveness) == null ? void 0 : _b.skipFrames) || 0); - if (config3.skipAllowed && skipTime && skipFrame && lastCount9 === count2 && cached2[idx]) { - skipped13++; - return cached2[idx]; - } - skipped13 = 0; - return new Promise(async (resolve) => { - const resize = tfjs_esm_exports.image.resizeBilinear(image25, [(model14 == null ? void 0 : model14.inputs[0].shape) ? model14.inputs[0].shape[2] : 0, (model14 == null ? void 0 : model14.inputs[0].shape) ? model14.inputs[0].shape[1] : 0], false); - const res = model14 == null ? void 0 : model14.execute(resize); - const num = (await res.data())[0]; - cached2[idx] = Math.round(100 * num) / 100; - lastCount9 = count2; - lastTime14 = now(); - tfjs_esm_exports.dispose([resize, res]); - resolve(cached2[idx]); - }); -} - -// src/body/movenetcoords.ts -var movenetcoords_exports = {}; -__export(movenetcoords_exports, { - connected: () => connected3, - horizontal: () => horizontal, - kpt: () => kpt3, - relative: () => relative, - vertical: () => vertical -}); -var kpt3 = [ - "nose", - "leftEye", - "rightEye", - "leftEar", - "rightEar", - "leftShoulder", - "rightShoulder", - "leftElbow", - "rightElbow", - "leftWrist", - "rightWrist", - "leftHip", - "rightHip", - "leftKnee", - "rightKnee", - "leftAnkle", - "rightAnkle" -]; -var horizontal = [ - ["leftEye", "rightEye"], - ["leftEar", "rightEar"], - ["leftShoulder", "rightShoulder"], - ["leftElbow", "rightElbow"], - ["leftWrist", "rightWrist"], - ["leftHip", "rightHip"], - ["leftKnee", "rightKnee"], - ["leftAnkle", "rightAnkle"] -]; -var vertical = [ - ["leftKnee", "leftShoulder"], - ["rightKnee", "rightShoulder"], - ["leftAnkle", "leftKnee"], - ["rightAnkle", "rightKnee"] -]; -var relative = [ - [["leftHip", "rightHip"], ["leftShoulder", "rightShoulder"]], - [["leftElbow", "rightElbow"], ["leftShoulder", "rightShoulder"]] -]; -var connected3 = { - leftLeg: ["leftHip", "leftKnee", "leftAnkle"], - rightLeg: ["rightHip", "rightKnee", "rightAnkle"], - torso: ["leftShoulder", "rightShoulder", "rightHip", "leftHip", "leftShoulder"], - leftArm: ["leftShoulder", "leftElbow", "leftWrist"], - rightArm: ["rightShoulder", "rightElbow", "rightWrist"], - head: [] -}; - -// src/body/movenetfix.ts -var maxJitter = 5e-3; -var cache5 = { - keypoints: [], - padding: [[0, 0], [0, 0], [0, 0], [0, 0]] -}; -function bodyParts(body4) { - for (const pair of horizontal) { - const left = body4.keypoints.findIndex((kp) => kp.part === pair[0]); - const right = body4.keypoints.findIndex((kp) => kp.part === pair[1]); - if (body4.keypoints[left] && body4.keypoints[right]) { - if (body4.keypoints[left].position[0] < body4.keypoints[right].position[0]) { - const tmp = body4.keypoints[left]; - body4.keypoints[left] = body4.keypoints[right]; - body4.keypoints[right] = tmp; - } - } - } - for (const pair of vertical) { - const lower = body4.keypoints.findIndex((kp) => kp && kp.part === pair[0]); - const higher = body4.keypoints.findIndex((kp) => kp && kp.part === pair[1]); - if (body4.keypoints[lower] && body4.keypoints[higher]) { - if (body4.keypoints[lower].position[1] < body4.keypoints[higher].position[1]) { - body4.keypoints.splice(lower, 1); - } - } - } - for (const [pair, compare2] of relative) { - const left = body4.keypoints.findIndex((kp) => kp && kp.part === pair[0]); - const right = body4.keypoints.findIndex((kp) => kp && kp.part === pair[1]); - const leftTo = body4.keypoints.findIndex((kp) => kp && kp.part === compare2[0]); - const rightTo = body4.keypoints.findIndex((kp) => kp && kp.part === compare2[1]); - if (!body4.keypoints[leftTo] || !body4.keypoints[rightTo]) - continue; - const distanceLeft = body4.keypoints[left] ? [ - Math.abs(body4.keypoints[leftTo].position[0] - body4.keypoints[left].position[0]), - Math.abs(body4.keypoints[rightTo].position[0] - body4.keypoints[left].position[0]) - ] : [0, 0]; - const distanceRight = body4.keypoints[right] ? [ - Math.abs(body4.keypoints[rightTo].position[0] - body4.keypoints[right].position[0]), - Math.abs(body4.keypoints[leftTo].position[0] - body4.keypoints[right].position[0]) - ] : [0, 0]; - if (distanceLeft[0] > distanceLeft[1] || distanceRight[0] > distanceRight[1]) { - const tmp = body4.keypoints[left]; - body4.keypoints[left] = body4.keypoints[right]; - body4.keypoints[right] = tmp; - } - } -} -function jitter(keypoints) { - for (let i = 0; i < keypoints.length; i++) { - if (keypoints[i] && cache5.keypoints[i]) { - const diff = [Math.abs(keypoints[i].positionRaw[0] - cache5.keypoints[i].positionRaw[0]), Math.abs(keypoints[i].positionRaw[1] - cache5.keypoints[i].positionRaw[1])]; - if (diff[0] < maxJitter && diff[1] < maxJitter) { - keypoints[i] = cache5.keypoints[i]; - } else { - cache5.keypoints[i] = keypoints[i]; - } - } else { - cache5.keypoints[i] = keypoints[i]; - } - } - return keypoints; -} -function padInput(input, inputSize10) { - const t = {}; - if (!input.shape || !input.shape[1] || !input.shape[2]) - return input; - cache5.padding = [ - [0, 0], - [input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0], - [input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0], - [0, 0] - ]; - t.pad = tfjs_esm_exports.pad(input, cache5.padding); - t.resize = tfjs_esm_exports.image.resizeBilinear(t.pad, [inputSize10, inputSize10]); - const final = tfjs_esm_exports.cast(t.resize, "int32"); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return final; -} -function rescaleBody(body4, outputSize2) { - body4.keypoints = body4.keypoints.filter((kpt4) => kpt4 && kpt4.position); - for (const kpt4 of body4.keypoints) { - kpt4.position = [ - kpt4.position[0] * (outputSize2[0] + cache5.padding[2][0] + cache5.padding[2][1]) / outputSize2[0] - cache5.padding[2][0], - kpt4.position[1] * (outputSize2[1] + cache5.padding[1][0] + cache5.padding[1][1]) / outputSize2[1] - cache5.padding[1][0] - ]; - kpt4.positionRaw = [ - kpt4.position[0] / outputSize2[0], - kpt4.position[1] / outputSize2[1] - ]; - } - const rescaledBoxes = calc(body4.keypoints.map((pt) => pt.position), outputSize2); - body4.box = rescaledBoxes.box; - body4.boxRaw = rescaledBoxes.boxRaw; - return body4; -} - -// src/body/movenet.ts -var model15; -var inputSize8 = 0; -var skipped14 = Number.MAX_SAFE_INTEGER; -var cache6 = { - boxes: [], - bodies: [], - last: 0 -}; -async function load16(config3) { - if (env.initial) - model15 = null; - if (!model15) { - fakeOps(["size"], config3); - model15 = await loadModel(config3.body.modelPath); - } else if (config3.debug) - log("cached model:", model15["modelUrl"]); - inputSize8 = model15.inputs[0].shape ? model15.inputs[0].shape[2] : 0; - if (inputSize8 < 64) - inputSize8 = 256; - return model15; -} -async function parseSinglePose(res, config3, image25) { - const kpt4 = res[0][0]; - const keypoints = []; - let score = 0; - for (let id = 0; id < kpt4.length; id++) { - score = kpt4[id][2]; - if (score > config3.body.minConfidence) { - const positionRaw = [kpt4[id][1], kpt4[id][0]]; - keypoints.push({ - score: Math.round(100 * score) / 100, - part: kpt3[id], - positionRaw, - position: [ - Math.round((image25.shape[2] || 0) * positionRaw[0]), - Math.round((image25.shape[1] || 0) * positionRaw[1]) - ] - }); - } - } - score = keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); - const bodies = []; - const newBox = calc(keypoints.map((pt) => pt.position), [image25.shape[2], image25.shape[1]]); - const annotations2 = {}; - for (const [name, indexes] of Object.entries(connected3)) { - const pt = []; - for (let i = 0; i < indexes.length - 1; i++) { - const pt0 = keypoints.find((kp) => kp.part === indexes[i]); - const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]); - if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) - pt.push([pt0.position, pt1.position]); - } - annotations2[name] = pt; - } - const body4 = { id: 0, score, box: newBox.box, boxRaw: newBox.boxRaw, keypoints, annotations: annotations2 }; - bodyParts(body4); - bodies.push(body4); - return bodies; -} -async function parseMultiPose(res, config3, image25) { - const bodies = []; - for (let id = 0; id < res[0].length; id++) { - const kpt4 = res[0][id]; - const totalScore = Math.round(100 * kpt4[51 + 4]) / 100; - if (totalScore > config3.body.minConfidence) { - const keypoints = []; - for (let i = 0; i < 17; i++) { - const score = kpt4[3 * i + 2]; - if (score > config3.body.minConfidence) { - const positionRaw = [kpt4[3 * i + 1], kpt4[3 * i + 0]]; - keypoints.push({ - part: kpt3[i], - score: Math.round(100 * score) / 100, - positionRaw, - position: [Math.round((image25.shape[2] || 0) * positionRaw[0]), Math.round((image25.shape[1] || 0) * positionRaw[1])] - }); - } - } - const newBox = calc(keypoints.map((pt) => pt.position), [image25.shape[2], image25.shape[1]]); - const annotations2 = {}; - for (const [name, indexes] of Object.entries(connected3)) { - const pt = []; - for (let i = 0; i < indexes.length - 1; i++) { - const pt0 = keypoints.find((kp) => kp.part === indexes[i]); - const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]); - if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) - pt.push([pt0.position, pt1.position]); - } - annotations2[name] = pt; - } - const body4 = { id, score: totalScore, box: newBox.box, boxRaw: newBox.boxRaw, keypoints: [...keypoints], annotations: annotations2 }; - bodyParts(body4); - bodies.push(body4); - } - } - bodies.sort((a, b) => b.score - a.score); - if (bodies.length > config3.body.maxDetected) - bodies.length = config3.body.maxDetected; - return bodies; -} -async function predict16(input, config3) { - if (!model15 || !(model15 == null ? void 0 : model15.inputs[0].shape)) - return []; - if (!config3.skipAllowed) - cache6.boxes.length = 0; - skipped14++; - const skipTime = (config3.body.skipTime || 0) > now() - cache6.last; - const skipFrame = skipped14 < (config3.body.skipFrames || 0); - if (config3.skipAllowed && skipTime && skipFrame) { - return cache6.bodies; - } - return new Promise(async (resolve) => { - const t = {}; - skipped14 = 0; - t.input = padInput(input, inputSize8); - t.res = model15 == null ? void 0 : model15.execute(t.input); - cache6.last = now(); - const res = await t.res.array(); - cache6.bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input) : await parseMultiPose(res, config3, input); - for (const body4 of cache6.bodies) { - rescaleBody(body4, [input.shape[2] || 1, input.shape[1] || 1]); - jitter(body4.keypoints); - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - resolve(cache6.bodies); - }); -} - -// src/object/nanodet.ts -var model16; -var last10 = []; -var lastTime15 = 0; -var skipped15 = Number.MAX_SAFE_INTEGER; -var inputSize9 = 0; -var scaleBox = 2.5; -async function load17(config3) { - if (!model16 || env.initial) { - model16 = await loadModel(config3.object.modelPath); - const inputs = Object.values(model16.modelSignature["inputs"]); - inputSize9 = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0; - } else if (config3.debug) - log("cached model:", model16["modelUrl"]); - return model16; -} -async function process4(res, outputShape, config3) { - let id = 0; - let results = []; - for (const strideSize of [1, 2, 4]) { - const baseSize = strideSize * 13; - const scoresT = tfjs_esm_exports.squeeze(res.find((a) => a.shape[1] === baseSize ** 2 && (a.shape[2] || 0) === labels.length)); - const scores = await scoresT.array(); - const featuresT = tfjs_esm_exports.squeeze(res.find((a) => a.shape[1] === baseSize ** 2 && (a.shape[2] || 0) < labels.length)); - const boxesMaxT = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); - const boxIdxT = boxesMaxT.argMax(2); - const boxIdx = await boxIdxT.array(); - for (let i = 0; i < scoresT.shape[0]; i++) { - for (let j = 0; j < scoresT.shape[1]; j++) { - const score = scores[i][j]; - if (score > (config3.object.minConfidence || 0) && 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 / inputSize9)); - 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 boxRaw = [x, y, w, h]; - boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); - const box = [ - boxRaw[0] * outputShape[0], - boxRaw[1] * outputShape[1], - boxRaw[2] * outputShape[0], - boxRaw[3] * outputShape[1] - ]; - const result = { - id: id++, - score: Math.round(100 * score) / 100, - class: j + 1, - label: labels[j].label, - box: box.map((a) => Math.trunc(a)), - boxRaw - }; - results.push(result); - } - } - } - tfjs_esm_exports.dispose([scoresT, featuresT, boxesMaxT, boxIdxT]); - } - 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 = tfjs_esm_exports.image.nonMaxSuppression(nmsBoxes, nmsScores, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence); - nmsIdx = await nms.data(); - tfjs_esm_exports.dispose(nms); - } - results = results.filter((_val, idx) => nmsIdx.includes(idx)).sort((a, b) => b.score - a.score); - return results; -} -async function predict17(image25, config3) { - const skipTime = (config3.object.skipTime || 0) > now() - lastTime15; - const skipFrame = skipped15 < (config3.object.skipFrames || 0); - if (config3.skipAllowed && skipTime && skipFrame && last10.length > 0) { - skipped15++; - return last10; - } - skipped15 = 0; - if (!env.kernels.includes("mod") || !env.kernels.includes("sparsetodense")) - return last10; - return new Promise(async (resolve) => { - const outputSize2 = [image25.shape[2] || 0, image25.shape[1] || 0]; - const resizeT = tfjs_esm_exports.image.resizeBilinear(image25, [inputSize9, inputSize9], false); - const normT = tfjs_esm_exports.div(resizeT, constants.tf255); - const transposeT = tfjs_esm_exports.transpose(normT, [0, 3, 1, 2]); - let objectT; - if (config3.object.enabled) - objectT = model16.execute(transposeT); - lastTime15 = now(); - const obj = await process4(objectT, outputSize2, config3); - last10 = obj; - tfjs_esm_exports.dispose([resizeT, normT, transposeT, ...objectT]); - resolve(obj); - }); -} - -// src/body/posenetutils.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"] -]; -function getBoundingBox(keypoints) { - const coord = keypoints.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(poses, [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, part, position }) => ({ - score, - part, - position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)], - positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] - })), - annotations: {} - }); - const scaledPoses = poses.map((pose, i) => scalePose(pose, i)); - return scaledPoses; -} -var MaxHeap = class { - constructor(maxSize2, getElementValue) { - __publicField(this, "priorityQueue"); - __publicField(this, "numberOfElements"); - __publicField(this, "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 max4 = this.priorityQueue[0]; - this.exchange(0, this.numberOfElements--); - this.sink(0); - this.priorityQueue[this.numberOfElements + 1] = null; - return max4; - } - 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, min2, max4) { - if (a < min2) - return min2; - if (a > max4) - return max4; - 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/body/posenet.ts -var model17; -var poseNetOutputs = ["MobilenetV1/offset_2/BiasAdd", "MobilenetV1/heatmap_2/BiasAdd", "MobilenetV1/displacement_fwd_2/BiasAdd", "MobilenetV1/displacement_bwd_2/BiasAdd"]; -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 score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId); - return { position: targetKeypoint, part: partNames[targetId], score }; -} -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 keypoints = new Array(numParts); - const rootPoint = getImageCoords(root.part, outputStride, offsets); - keypoints[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 (keypoints[sourceId] && !keypoints[targetId]) { - keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd); - } - } - for (let edge = 0; edge < numEdges; ++edge) { - const sourceId = edgesBwd[edge]; - const targetId = edgesFwd[edge]; - if (keypoints[sourceId] && !keypoints[targetId]) { - keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd); - } - } - return keypoints; -} -function scoreIsMaximumInLocalWindow(keypointId, score, 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) > score) { - localMaximum = false; - break; - } - } - if (!localMaximum) - break; - } - return localMaximum; -} -function buildPartWithScoreQueue(minConfidence2, scores) { - const [height, width, numKeypoints] = scores.shape; - const queue = new MaxHeap(height * width * numKeypoints, ({ score }) => score); - for (let heatmapY = 0; heatmapY < height; ++heatmapY) { - for (let heatmapX = 0; heatmapX < width; ++heatmapX) { - for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) { - const score = scores.get(heatmapY, heatmapX, keypointId); - if (score < minConfidence2) - continue; - if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) - queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } }); - } - } - } - return queue; -} -function withinRadius(poses, { x, y }, keypointId) { - return poses.some(({ keypoints }) => { - var _a; - const correspondingKeypoint = (_a = keypoints[keypointId]) == null ? void 0 : _a.position; - if (!correspondingKeypoint) - return false; - return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius; - }); -} -function getInstanceScore(existingPoses, keypoints) { - const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => { - if (!withinRadius(existingPoses, position, keypointId)) - result += score; - return result; - }, 0); - return notOverlappedKeypointScores / keypoints.length; -} -function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence2) { - const poses = []; - const queue = buildPartWithScoreQueue(minConfidence2, scores); - while (poses.length < maxDetected && !queue.empty()) { - const root = queue.dequeue(); - const rootImageCoords = getImageCoords(root.part, outputStride, offsets); - if (withinRadius(poses, rootImageCoords, root.part.id)) - continue; - let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd); - keypoints = keypoints.filter((a) => a.score > minConfidence2); - const score = getInstanceScore(poses, keypoints); - const box = getBoundingBox(keypoints); - if (score > minConfidence2) - poses.push({ keypoints, box, score: Math.round(100 * score) / 100 }); - } - return poses; -} -async function predict18(input, config3) { - const res = tfjs_esm_exports.tidy(() => { - if (!model17.inputs[0].shape) - return []; - const resized = tfjs_esm_exports.image.resizeBilinear(input, [model17.inputs[0].shape[2], model17.inputs[0].shape[1]]); - const normalized = tfjs_esm_exports.sub(tfjs_esm_exports.div(tfjs_esm_exports.cast(resized, "float32"), 127.5), 1); - const results = model17.execute(normalized, poseNetOutputs); - const results3d = results.map((y) => tfjs_esm_exports.squeeze(y, [0])); - results3d[1] = tfjs_esm_exports.sigmoid(results3d[1]); - return results3d; - }); - const buffers = await Promise.all(res.map((tensor3) => tensor3.buffer())); - for (const t of res) - tfjs_esm_exports.dispose(t); - const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config3.body.maxDetected, config3.body.minConfidence); - if (!model17.inputs[0].shape) - return []; - const scaled = scalePoses(decoded, [input.shape[1], input.shape[2]], [model17.inputs[0].shape[2], model17.inputs[0].shape[1]]); - return scaled; -} -async function load18(config3) { - if (!model17 || env.initial) - model17 = await loadModel(config3.body.modelPath); - else if (config3.debug) - log("cached model:", model17["modelUrl"]); - return model17; -} - -// src/segmentation/segmentation.ts -var model18; -var busy = false; -async function load19(config3) { - if (!model18 || env.initial) - model18 = await loadModel(config3.segmentation.modelPath); - else if (config3.debug) - log("cached model:", model18["modelUrl"]); - return model18; -} -async function process5(input, background, config3) { - var _a, _b; - if (busy) - return { data: [], canvas: null, alpha: null }; - busy = true; - if (!model18) - await load19(config3); - const inputImage = await process2(input, config3); - const width = ((_a = inputImage.tensor) == null ? void 0 : _a.shape[2]) || 0; - const height = ((_b = inputImage.tensor) == null ? void 0 : _b.shape[1]) || 0; - if (!inputImage.tensor) - return { data: [], canvas: null, alpha: null }; - const t = {}; - t.resize = tfjs_esm_exports.image.resizeBilinear(inputImage.tensor, [model18.inputs[0].shape ? model18.inputs[0].shape[1] : 0, model18.inputs[0].shape ? model18.inputs[0].shape[2] : 0], false); - tfjs_esm_exports.dispose(inputImage.tensor); - t.norm = tfjs_esm_exports.div(t.resize, constants.tf255); - t.res = model18.execute(t.norm); - t.squeeze = tfjs_esm_exports.squeeze(t.res, 0); - if (t.squeeze.shape[2] === 2) { - t.softmax = tfjs_esm_exports.softmax(t.squeeze); - [t.bg, t.fg] = tfjs_esm_exports.unstack(t.softmax, 2); - t.expand = tfjs_esm_exports.expandDims(t.fg, 2); - t.pad = tfjs_esm_exports.expandDims(t.expand, 0); - t.crop = tfjs_esm_exports.image.cropAndResize(t.pad, [[0, 0, 0.5, 0.5]], [0], [width, height]); - t.data = tfjs_esm_exports.squeeze(t.crop, 0); - } else { - t.data = tfjs_esm_exports.image.resizeBilinear(t.squeeze, [height, width]); - } - const data = Array.from(await t.data.data()); - if (env.node && !env.Canvas && typeof ImageData === "undefined") { - if (config3.debug) - log("canvas support missing"); - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - return { data, canvas: null, alpha: null }; - } - const alphaCanvas = canvas(width, height); - if (tfjs_esm_exports.browser) - await tfjs_esm_exports.browser.toPixels(t.data, alphaCanvas); - const alphaCtx = alphaCanvas.getContext("2d"); - if (config3.segmentation.blur && config3.segmentation.blur > 0) - alphaCtx.filter = `blur(${config3.segmentation.blur}px)`; - const alphaData = alphaCtx.getImageData(0, 0, width, height); - const compositeCanvas = canvas(width, height); - const compositeCtx = compositeCanvas.getContext("2d"); - if (inputImage.canvas) - compositeCtx.drawImage(inputImage.canvas, 0, 0); - compositeCtx.globalCompositeOperation = "darken"; - if (config3.segmentation.blur && config3.segmentation.blur > 0) - compositeCtx.filter = `blur(${config3.segmentation.blur}px)`; - compositeCtx.drawImage(alphaCanvas, 0, 0); - compositeCtx.globalCompositeOperation = "source-over"; - compositeCtx.filter = "none"; - const compositeData = compositeCtx.getImageData(0, 0, width, height); - for (let i = 0; i < width * height; i++) - compositeData.data[4 * i + 3] = alphaData.data[4 * i + 0]; - compositeCtx.putImageData(compositeData, 0, 0); - let mergedCanvas = null; - if (background && compositeCanvas) { - mergedCanvas = canvas(width, height); - const bgImage = await process2(background, config3); - tfjs_esm_exports.dispose(bgImage.tensor); - const ctxMerge = mergedCanvas.getContext("2d"); - ctxMerge.drawImage(bgImage.canvas, 0, 0, mergedCanvas.width, mergedCanvas.height); - ctxMerge.drawImage(compositeCanvas, 0, 0); - } - Object.keys(t).forEach((tensor3) => tfjs_esm_exports.dispose(t[tensor3])); - busy = false; - return { data, canvas: compositeCanvas, alpha: alphaCanvas }; -} - -// src/models.ts -var Models = class { - constructor() { - __publicField(this, "ssrnetage", null); - __publicField(this, "gear", null); - __publicField(this, "blazeposedetect", null); - __publicField(this, "blazepose", null); - __publicField(this, "centernet", null); - __publicField(this, "efficientpose", null); - __publicField(this, "mobilefacenet", null); - __publicField(this, "insightface", null); - __publicField(this, "emotion", null); - __publicField(this, "facedetect", null); - __publicField(this, "faceiris", null); - __publicField(this, "facemesh", null); - __publicField(this, "faceres", null); - __publicField(this, "ssrnetgender", null); - __publicField(this, "handpose", null); - __publicField(this, "handskeleton", null); - __publicField(this, "handtrack", null); - __publicField(this, "liveness", null); - __publicField(this, "movenet", null); - __publicField(this, "nanodet", null); - __publicField(this, "posenet", null); - __publicField(this, "segmentation", null); - __publicField(this, "antispoof", null); - } -}; -var getModelStats = (instance2) => { - let totalSizeFromManifest = 0; - let totalSizeWeights = 0; - let totalSizeLoading = 0; - for (const m of Object.values(modelStats)) { - totalSizeFromManifest += m.sizeFromManifest; - totalSizeWeights += m.sizeLoadedWeights; - totalSizeLoading += m.sizeDesired; - } - const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0; - return { - numLoadedModels: Object.values(modelStats).length, - numEnabledModels: void 0, - numDefinedModels: Object.keys(instance2.models).length, - percentageLoaded, - totalSizeFromManifest, - totalSizeWeights, - totalSizeLoading, - totalSizeEnabled: void 0, - modelStats: Object.values(modelStats) - }; -}; -function reset(instance2) { - for (const model19 of Object.keys(instance2.models)) - instance2.models[model19] = null; -} -async function load20(instance2) { - var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F; - if (env.initial) - reset(instance2); - if (instance2.config.hand.enabled) { - if (!instance2.models.handpose && ((_b = (_a = instance2.config.hand.detector) == null ? void 0 : _a.modelPath) == null ? void 0 : _b.includes("handdetect"))) { - [instance2.models.handpose, instance2.models.handskeleton] = await load14(instance2.config); - } - if (!instance2.models.handskeleton && instance2.config.hand.landmarks && ((_d = (_c = instance2.config.hand.detector) == null ? void 0 : _c.modelPath) == null ? void 0 : _d.includes("handdetect"))) { - [instance2.models.handpose, instance2.models.handskeleton] = await load14(instance2.config); - } - } - if (instance2.config.body.enabled && !instance2.models.blazepose && ((_f = (_e = instance2.config.body) == null ? void 0 : _e.modelPath) == null ? void 0 : _f.includes("blazepose"))) - instance2.models.blazepose = loadPose(instance2.config); - if (instance2.config.body.enabled && !instance2.models.blazeposedetect && instance2.config.body["detector"] && instance2.config.body["detector"]["modelPath"]) - instance2.models.blazeposedetect = loadDetect(instance2.config); - if (instance2.config.body.enabled && !instance2.models.efficientpose && ((_h = (_g = instance2.config.body) == null ? void 0 : _g.modelPath) == null ? void 0 : _h.includes("efficientpose"))) - instance2.models.efficientpose = load7(instance2.config); - if (instance2.config.body.enabled && !instance2.models.movenet && ((_j = (_i = instance2.config.body) == null ? void 0 : _i.modelPath) == null ? void 0 : _j.includes("movenet"))) - instance2.models.movenet = load16(instance2.config); - if (instance2.config.body.enabled && !instance2.models.posenet && ((_l = (_k = instance2.config.body) == null ? void 0 : _k.modelPath) == null ? void 0 : _l.includes("posenet"))) - instance2.models.posenet = load18(instance2.config); - if (instance2.config.face.enabled && !instance2.models.facedetect) - instance2.models.facedetect = load5(instance2.config); - if (instance2.config.face.enabled && ((_m = instance2.config.face.antispoof) == null ? void 0 : _m.enabled) && !instance2.models.antispoof) - instance2.models.antispoof = load4(instance2.config); - if (instance2.config.face.enabled && ((_n = instance2.config.face.liveness) == null ? void 0 : _n.enabled) && !instance2.models.liveness) - instance2.models.liveness = load15(instance2.config); - if (instance2.config.face.enabled && ((_o = instance2.config.face.description) == null ? void 0 : _o.enabled) && !instance2.models.faceres) - instance2.models.faceres = load13(instance2.config); - if (instance2.config.face.enabled && ((_p = instance2.config.face.emotion) == null ? void 0 : _p.enabled) && !instance2.models.emotion) - instance2.models.emotion = load8(instance2.config); - if (instance2.config.face.enabled && ((_q = instance2.config.face.iris) == null ? void 0 : _q.enabled) && !((_r = instance2.config.face.attention) == null ? void 0 : _r.enabled) && !instance2.models.faceiris) - instance2.models.faceiris = load11(instance2.config); - if (instance2.config.face.enabled && ((_s = instance2.config.face.mesh) == null ? void 0 : _s.enabled) && !instance2.models.facemesh) - instance2.models.facemesh = load12(instance2.config); - if (instance2.config.face.enabled && ((_t = instance2.config.face["gear"]) == null ? void 0 : _t.enabled) && !instance2.models.gear) - instance2.models.gear = load(instance2.config); - if (instance2.config.face.enabled && ((_u = instance2.config.face["ssrnet"]) == null ? void 0 : _u.enabled) && !instance2.models.ssrnetage) - instance2.models.ssrnetage = load2(instance2.config); - if (instance2.config.face.enabled && ((_v = instance2.config.face["ssrnet"]) == null ? void 0 : _v.enabled) && !instance2.models.ssrnetgender) - instance2.models.ssrnetgender = load3(instance2.config); - if (instance2.config.face.enabled && ((_w = instance2.config.face["mobilefacenet"]) == null ? void 0 : _w.enabled) && !instance2.models.mobilefacenet) - instance2.models.mobilefacenet = load9(instance2.config); - if (instance2.config.face.enabled && ((_x = instance2.config.face["insightface"]) == null ? void 0 : _x.enabled) && !instance2.models.insightface) - instance2.models.insightface = load10(instance2.config); - if (instance2.config.hand.enabled && !instance2.models.handtrack && ((_z = (_y = instance2.config.hand.detector) == null ? void 0 : _y.modelPath) == null ? void 0 : _z.includes("handtrack"))) - instance2.models.handtrack = loadDetect2(instance2.config); - if (instance2.config.hand.enabled && instance2.config.hand.landmarks && !instance2.models.handskeleton && ((_B = (_A = instance2.config.hand.detector) == null ? void 0 : _A.modelPath) == null ? void 0 : _B.includes("handtrack"))) - instance2.models.handskeleton = loadSkeleton(instance2.config); - if (instance2.config.object.enabled && !instance2.models.centernet && ((_D = (_C = instance2.config.object) == null ? void 0 : _C.modelPath) == null ? void 0 : _D.includes("centernet"))) - instance2.models.centernet = load6(instance2.config); - if (instance2.config.object.enabled && !instance2.models.nanodet && ((_F = (_E = instance2.config.object) == null ? void 0 : _E.modelPath) == null ? void 0 : _F.includes("nanodet"))) - instance2.models.nanodet = load17(instance2.config); - if (instance2.config.segmentation.enabled && !instance2.models.segmentation) - instance2.models.segmentation = load19(instance2.config); - for await (const model19 of Object.keys(instance2.models)) { - if (instance2.models[model19] && typeof instance2.models[model19] !== "undefined") { - instance2.models[model19] = await instance2.models[model19]; - } - } -} -var instance; -function validateModel(newInstance, model19, name) { - if (newInstance) - instance = newInstance; - if (!model19) - return null; - if (!instance) - log("instance not registred"); - if (!instance.config.validateModels) - return null; - const simpleOps = ["const", "placeholder", "noop", "pad", "squeeze", "add", "sub", "mul", "div"]; - const ignoreOps = ["biasadd", "fusedbatchnormv3", "matmul"]; - const ops = []; - const missing = []; - const url = model19.modelUrl; - const executor = model19.executor; - if (executor && executor.graph.nodes) { - for (const kernel of Object.values(executor.graph.nodes)) { - const op = kernel.op.toLowerCase(); - if (!ops.includes(op)) - ops.push(op); - } - } else { - if (!executor && instance.config.debug) - log("model signature not determined:", name); - } - for (const op of ops) { - if (!simpleOps.includes(op) && !ignoreOps.includes(op) && !instance.env.kernels.includes(op) && !instance.env.kernels.includes(op.replace("_", "")) && !instance.env.kernels.includes(op.replace("native", "")) && !instance.env.kernels.includes(op.replace("v2", ""))) { - missing.push(op); - } - } - if (instance.config.debug && missing.length > 0) - log("model validation failed:", name, missing); - return missing.length > 0 ? { name, missing, ops, url } : null; -} -function validate2(newInstance) { - instance = newInstance; - const missing = []; - for (const defined of Object.keys(instance.models)) { - const model19 = instance.models[defined]; - if (!model19) - continue; - const res = validateModel(instance, model19, defined); - if (res) - missing.push(res); - } - return missing; -} - -// src/tfjs/load.ts -var options2 = { - cacheModels: true, - cacheSupported: true, - verbose: true, - debug: false, - modelBasePath: "" -}; -var modelStats = {}; -async function httpHandler(url, init2) { - if (options2.debug) - log("load model fetch:", url, init2); - return fetch(url, init2); -} -function setModelLoadOptions(config3) { - options2.cacheModels = config3.cacheModels; - options2.verbose = config3.debug; - options2.modelBasePath = config3.modelBasePath; -} -async function loadModel(modelPath) { - var _a, _b, _c; - let modelUrl = join(options2.modelBasePath, modelPath || ""); - if (!modelUrl.toLowerCase().endsWith(".json")) - modelUrl += ".json"; - const modelPathSegments = modelUrl.includes("/") ? modelUrl.split("/") : modelUrl.split("\\"); - const shortModelName = modelPathSegments[modelPathSegments.length - 1].replace(".json", ""); - const cachedModelName = "indexeddb://" + shortModelName; - modelStats[shortModelName] = { - name: shortModelName, - sizeFromManifest: 0, - sizeLoadedWeights: 0, - sizeDesired: models_exports[shortModelName], - inCache: false - }; - options2.cacheSupported = typeof window !== "undefined" && typeof window.localStorage !== "undefined" && typeof window.indexedDB !== "undefined"; - let cachedModels = {}; - try { - cachedModels = options2.cacheSupported && options2.cacheModels ? await tfjs_esm_exports.io.listModels() : {}; - } catch (e) { - options2.cacheSupported = false; - } - modelStats[shortModelName].inCache = options2.cacheSupported && options2.cacheModels && Object.keys(cachedModels).includes(cachedModelName); - const tfLoadOptions = typeof fetch === "undefined" ? {} : { fetchFunc: (url, init2) => httpHandler(url, init2) }; - const model19 = new GraphModel(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions); - let loaded = false; - try { - model19.findIOHandler(); - if (options2.debug) - log("model load handler:", model19["handler"]); - const artifacts = await model19.handler.load(); - modelStats[shortModelName].sizeFromManifest = ((_a = artifacts == null ? void 0 : artifacts.weightData) == null ? void 0 : _a.byteLength) || 0; - model19.loadSync(artifacts); - modelStats[shortModelName].sizeLoadedWeights = ((_c = (_b = model19 == null ? void 0 : model19.artifacts) == null ? void 0 : _b.weightData) == null ? void 0 : _c.byteLength) || 0; - if (options2.verbose) - log("load model:", model19["modelUrl"], { bytes: modelStats[shortModelName].sizeLoadedWeights }, options2); - loaded = true; - } catch (err) { - log("error loading model:", modelUrl, err); - } - if (loaded && options2.cacheModels && options2.cacheSupported && !modelStats[shortModelName].inCache) { - try { - const saveResult = await model19.save(cachedModelName); - log("model saved:", cachedModelName, saveResult); - } catch (err) { - log("error saving model:", modelUrl, err); - } - } - validateModel(null, model19, `${modelPath}`); - return model19; -} - -// package.json -var version9 = "2.9.2"; - -// src/draw/draw.ts -var draw_exports = {}; -__export(draw_exports, { - all: () => all, - body: () => body, - canvas: () => canvas2, - face: () => face, - gesture: () => gesture, - hand: () => hand, - object: () => object, - options: () => options3, - person: () => person -}); - -// src/draw/primitives.ts -var getCanvasContext = (input) => { - if (!input) - log("draw error: invalid canvas"); - else if (!input.getContext) - log("draw error: canvas context not defined"); - else { - const ctx = input.getContext("2d"); - if (!ctx) - log("draw error: cannot get canvas context"); - else - return ctx; - } - return null; -}; -var rad2deg = (theta) => Math.round(theta * 180 / Math.PI); -var colorDepth = (z, opt2) => { - if (!opt2.useDepth || typeof z === "undefined") - return opt2.color; - const rgb2 = Uint8ClampedArray.from([127 + 2 * z, 127 - 2 * z, 255]); - return `rgba(${rgb2[0]}, ${rgb2[1]}, ${rgb2[2]}, ${opt2.alpha})`; -}; -function point(ctx, x, y, z, localOptions) { - ctx.fillStyle = colorDepth(z, localOptions); - ctx.beginPath(); - ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI); - ctx.fill(); -} -function rect(ctx, x, y, width, height, localOptions) { - ctx.beginPath(); - ctx.lineWidth = localOptions.lineWidth; - 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.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.length < 2) - return; - ctx.beginPath(); - ctx.moveTo(points[0][0], points[0][1]); - for (const pt of points) { - ctx.strokeStyle = colorDepth(pt[2] || 0, localOptions); - ctx.lineTo(Math.trunc(pt[0]), Math.trunc(pt[1])); - } - ctx.stroke(); - if (localOptions.fillPolygons) { - ctx.closePath(); - ctx.fill(); - } -} -function curves(ctx, points, localOptions) { - if (points.length < 2) - return; - ctx.lineWidth = localOptions.lineWidth; - 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(); - } -} -function arrow(ctx, from, to, radius = 5) { - let angle; - let x; - let y; - ctx.beginPath(); - ctx.moveTo(from[0], from[1]); - ctx.lineTo(to[0], to[1]); - angle = Math.atan2(to[1] - from[1], to[0] - from[0]); - x = radius * Math.cos(angle) + to[0]; - y = radius * Math.sin(angle) + to[1]; - ctx.moveTo(x, y); - angle += 1 / 3 * (2 * Math.PI); - x = radius * Math.cos(angle) + to[0]; - y = radius * Math.sin(angle) + to[1]; - ctx.lineTo(x, y); - angle += 1 / 3 * (2 * Math.PI); - x = radius * Math.cos(angle) + to[0]; - y = radius * Math.sin(angle) + to[1]; - ctx.lineTo(x, y); - ctx.closePath(); - ctx.stroke(); - ctx.fill(); -} - -// src/draw/options.ts -var options3 = { - color: "rgba(173, 216, 230, 0.6)", - labelColor: "rgba(173, 216, 230, 1)", - shadowColor: "black", - alpha: 0.5, - font: 'small-caps 16px "Segoe UI"', - lineHeight: 18, - lineWidth: 4, - pointSize: 2, - roundRect: 8, - drawPoints: false, - drawLabels: true, - drawBoxes: true, - drawAttention: true, - drawGestures: true, - drawPolygons: true, - drawGaze: true, - fillPolygons: false, - useDepth: true, - useCurves: false -}; - -// src/draw/face.ts -var opt; -function drawLabels(f, ctx) { - if (opt.drawLabels) { - 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.real) - labels2.push(`real: ${Math.trunc(100 * f.real)}%`); - if (f.live) - labels2.push(`live: ${Math.trunc(100 * f.live)}%`); - 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 = opt.color; - for (let i = labels2.length - 1; i >= 0; i--) { - const x = Math.max(f.box[0], 0); - const y = i * opt.lineHeight + f.box[1]; - if (opt.shadowColor && opt.shadowColor !== "") { - ctx.fillStyle = opt.shadowColor; - ctx.fillText(labels2[i], x + 5, y + 16); - } - ctx.fillStyle = opt.labelColor; - ctx.fillText(labels2[i], x + 4, y + 15); - } - } -} -function drawIrisElipse(f, ctx) { - if (f.annotations && f.annotations["leftEyeIris"] && f.annotations["leftEyeIris"][0]) { - ctx.strokeStyle = opt.useDepth ? "rgba(255, 200, 255, 0.3)" : opt.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 (opt.fillPolygons) { - ctx.fillStyle = opt.useDepth ? "rgba(255, 255, 200, 0.3)" : opt.color; - ctx.fill(); - } - } - if (f.annotations && f.annotations["rightEyeIris"] && f.annotations["rightEyeIris"][0]) { - ctx.strokeStyle = opt.useDepth ? "rgba(255, 200, 255, 0.3)" : opt.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 (opt.fillPolygons) { - ctx.fillStyle = opt.useDepth ? "rgba(255, 255, 200, 0.3)" : opt.color; - ctx.fill(); - } - } -} -function drawGazeSpheres(f, ctx) { - var _a; - if (opt.drawGaze && ((_a = f.rotation) == null ? void 0 : _a.angle) && typeof Path2D !== "undefined") { - ctx.strokeStyle = "pink"; - const valX = f.box[0] + f.box[2] / 2 - f.box[3] * rad2deg(f.rotation.angle.yaw) / 90; - const valY = f.box[1] + f.box[3] / 2 + f.box[2] * rad2deg(f.rotation.angle.pitch) / 90; - const pathV = new Path2D(` - M ${f.box[0] + f.box[2] / 2} ${f.box[1]} +`;var n5=(e,t,o)=>{let n=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(n,(r,s)=>(o[s]=0,r))},r5=class{constructor(t,o,n){w(this,"uniform",{});w(this,"attribute",{});w(this,"gl");w(this,"id");w(this,"compile",(t,o)=>{let n=this.gl.createShader(o);return n?(this.gl.shaderSource(n,t),this.gl.compileShader(n),this.gl.getShaderParameter(n,this.gl.COMPILE_STATUS)?n:(u(`filter: gl compile failed: ${this.gl.getShaderInfoLog(n)}`),null)):(u("filter: could not create shader"),null)});this.gl=t;let r=this.compile(o,this.gl.VERTEX_SHADER),s=this.compile(n,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!r||!s)){if(!this.id){u("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,r),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){u(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);return}this.gl.useProgram(this.id),n5(o,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=this.gl.getAttribLocation(this.id,a);n5(o,"uniform",this.uniform),n5(n,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=this.gl.getUniformLocation(this.id,a)}}};function U1(){let e=0,t=null,o=!1,n=-1,r=[null,null],s=[],a=null,i=null,y=c0(100,100),x={},d={INTERMEDIATE:1},l=y.getContext("webgl");if(!l){u("filter: cannot get webgl context");return}this.gl=l;function f(M,m){if(!(M===y.width&&m===y.height)){if(y.width=M,y.height=m,!a){let h=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);a=l.createBuffer(),l.bindBuffer(l.ARRAY_BUFFER,a),l.bufferData(l.ARRAY_BUFFER,h,l.STATIC_DRAW),l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}l.viewport(0,0,y.width,y.height),r=[null,null]}}function c(M,m){let h=l.createFramebuffer();l.bindFramebuffer(l.FRAMEBUFFER,h);let C=l.createRenderbuffer();l.bindRenderbuffer(l.RENDERBUFFER,C);let j=l.createTexture();return l.bindTexture(l.TEXTURE_2D,j),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,M,m,0,l.RGBA,l.UNSIGNED_BYTE,null),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,l.TEXTURE_2D,j,0),l.bindTexture(l.TEXTURE_2D,null),l.bindFramebuffer(l.FRAMEBUFFER,null),{fbo:h,texture:j}}function b(M){return r[M]=r[M]||c(y.width,y.height),r[M]}function p(M=0){if(!i)return;let m=null,h=null,C=!1;e===0?m=t:m=b(n).texture||null,e++,o&&!(M&d.INTERMEDIATE)?(h=null,C=e%2===0):(n=(n+1)%2,h=b(n).fbo||null),l.bindTexture(l.TEXTURE_2D,m),l.bindFramebuffer(l.FRAMEBUFFER,h),l.uniform1f(i.uniform.flipY,C?-1:1),l.drawArrays(l.TRIANGLES,0,6)}function R(M){if(x[M])return i=x[M],l.useProgram((i?i.id:null)||null),i;if(i=new r5(l,H1,M),!i)return u("filter: could not get webgl program"),null;let m=Float32Array.BYTES_PER_ELEMENT,h=4*m;return l.enableVertexAttribArray(i.attribute.pos),l.vertexAttribPointer(i.attribute.pos,2,l.FLOAT,!1,h,0*m),l.enableVertexAttribArray(i.attribute.uv),l.vertexAttribPointer(i.attribute.uv,2,l.FLOAT,!1,h,2*m),x[M]=i,i}let P={colorMatrix:M=>{let m=new Float32Array(M);m[4]/=255,m[9]/=255,m[14]/=255,m[19]/=255;let h=m[18]===1&&m[3]===0&&m[8]===0&&m[13]===0&&m[15]===0&&m[16]===0&&m[17]===0&&m[19]===0?D1:V1,C=R(h);!C||(l.uniform1fv(C.uniform.m,m),p())},brightness:M=>{let m=(M||0)+1;P.colorMatrix([m,0,0,0,0,0,m,0,0,0,0,0,m,0,0,0,0,0,1,0])},saturation:M=>{let m=(M||0)*2/3+1,h=(m-1)*-.5;P.colorMatrix([m,h,h,0,0,h,m,h,0,0,h,h,m,0,0,0,0,0,1,0])},desaturate:()=>{P.saturation(-1)},contrast:M=>{let m=(M||0)+1,h=-128*(m-1);P.colorMatrix([m,0,0,0,h,0,m,0,0,h,0,0,m,0,h,0,0,0,1,0])},negative:()=>{P.contrast(-2)},hue:M=>{M=(M||0)/180*Math.PI;let m=Math.cos(M),h=Math.sin(M),C=.213,j=.715,k=.072;P.colorMatrix([C+m*(1-C)+h*-C,j+m*-j+h*-j,k+m*-k+h*(1-k),0,0,C+m*-C+h*.143,j+m*(1-j)+h*.14,k+m*-k+h*-.283,0,0,C+m*-C+h*-(1-C),j+m*-j+h*j,k+m*(1-k)+h*k,0,0,0,0,0,1,0])},desaturateLuminance:()=>{P.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{P.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{P.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{P.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{P.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{P.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{P.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{P.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:M=>{let m=new Float32Array(M),h=1/y.width,C=1/y.height,j=R(q1);!j||(l.uniform1fv(j.uniform.m,m),l.uniform2f(j.uniform.px,h,C),p())},detectEdges:()=>{P.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{P.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{P.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:M=>{let m=M||1;P.convolution.call(this,[0,-1*m,0,-1*m,1+4*m,-1*m,0,-1*m,0])},emboss:M=>{let m=M||1;P.convolution.call(this,[-2*m,-1*m,0,-1*m,1,1*m,0,1*m,2*m])},blur:M=>{let m=M/7/y.width,h=M/7/y.height,C=R(X1);!C||(l.uniform2f(C.uniform.px,0,h),p(d.INTERMEDIATE),l.uniform2f(C.uniform.px,m,0),p())},pixelate:M=>{let m=M/y.width,h=M/y.height,C=R(Z1);!C||(l.uniform2f(C.uniform.size,m,h),p())}};this.add=function(M){let m=Array.prototype.slice.call(arguments,1),h=P[M];s.push({func:h,args:m})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(M){f(M.width,M.height),e=0,t||(t=l.createTexture()),l.bindTexture(l.TEXTURE_2D,t),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.NEAREST),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.NEAREST),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,l.RGBA,l.UNSIGNED_BYTE,M);for(let m=0;mc.data())),a=.99*Math.max(s[0][0],s[1][0],s[2][0]),i=[A.sub(o[0],n[0]),A.sub(o[1],n[1]),A.sub(o[2],n[2])],y=[A.sub(r[0],n[0]),A.sub(r[1],n[1]),A.sub(r[2],n[2])],x=[A.div(a,y[0]),A.div(a,y[1]),A.div(a,y[2])],d=[A.mul(i[0],x[0]),A.mul(i[1],x[1]),A.mul(i[2],x[2])],l=A.stack([d[0],d[1],d[2]],2),f=A.reshape(l,[1,t.shape[0],t.shape[1],3]);return A.dispose([...o,...n,...r,...i,...y,...x,...d,l,t]),f}var c2=3840,V=null,t0=null,Re=null,U,B0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function c0(e,t){let o;if(v.browser)if(v.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");o=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");o=document.createElement("canvas"),o.width=e,o.height=t}else typeof v.Canvas!="undefined"?o=new v.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(o=new globalThis.Canvas(e,t));return o}function d2(e,t){let o=t||c0(e.width,e.height);return o.getContext("2d").drawImage(e,0,0),o}async function Te(e,t,o=!0){if(!e)return t.debug&&u("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof Pe)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof v.Canvas!="undefined"&&e instanceof v.Canvas)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type is not recognized");if(e instanceof Pe){let n=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)n=A.expandDims(e,0);else if(e.shape[2]===4){let r=A.slice3d(e,[0,0,0],[-1,-1,3]);n=A.expandDims(r,0),A.dispose(r)}}else e.shape.length===4&&(e.shape[3]===3?n=A.clone(e):e.shape[3]===4&&(n=A.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(n==null||n.shape.length!==4||n.shape[0]!==1||n.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape}`);if(n.dtype==="int32"){let r=A.cast(n,"float32");A.dispose(n),n=r}return{tensor:n,canvas:t.filter.return?t0:null}}else{if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&u("input stream is not ready"),{tensor:null,canvas:V};let n=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!n||!r)return t.debug&&u("cannot determine input dimensions"),{tensor:null,canvas:V};let s=n,a=r;if(s>c2&&(s=c2,a=Math.trunc(s*r/n)),a>c2&&(a=c2,s=Math.trunc(a*n/r)),(t.filter.width||0)>0?s=t.filter.width:(t.filter.height||0)>0&&(s=n*((t.filter.height||0)/r)),(t.filter.height||0)>0?a=t.filter.height:(t.filter.width||0)>0&&(a=r*((t.filter.width||0)/n)),!s||!a)throw new Error("input error: cannot determine dimension");(!V||(V==null?void 0:V.width)!==s||(V==null?void 0:V.height)!==a)&&(V=c0(s,a));let i=V.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(n,0),i.scale(-1,1),i.drawImage(e,0,0,n,r,0,0,V==null?void 0:V.width,V==null?void 0:V.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,n,r,0,0,V==null?void 0:V.width,V==null?void 0:V.height),(!t0||V.width!==t0.width||(V==null?void 0:V.height)!==(t0==null?void 0:t0.height))&&(t0=c0(V.width,V.height)),t.filter.enabled&&v.webgl.supported?(U||(U=v.browser?new U1:null),v.filter=!!U,!U||!U.add?(t.debug&&u("input process error: cannot initialize filters"),v.webgl.supported=!1,t.filter.enabled=!1,d2(V,t0)):(U.reset(),t.filter.brightness!==0&&U.add("brightness",t.filter.brightness),t.filter.contrast!==0&&U.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&U.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&U.add("blur",t.filter.blur),t.filter.saturation!==0&&U.add("saturation",t.filter.saturation),t.filter.hue!==0&&U.add("hue",t.filter.hue),t.filter.negative&&U.add("negative"),t.filter.sepia&&U.add("sepia"),t.filter.vintage&&U.add("brownie"),t.filter.sepia&&U.add("sepia"),t.filter.kodachrome&&U.add("kodachrome"),t.filter.technicolor&&U.add("technicolor"),t.filter.polaroid&&U.add("polaroid"),t.filter.pixelate!==0&&U.add("pixelate",t.filter.pixelate),U.get()>0?t0=U.apply(V):t0=U.draw(V))):(d2(V,t0),U&&(U=null),v.filter=!!U),!o)return{tensor:null,canvas:t0};if(!t0)throw new Error("canvas error: cannot create output");let y,x=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(v.browser&&A.browser)y=A.browser?A.browser.fromPixels(e):null;else{x=e.data.length/e.height/e.width;let f=new Uint8Array(e.data.buffer);y=A.tensor(f,[e.height,e.width,x],"int32")}else if((!Re||t0.width!==Re.width||t0.height!==Re.height)&&(Re=c0(t0.width,t0.height)),A.browser&&v.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?y=A.browser.fromPixels(t0):(Re=d2(t0),y=A.browser.fromPixels(Re));else{let b=d2(t0).getContext("2d").getImageData(0,0,s,a);x=b.data.length/s/a;let p=new Uint8Array(b.data.buffer);y=A.tensor(p,[s,a,x])}if(x===4){let f=A.slice3d(y,[0,0,0],[-1,-1,3]);A.dispose(y),y=f}if(!y)throw new Error("input error: cannot create tensor");let d=A.cast(y,"float32"),l=t.filter.equalization?await x2(d):A.expandDims(d,0);return A.dispose([y,d]),{tensor:l,canvas:t.filter.return?t0:null}}}async function Y1(e,t){let o=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>2048||t.shape[2]>2048)return o;if(!B0.inputTensor)B0.inputTensor=A.clone(t);else if(B0.inputTensor.shape[1]!==t.shape[1]||B0.inputTensor.shape[2]!==t.shape[2])A.dispose(B0.inputTensor),B0.inputTensor=A.clone(t);else{let n={};n.diff=A.sub(t,B0.inputTensor),n.squared=A.mul(n.diff,n.diff),n.sum=A.sum(n.squared);let s=(await n.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;A.dispose([B0.inputTensor,n.diff,n.squared,n.sum]),B0.inputTensor=A.clone(t),o=s<=(e.cacheSensitivity||0)}return o}async function K1(e,t,o){let n={};if(!t||!o||t.shape.length!==4||t.shape.length!==o.shape.length)return e.debug||u("invalid input tensor or tensor shapes do not match:",t.shape,o.shape),0;if(t.shape[0]!==1||o.shape[0]!==1||t.shape[3]!==3||o.shape[3]!==3)return e.debug||u("input tensors must be of shape [1, height, width, 3]:",t.shape,o.shape),0;n.input1=A.clone(t),n.input2=t.shape[1]!==o.shape[1]||t.shape[2]!==o.shape[2]?A.image.resizeBilinear(o,[t.shape[1],t.shape[2]]):A.clone(o),n.diff=A.sub(n.input1,n.input2),n.squared=A.mul(n.diff,n.diff),n.sum=A.sum(n.squared);let s=(await n.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return A.dispose([n.input1,n.input2,n.diff,n.squared,n.sum]),s}var A5=class{constructor(){w(this,"browser");w(this,"node");w(this,"worker");w(this,"platform","");w(this,"agent","");w(this,"backends",[]);w(this,"initial");w(this,"filter");w(this,"tfjs");w(this,"offscreen");w(this,"perfadd",!1);w(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});w(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0});w(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});w(this,"cpu",{model:void 0,flags:[]});w(this,"kernels",[]);w(this,"Canvas");w(this,"Image");w(this,"ImageData");if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:Qe["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t&&t[0]){let o=t[0].match(/\(([^()]+)\)/g);this.platform=o&&o[0]?o[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}async updateBackend(){this.backends=Object.keys(A.engine().registryFactory),this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&A.getBackend()==="wasm"&&(this.wasm.simd=A.env().get("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=A.env().get("WASM_HAS_MULTITHREAD_SUPPORT"));let t=c0(100,100),o=t?t.getContext("webgl2"):void 0;if(this.webgl.supported=typeof o!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&(A.getBackend()==="webgl"||A.getBackend()==="humangl")){let n=A.backend().gpgpu!=="undefined"?await A.backend().getGPGPUContext().gl:null;n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.renderer=n.getParameter(n.RENDERER))}this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{this.webgpu.supported&&(this.webgpu.adapter=(await navigator.gpu.requestAdapter()).name)}catch(n){this.webgpu.supported=!1}try{this.kernels=A.getKernelsForBackend(A.getBackend()).map(n=>n.kernelName.toLowerCase())}catch(n){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}},v=new A5;var s5={};K0(s5,{age:()=>qo,antispoof:()=>Uo,blazeface:()=>Jo,"blazeface-back":()=>Yo,"blazeface-front":()=>Ko,"blazepose-detector2d":()=>Qo,"blazepose-detector3d":()=>_o,"blazepose-full":()=>$o,"blazepose-heavy":()=>en,"blazepose-lite":()=>tn,default:()=>On,efficientpose:()=>on,emotion:()=>nn,faceboxes:()=>rn,facemesh:()=>xn,"facemesh-attention":()=>sn,"facemesh-attention-alt":()=>An,"facemesh-detection-full":()=>an,"facemesh-detection-short":()=>ln,"facemesh-orig":()=>yn,faceres:()=>dn,"faceres-deep":()=>cn,gear:()=>fn,gender:()=>pn,"gender-ssrnet-imdb":()=>mn,handdetect:()=>un,"handlandmark-full":()=>hn,"handlandmark-lite":()=>bn,"handlandmark-sparse":()=>gn,handskeleton:()=>Mn,handtrack:()=>Pn,iris:()=>Rn,liveness:()=>Tn,"mb3-centernet":()=>vn,meet:()=>wn,mobileface:()=>kn,mobilefacenet:()=>En,"movenet-lightning":()=>zn,"movenet-multipose":()=>Sn,"movenet-thunder":()=>Cn,nanodet:()=>In,posenet:()=>jn,selfie:()=>Nn});var qo=161240,Uo=853098,Yo=538928,Ko=402048,Jo=538928,Qo=7499400,_o=5928856,$o=6338290,en=27501554,tn=2725490,on=5651240,nn=820516,rn=2013002,An=2387598,sn=2382414,an=1026192,ln=201268,yn=2955780,xn=1477958,cn=13957620,dn=6978814,fn=1498916,mn=161236,pn=201808,un=3515612,hn=5431368,bn=2023432,gn=5286322,Mn=5502280,Pn=2964837,Rn=2599092,Tn=592976,vn=4030290,wn=372228,kn=2183192,En=5171976,zn=4650216,Sn=9448838,Cn=12477112,In=7574558,jn=5032780,Nn=212886,On={age:qo,antispoof:Uo,"blazeface-back":Yo,"blazeface-front":Ko,blazeface:Jo,"blazepose-detector2d":Qo,"blazepose-detector3d":_o,"blazepose-full":$o,"blazepose-heavy":en,"blazepose-lite":tn,efficientpose:on,emotion:nn,faceboxes:rn,"facemesh-attention-alt":An,"facemesh-attention":sn,"facemesh-detection-full":an,"facemesh-detection-short":ln,"facemesh-orig":yn,facemesh:xn,"faceres-deep":cn,faceres:dn,gear:fn,"gender-ssrnet-imdb":mn,gender:pn,handdetect:un,"handlandmark-full":hn,"handlandmark-lite":bn,"handlandmark-sparse":gn,handskeleton:Mn,handtrack:Pn,iris:Rn,liveness:Tn,"mb3-centernet":vn,meet:wn,mobileface:kn,mobilefacenet:En,"movenet-lightning":zn,"movenet-multipose":Sn,"movenet-thunder":Cn,nanodet:In,posenet:jn,selfie:Nn};var $5={};K0($5,{Models:()=>a2,getModelStats:()=>g1,load:()=>M1,reset:()=>W2,validate:()=>J2,validateModel:()=>Fe});var k0,a5=[],Ln=["white","black","asian","indian","other"],Wn=[15,23,28,35.5,45.5,55.5,65],J1=0,Q1=0,i5=Number.MAX_SAFE_INTEGER;async function _1(e){var t;return v.initial&&(k0=null),k0?e.debug&&u("cached model:",k0.modelUrl):k0=await N((t=e.face.gear)==null?void 0:t.modelPath),k0}async function l5(e,t,o,n){var a,i;if(!k0)return{age:0,gender:"unknown",genderScore:0,race:[]};let r=i5<(((a=t.face.gear)==null?void 0:a.skipFrames)||0),s=(((i=t.face.gear)==null?void 0:i.skipTime)||0)>g()-Q1;return t.skipAllowed&&s&&r&&J1===n&&a5[o]?(i5++,a5[o]):(i5=0,new Promise(async y=>{var P,M;if(!(k0!=null&&k0.inputs[0].shape))return;let x={},d=[[0,.1,.9,.9]];x.resize=A.image.cropAndResize(e,d,[0],[k0.inputs[0].shape[2],k0.inputs[0].shape[1]]);let l={age:0,gender:"unknown",genderScore:0,race:[]};(P=t.face.gear)!=null&&P.enabled&&([x.age,x.gender,x.race]=k0.execute(x.resize,["age_output","gender_output","race_output"]));let f=await x.gender.data();l.gender=f[0]>f[1]?"male":"female",l.genderScore=Math.round(100*(f[0]>f[1]?f[0]:f[1]))/100;let c=await x.race.data();for(let m=0;m(((M=t.face.gear)==null?void 0:M.minConfidence)||.2)&&l.race.push({score:Math.round(100*c[m])/100,race:Ln[m]});l.race.sort((m,h)=>h.score-m.score);let p=Array.from(await x.age.data()).map((m,h)=>[Wn[h],m]).sort((m,h)=>h[1]-m[1]),R=p[0][0];for(let m=1;mA.dispose(x[m])),a5[o]=l,J1=n,Q1=g(),y(l)}))}var W={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function et(){W.tf255=A.scalar(255,"float32"),W.tf1=A.scalar(1,"float32"),W.tf2=A.scalar(2,"float32"),W.tf05=A.scalar(.5,"float32"),W.tf127=A.scalar(127.5,"float32"),W.rgb=A.tensor1d([.2989,.587,.114],"float32")}var p0,f2=[],tt=0,ot=0,y5=Number.MAX_SAFE_INTEGER;async function nt(e){return v.initial&&(p0=null),p0?e.debug&&u("cached model:",p0.modelUrl):p0=await N(e.face.ssrnet.modelPathAge),p0}async function x5(e,t,o,n){var a,i,y,x;if(!p0)return{age:0};let r=y5<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>g()-ot;return t.skipAllowed&&r&&s&&tt===n&&((y=f2[o])==null?void 0:y.age)&&((x=f2[o])==null?void 0:x.age)>0?(y5++,f2[o]):(y5=0,new Promise(async d=>{if(!(p0!=null&&p0.inputs)||!p0.inputs[0]||!p0.inputs[0].shape)return;let l={};l.resize=A.image.resizeBilinear(e,[p0.inputs[0].shape[2],p0.inputs[0].shape[1]],!1),l.enhance=A.mul(l.resize,W.tf255);let f={age:0};if(t.face.ssrnet.enabled&&(l.age=p0.execute(l.enhance)),l.age){let c=await l.age.data();f.age=Math.trunc(10*c[0])/10}Object.keys(l).forEach(c=>A.dispose(l[c])),f2[o]=f,tt=n,ot=g(),d(f)}))}var E0,m2=[],At=0,st=0,c5=Number.MAX_SAFE_INTEGER,d5=[.2989,.587,.114];async function at(e){return v.initial&&(E0=null),E0?e.debug&&u("cached model:",E0.modelUrl):E0=await N(e.face.ssrnet.modelPathGender),E0}async function f5(e,t,o,n){var a,i,y,x;if(!E0)return{gender:"unknown",genderScore:0};let r=c5<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>g()-st;return t.skipAllowed&&r&&s&&At===n&&((y=m2[o])==null?void 0:y.gender)&&((x=m2[o])==null?void 0:x.genderScore)>0?(c5++,m2[o]):(c5=0,new Promise(async d=>{if(!(E0!=null&&E0.inputs[0].shape))return;let l={};l.resize=A.image.resizeBilinear(e,[E0.inputs[0].shape[2],E0.inputs[0].shape[1]],!1),l.enhance=A.tidy(()=>{let[b,p,R]=A.split(l.resize,3,3),P=A.mul(b,d5[0]),M=A.mul(p,d5[1]),m=A.mul(R,d5[2]),h=A.addN([P,M,m]);return A.mul(A.sub(h,W.tf05),2)});let f={gender:"unknown",genderScore:0};t.face.ssrnet.enabled&&(l.gender=E0.execute(l.enhance));let c=await l.gender.data();f.gender=c[0]>c[1]?"female":"male",f.genderScore=c[0]>c[1]?Math.trunc(100*c[0])/100:Math.trunc(100*c[1])/100,Object.keys(l).forEach(b=>A.dispose(l[b])),m2[o]=f,At=n,st=g(),d(f)}))}var s0,p2=[],m5=Number.MAX_SAFE_INTEGER,lt=0,yt=0;async function xt(e){var t;return v.initial&&(s0=null),s0?e.debug&&u("cached model:",s0.modelUrl):s0=await N((t=e.face.antispoof)==null?void 0:t.modelPath),s0}async function p5(e,t,o,n){var a,i;if(!s0)return 0;let r=(((a=t.face.antispoof)==null?void 0:a.skipTime)||0)>g()-yt,s=m5<(((i=t.face.antispoof)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&r&&s&<===n&&p2[o]?(m5++,p2[o]):(m5=0,new Promise(async y=>{let x=A.image.resizeBilinear(e,[s0!=null&&s0.inputs[0].shape?s0.inputs[0].shape[2]:0,s0!=null&&s0.inputs[0].shape?s0.inputs[0].shape[1]:0],!1),d=s0==null?void 0:s0.execute(x),l=(await d.data())[0];p2[o]=Math.round(100*l)/100,lt=n,yt=g(),A.dispose([x,d]),y(p2[o])}))}var z0={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:[185,40,39,37,0,267,269,270,409],lipsLowerOuter:[61,146,91,181,84,17,314,405,321,375,291],lipsUpperInner:[191,80,81,82,13,312,311,310,415],lipsLowerInner:[78,95,88,178,87,14,317,402,318,324,308],lipsLowerSemiOuter:[76,77,90,180,85,16,315,404,320,307,306],lipsUpperSemiOuter:[184,74,73,72,11,302,303,304,408],lipsLowerSemiInner:[62,96,89,179,86,15,316,403,319,325,292],lipsUpperSemiInner:[183,42,41,38,12,268,271,272,407],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]},u5={count:468,mouth:13,symmetryLine:[13,z0.midwayBetweenEyes[0]]},le={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},h5=[{key:"EyeUpper0",indices:[9,10,11,12,13,14,15]},{key:"EyeUpper1",indices:[25,26,27,28,29,30,31]},{key:"EyeUpper2",indices:[41,42,43,44,45,46,47]},{key:"EyeLower0",indices:[0,1,2,3,4,5,6,7,8]},{key:"EyeLower1",indices:[16,17,18,19,20,21,22,23,24]},{key:"EyeLower2",indices:[32,33,34,35,36,37,38,39,40]},{key:"EyeLower3",indices:[54,55,56,57,58,59,60,61,62]},{key:"EyebrowUpper",indices:[63,64,65,66,67,68,69,70]},{key:"EyebrowLower",indices:[48,49,50,51,52,53]}],$e=[[.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]],ye=[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 Gn=[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],Bn=[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],Hn=[33,133,362,263,1,78,308],a7=Gn.map(e=>$e[e]),i7=Bn.map(e=>$e[e]),l7=Hn.map(e=>$e[e]);function J0(e){let t=e.map(o=>o[0]);return t.push(e[e.length-1][1]),t}var Vn=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Dn=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],Zn=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Xn=[[474,475],[475,476],[476,477],[477,474]],qn=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],Un=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Yn=[[469,470],[470,471],[471,472],[472,469]],Kn=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],y7={lips:J0(Vn),leftEye:J0(Dn),leftEyebrow:J0(Zn),leftIris:J0(Xn),rightEye:J0(qn),rightEyebrow:J0(Un),rightIris:J0(Yn),faceOval:J0(Kn)};var ve=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],u2=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],h2=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],b2=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],mt=(e,t)=>{let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],n=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:o,endPoint:n,landmarks:e.landmarks,confidence:e.confidence}},g5=(e,t,o)=>{let n=t.shape[1],r=t.shape[2],s=[e.startPoint[1]/n,e.startPoint[0]/r,e.endPoint[1]/n,e.endPoint[0]/r],a=A.image.cropAndResize(t,[s],[0],o),i=A.div(a,W.tf255);return A.dispose(a),i},g2=(e,t)=>{let o=u2(e),n=ve(e),r=[t*n[0]/2,t*n[1]/2];return{startPoint:[o[0]-r[0],o[1]-r[1]],endPoint:[o[0]+r[0],o[1]+r[1]],landmarks:e.landmarks,confidence:e.confidence}},M2=e=>{let t=u2(e),o=ve(e),n=Math.max(...o)/2;return{startPoint:[Math.round(t[0]-n),Math.round(t[1]-n)],endPoint:[Math.round(t[0]+n),Math.round(t[1]+n)],landmarks:e.landmarks,confidence:e.confidence}},pt=e=>{let t=e.map(n=>n[0]),o=e.map(n=>n[1]);return{startPoint:[Math.min(...t),Math.min(...o)],endPoint:[Math.max(...t),Math.max(...o)],landmarks:e}},M5=[[1,0,0],[0,1,0],[0,0,1]],Jn=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),Qn=(e,t)=>Jn(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var dt=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],xe=(e,t)=>{let o=0;for(let n=0;n{let o=[];for(let n=0;n{let o=[],n=e.length;for(let r=0;r{let o=Math.cos(e),n=Math.sin(e),r=[[o,-n,0],[n,o,0],[0,0,1]],s=dt(t[0],t[1]),a=ft(s,r),i=dt(-t[0],-t[1]);return ft(a,i)},$n=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],o=[e[0][2],e[1][2]],n=[-xe(t[0],o),-xe(t[1],o)];return[t[0].concat(n[0]),t[1].concat(n[1]),[0,0,1]]},er=(e,t)=>[xe(e,t[0]),xe(e,t[1])];function ht(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},o=[];for(let n=0;n[s[0]/r*(c[0]-r/2),s[1]/r*(c[1]-r/2),c[2]||0]),i=o&&o!==0&&Math.abs(o)>.2,y=i?ut(o,[0,0]):M5,x=i?a.map(c=>[...er(c,y),c[2]]):a,d=i?$n(n):M5,l=u2(t),f=[xe(l,d[0]),xe(l,d[1])];return x.map(c=>[Math.trunc(c[0]+f[0]),Math.trunc(c[1]+f[1]),Math.trunc(c[2]||0)])}function gt(e,t,o,n){let r=t.landmarks.length>=u5.count?u5.symmetryLine:le.symmetryLine,s=0,a=M5,i;if(e&&v.kernels.includes("rotatewithoffset"))if(s=Qn(t.landmarks[r[0]],t.landmarks[r[1]]),s&&s!==0&&Math.abs(s)>.2){let x=u2(t),d=[x[0]/o.shape[2],x[1]/o.shape[1]],l=A.image.rotateWithOffset(o,s,0,d);a=ut(-s,x),i=g5(t,l,[n,n]),A.dispose(l)}else i=g5(t,o,[n,n]);else i=g5(t,o,[n,n]);return[s,a,i]}var tr=e=>{let t=e.map(n=>n[0]),o=e.map(n=>n[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...o)+(Math.max(...o)-Math.min(...o))/2]},Mt=(e,t)=>{let o=tr(e),n=ve(t);return{startPoint:[o[0]-n[0]/2,o[1]-n[1]/2],endPoint:[o[0]+n[0]/2,o[1]+n[1]/2]}};var Pt=6,or=1.4,L0,Rt=null,Q0=0,e2=null,we=()=>Q0;async function Tt(e){var t;return v.initial&&(L0=null),L0?e.debug&&u("cached model:",L0.modelUrl):L0=await N((t=e.face.detector)==null?void 0:t.modelPath),Q0=L0.inputs[0].shape?L0.inputs[0].shape[2]:0,e2=A.scalar(Q0,"int32"),Rt=A.tensor2d(ht(Q0)),L0}function nr(e){let t={};t.boxStarts=A.slice(e,[0,1],[-1,2]),t.centers=A.add(t.boxStarts,Rt),t.boxSizes=A.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=A.div(t.boxSizes,e2),t.centersNormalized=A.div(t.centers,e2),t.halfBoxSize=A.div(t.boxSizesNormalized,W.tf2),t.starts=A.sub(t.centersNormalized,t.halfBoxSize),t.ends=A.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=A.mul(t.starts,e2),t.endNormalized=A.mul(t.ends,e2);let o=A.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(n=>A.dispose(t[n])),o}async function vt(e,t){var i,y,x,d;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let o={};o.resized=A.image.resizeBilinear(e,[Q0,Q0]),o.div=A.div(o.resized,W.tf127),o.normalized=A.sub(o.div,W.tf05);let n=L0==null?void 0:L0.execute(o.normalized);if(Array.isArray(n)&&n.length>2){let l=n.sort((f,c)=>f.size-c.size);o.concat384=A.concat([l[0],l[2]],2),o.concat512=A.concat([l[1],l[3]],2),o.concat=A.concat([o.concat512,o.concat384],1),o.batch=A.squeeze(o.concat,0)}else Array.isArray(n)?o.batch=A.squeeze(n[0]):o.batch=A.squeeze(n);A.dispose(n),o.boxes=nr(o.batch),o.logits=A.slice(o.batch,[0,0],[-1,1]),o.sigmoid=A.sigmoid(o.logits),o.scores=A.squeeze(o.sigmoid),o.nms=A.image.nonMaxSuppression(o.boxes,o.scores,((i=t.face.detector)==null?void 0:i.maxDetected)||0,((y=t.face.detector)==null?void 0:y.iouThreshold)||0,((x=t.face.detector)==null?void 0:x.minConfidence)||0);let r=await o.nms.array(),s=[],a=await o.scores.data();for(let l=0;l(((d=t.face.detector)==null?void 0:d.minConfidence)||0)){let c={};c.bbox=A.slice(o.boxes,[r[l],0],[1,-1]),c.slice=A.slice(o.batch,[r[l],Pt-1],[1,-1]),c.squeeze=A.squeeze(c.slice),c.landmarks=A.reshape(c.squeeze,[Pt,-1]);let b=await c.bbox.data(),p={startPoint:[b[0],b[1]],endPoint:[b[2],b[3]],landmarks:await c.landmarks.array(),confidence:f},R=mt(p,[(e.shape[2]||0)/Q0,(e.shape[1]||0)/Q0]),P=g2(R,t.face.scale||or),M=M2(P);s.push(M),Object.keys(c).forEach(m=>A.dispose(c[m]))}}return Object.keys(o).forEach(l=>A.dispose(o[l])),s}var P2={};K0(P2,{connected:()=>T5,kpt:()=>R5});var R5=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],T5={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var kt=224,rr,Ar=5,R2=[8,16,32,32,32];async function Et(){let e=[],t=0;for(;to.x)),y:A.tensor1d(e.map(o=>o.y))}}function H0(e,t=[1,1]){let o=[e.map(i=>i[0]),e.map(i=>i[1])],n=[Math.min(...o[0]),Math.min(...o[1])],r=[Math.max(...o[0]),Math.max(...o[1])],s=[n[0],n[1],r[0]-n[0],r[1]-n[1]],a=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:a}}function zt(e,t=[1,1]){let o=[e.map(x=>x[0]),e.map(x=>x[1])],n=[Math.min(...o[0]),Math.min(...o[1])],r=[Math.max(...o[0]),Math.max(...o[1])],s=[(n[0]+r[0])/2,(n[1]+r[1])/2],a=Math.max(s[0]-n[0],s[1]-n[1],-s[0]+r[0],-s[1]+r[1]),i=[Math.trunc(s[0]-a),Math.trunc(s[1]-a),Math.trunc(2*a),Math.trunc(2*a)],y=[i[0]/t[0],i[1]/t[1],i[2]/t[0],i[3]/t[1]];return{box:i,boxRaw:y}}function T2(e,t){let o=[e[2]*t,e[3]*t];return[e[0]-(o[0]-e[2])/2,e[1]-(o[1]-e[3])/2,o[0],o[1]]}var It={initial:!0},u0={detector:null,landmarks:null},ke={detector:[224,224],landmarks:[256,256]},v5=Number.MAX_SAFE_INTEGER,ar={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},w2=null,t2,_0=[[0,0],[0,0],[0,0],[0,0]],St=0,Ct=e=>1-1/(1+Math.exp(e));async function jt(e){if(It.initial&&(u0.detector=null),!u0.detector&&e.body.detector&&e.body.detector.modelPath){u0.detector=await N(e.body.detector.modelPath);let t=Object.values(u0.detector.modelSignature.inputs);ke.detector[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,ke.detector[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&u0.detector&&u("cached model:",u0.detector.modelUrl);return await Et(),u0.detector}async function Nt(e){if(It.initial&&(u0.landmarks=null),u0.landmarks)e.debug&&u("cached model:",u0.landmarks.modelUrl);else{u0.landmarks=await N(e.body.modelPath);let t=Object.values(u0.landmarks.modelSignature.inputs);ke.landmarks[0]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0,ke.landmarks[1]=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return u0.landmarks}async function ir(e,t){let o={};if(!e.shape||!e.shape[1]||!e.shape[2])return e;let n;if(t2&&(o.cropped=A.image.cropAndResize(e,[t2],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let r=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],s=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];_0=[[0,0],r,s,[0,0]],o.pad=A.pad(o.cropped||e,_0),o.resize=A.image.resizeBilinear(o.pad,[t,t]),n=A.div(o.resize,W.tf255)}else e.shape[1]!==t?(o.resize=A.image.resizeBilinear(o.cropped||e,[t,t]),n=A.div(o.resize,W.tf255)):n=A.div(o.cropped||e,W.tf255);return Object.keys(o).forEach(r=>A.dispose(o[r])),n}function lr(e,t){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+_0[2][0]+_0[2][1])/t[0]-_0[2][0]),Math.trunc(o.position[1]*(t[1]+_0[1][0]+_0[1][1])/t[1]-_0[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(t2)for(let o of e)o.positionRaw=[o.positionRaw[0]+t2[1],o.positionRaw[1]+t2[0],o.positionRaw[2]],o.position=[Math.trunc(o.positionRaw[0]*t[0]),Math.trunc(o.positionRaw[1]*t[1]),o.positionRaw[2]];return e}async function yr(e){let t=e.find(i=>i.part==="leftPalm"),o=e.find(i=>i.part==="leftWrist"),n=e.find(i=>i.part==="leftIndex");t.position[2]=((o.position[2]||0)+(n.position[2]||0))/2;let r=e.find(i=>i.part==="rightPalm"),s=e.find(i=>i.part==="rightWrist"),a=e.find(i=>i.part==="rightIndex");r.position[2]=((s.position[2]||0)+(a.position[2]||0))/2}async function xr(e,t,o){var b;let n={};[n.ld,n.segmentation,n.heatmap,n.world,n.poseflag]=(b=u0.landmarks)==null?void 0:b.execute(e,ar.landmarks);let r=(await n.poseflag.data())[0],s=await n.ld.data(),a=await n.world.data();Object.keys(n).forEach(p=>A.dispose(n[p]));let i=[],y=5;for(let p=0;pp.position),l=H0(d,[o[0],o[1]]),f={};for(let[p,R]of Object.entries(T5)){let P=[];for(let M=0;MC.part===R[M]),h=x.find(C=>C.part===R[M+1]);m&&h&&P.push([m.position,h.position])}f[p]=P}return{id:0,score:Math.trunc(100*r)/100,box:l.box,boxRaw:l.boxRaw,keypoints:x,annotations:f}}async function w5(e,t){let o=[e.shape[2]||0,e.shape[1]||0],n=(t.body.skipTime||0)>g()-St,r=v5<(t.body.skipFrames||0);if(t.skipAllowed&&n&&r&&w2!==null)v5++;else{let s={};s.landmarks=await ir(e,256),w2=await xr(s.landmarks,t,o),Object.keys(s).forEach(a=>A.dispose(s[a])),St=g(),v5=0}return w2?[w2]:[]}var Ee=[{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 V0,ce=0,k5=[],Lt=0,E5=Number.MAX_SAFE_INTEGER;async function Wt(e){if(v.initial&&(V0=null),V0)e.debug&&u("cached model:",V0.modelUrl);else{V0=await N(e.object.modelPath);let t=Object.values(V0.modelSignature.inputs);ce=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}return V0}async function cr(e,t,o){if(!e)return[];let n={},r=[],s=await e.array();n.squeeze=A.squeeze(e);let a=A.split(n.squeeze,6,1);n.stack=A.stack([a[1],a[0],a[3],a[2]],1),n.boxes=A.squeeze(n.stack),n.scores=A.squeeze(a[4]),n.classes=A.squeeze(a[5]),A.dispose([e,...a]),n.nms=A.image.nonMaxSuppression(n.boxes,n.scores,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence||0);let i=await n.nms.data(),y=0;for(let x of Array.from(i)){let d=Math.trunc(100*s[0][x][4])/100,l=s[0][x][5],f=Ee[l].label,[c,b]=[s[0][x][0]/ce,s[0][x][1]/ce],p=[c,b,s[0][x][2]/ce-c,s[0][x][3]/ce-b],R=[Math.trunc(p[0]*t[0]),Math.trunc(p[1]*t[1]),Math.trunc(p[2]*t[0]),Math.trunc(p[3]*t[1])];r.push({id:y++,score:d,class:l,label:f,box:R,boxRaw:p})}return Object.keys(n).forEach(x=>A.dispose(n[x])),r}async function z5(e,t){let o=(t.object.skipTime||0)>g()-Lt,n=E5<(t.object.skipFrames||0);return t.skipAllowed&&o&&n&&k5.length>0?(E5++,k5):(E5=0,new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],a=A.image.resizeBilinear(e,[ce,ce]),i=t.object.enabled?V0==null?void 0:V0.execute(a,["tower_0/detections"]):null;Lt=g(),A.dispose(a);let y=await cr(i,s,t);k5=y,r(y)}))}var k2={};K0(k2,{connected:()=>C5,kpt:()=>S5});var S5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],C5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var a0,Gt=0,d0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},I5=Number.MAX_SAFE_INTEGER;async function Bt(e){return v.initial&&(a0=null),a0?e.debug&&u("cached model:",a0.modelUrl):a0=await N(e.body.modelPath),a0}async function dr(e,t){let[o,n]=e.shape,r=A.reshape(e,[n*o]),s=A.max(r,0),a=(await s.data())[0];if(a>t){let i=A.argMax(r,0),y=A.mod(i,o),x=(await y.data())[0],d=A.div(i,o),l=(await d.data())[0];return A.dispose([r,s,i,y,d]),[x,l,a]}else return A.dispose([r,s]),[0,0,a]}async function j5(e,t){let o=(t.body.skipTime||0)>g()-Gt,n=I5<(t.body.skipFrames||0);return t.skipAllowed&&o&&n&&Object.keys(d0.keypoints).length>0?(I5++,[d0]):(I5=0,new Promise(async r=>{var l;let s=A.tidy(()=>{if(!(a0!=null&&a0.inputs[0].shape))return null;let f=A.image.resizeBilinear(e,[a0.inputs[0].shape[2],a0.inputs[0].shape[1]],!1),c=A.mul(f,W.tf2);return A.sub(c,W.tf1)}),a;if(t.body.enabled&&(a=a0==null?void 0:a0.execute(s)),Gt=g(),A.dispose(s),a){d0.keypoints.length=0;let f=A.squeeze(a);A.dispose(a);let c=A.unstack(f,2);A.dispose(f);for(let b=0;b(((l=t.body)==null?void 0:l.minConfidence)||0)&&d0.keypoints.push({score:Math.round(100*P)/100,part:S5[b],positionRaw:[p/a0.inputs[0].shape[2],R/a0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*p/a0.inputs[0].shape[2]),Math.round(e.shape[1]*R/a0.inputs[0].shape[1])]})}c.forEach(b=>A.dispose(b))}d0.score=d0.keypoints.reduce((f,c)=>c.score>f?c.score:f,0);let i=d0.keypoints.map(f=>f.position[0]),y=d0.keypoints.map(f=>f.position[1]);d0.box=[Math.min(...i),Math.min(...y),Math.max(...i)-Math.min(...i),Math.max(...y)-Math.min(...y)];let x=d0.keypoints.map(f=>f.positionRaw[0]),d=d0.keypoints.map(f=>f.positionRaw[1]);d0.boxRaw=[Math.min(...x),Math.min(...d),Math.max(...x)-Math.min(...x),Math.max(...d)-Math.min(...d)];for(let[f,c]of Object.entries(C5)){let b=[];for(let p=0;pM.part===c[p]),P=d0.keypoints.find(M=>M.part===c[p+1]);R&&P&&R.score>(t.body.minConfidence||0)&&P.score>(t.body.minConfidence||0)&&b.push([R.position,P.position])}d0.annotations[f]=b}r([d0])}))}var fr=["angry","disgust","fear","happy","sad","surprise","neutral"],T0,E2=[],Vt=0,Dt=0,N5=Number.MAX_SAFE_INTEGER;async function Zt(e){var t;return v.initial&&(T0=null),T0?e.debug&&u("cached model:",T0.modelUrl):T0=await N((t=e.face.emotion)==null?void 0:t.modelPath),T0}async function O5(e,t,o,n){var a,i;if(!T0)return[];let r=N5<(((a=t.face.emotion)==null?void 0:a.skipFrames)||0),s=(((i=t.face.emotion)==null?void 0:i.skipTime)||0)>g()-Dt;return t.skipAllowed&&s&&r&&Vt===n&&E2[o]&&E2[o].length>0?(N5++,E2[o]):(N5=0,new Promise(async y=>{var d,l;let x=[];if((d=t.face.emotion)!=null&&d.enabled){let f={},c=T0!=null&&T0.inputs[0].shape?T0.inputs[0].shape[2]:0;f.resize=A.image.resizeBilinear(e,[c,c],!1),f.channels=A.mul(f.resize,W.rgb),f.grayscale=A.sum(f.channels,3,!0),f.grayscaleSub=A.sub(f.grayscale,W.tf05),f.grayscaleMul=A.mul(f.grayscaleSub,W.tf2),f.emotion=T0==null?void 0:T0.execute(f.grayscaleMul),Dt=g();let b=await f.emotion.data();for(let p=0;p(((l=t.face.emotion)==null?void 0:l.minConfidence)||0)&&x.push({score:Math.min(.99,Math.trunc(100*b[p])/100),emotion:fr[p]});x.sort((p,R)=>R.score-p.score),Object.keys(f).forEach(p=>A.dispose(f[p]))}E2[o]=x,Vt=n,y(x)}))}var h0,L5=[],qt=0,Ut=0,Yt=Number.MAX_SAFE_INTEGER;async function Kt(e){return v.initial&&(h0=null),h0?e.debug&&u("cached model:",h0.modelUrl):h0=await N(e.face.mobilefacenet.modelPath),h0}async function W5(e,t,o,n){var a,i;if(!h0)return[];let r=Yt<(((a=t.face.mobilefacenet)==null?void 0:a.skipFrames)||0),s=(((i=t.face.mobilefacenet)==null?void 0:i.skipTime)||0)>g()-Ut;return t.skipAllowed&&s&&r&&qt===n&&L5[o]?(Yt++,L5[o]):new Promise(async y=>{var d;let x=[];if(((d=t.face.mobilefacenet)==null?void 0:d.enabled)&&(h0==null?void 0:h0.inputs[0].shape)){let l={};l.crop=A.image.resizeBilinear(e,[h0.inputs[0].shape[2],h0.inputs[0].shape[1]],!1),l.data=h0==null?void 0:h0.execute(l.crop);let f=await l.data.data();x=Array.from(f),Object.keys(l).forEach(c=>A.dispose(l[c]))}L5[o]=x,qt=n,Ut=g(),y(x)})}var b0,F5=[],Qt=0,_t=0,$t=Number.MAX_SAFE_INTEGER;async function e3(e){return v.initial&&(b0=null),b0?e.debug&&u("cached model:",b0.modelUrl):b0=await N(e.face.insightface.modelPath),b0}async function G5(e,t,o,n){var a,i;if(!b0)return[];let r=$t<(((a=t.face.insightface)==null?void 0:a.skipFrames)||0),s=(((i=t.face.insightface)==null?void 0:i.skipTime)||0)>g()-_t;return t.skipAllowed&&s&&r&&Qt===n&&F5[o]?($t++,F5[o]):new Promise(async y=>{var d;let x=[];if(((d=t.face.insightface)==null?void 0:d.enabled)&&(b0==null?void 0:b0.inputs[0].shape)){let l={};l.crop=A.image.resizeBilinear(e,[b0.inputs[0].shape[2],b0.inputs[0].shape[1]],!1),l.data=b0==null?void 0:b0.execute(l.crop);let f=await l.data.data();x=Array.from(f),Object.keys(l).forEach(c=>A.dispose(l[c]))}F5[o]=x,Qt=n,_t=g(),y(x)})}var D0,$0=0,mr=2.3,B5=z0.leftEyeLower0,H5=z0.rightEyeLower0,ze={leftBounds:[B5[0],B5[B5.length-1]],rightBounds:[H5[0],H5[H5.length-1]]},Se={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function A3(e){var t;return v.initial&&(D0=null),D0?e.debug&&u("cached model:",D0.modelUrl):D0=await N((t=e.face.iris)==null?void 0:t.modelPath),$0=D0.inputs[0].shape?D0.inputs[0].shape[2]:0,$0===-1&&($0=64),D0}function z2(e,t,o,n){for(let r=0;r{let t=e[ze.leftBounds[0]][2],o=e[ze.rightBounds[0]][2];return t-o},o3=(e,t,o,n,r,s=!1)=>{let a=M2(g2(pt([e[o],e[n]]),mr)),i=ve(a),y=A.image.cropAndResize(t,[[a.startPoint[1]/r,a.startPoint[0]/r,a.endPoint[1]/r,a.endPoint[0]/r]],[0],[$0,$0]);if(s&&v.kernels.includes("flipleftright")){let x=A.image.flipLeftRight(y);A.dispose(y),y=x}return{box:a,boxSize:i,crop:y}},n3=(e,t,o,n=!1)=>{let r=[];for(let s=0;s{let n=e[z0[`${o}EyeUpper0`][Se.upperCenter]][2],r=e[z0[`${o}EyeLower0`][Se.lowerCenter]][2],s=(n+r)/2;return t.map((a,i)=>{let y=s;return i===2?y=n:i===4&&(y=r),[a[0],a[1],y]})};async function s3(e,t,o,n){if(!D0)return o.debug&&u("face mesh iris detection requested, but model is not loaded"),e;let{box:r,boxSize:s,crop:a}=o3(e,t,ze.leftBounds[0],ze.leftBounds[1],n,!0),{box:i,boxSize:y,crop:x}=o3(e,t,ze.rightBounds[0],ze.rightBounds[1],n,!0),d=A.concat([a,x]);A.dispose(a),A.dispose(x);let l=D0.execute(d);A.dispose(d);let f=await l.data();A.dispose(l);let c=f.slice(0,Se.numCoordinates*3),{rawCoords:b,iris:p}=n3(c,r,s,!0),R=f.slice(Se.numCoordinates*3),{rawCoords:P,iris:M}=n3(R,i,y,!1),m=pr(e);Math.abs(m)<30?(z2(e,b,"left",null),z2(e,P,"right",null)):m<1?z2(e,b,"left",["EyeUpper0","EyeLower0"]):z2(e,P,"right",["EyeUpper0","EyeLower0"]);let h=r3(e,p,"left"),C=r3(e,M,"right");return e.concat(h).concat(C)}var ur=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],hr=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],br=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],gr=[[474,475],[475,476],[476,477],[477,474]],Mr=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],Pr=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Rr=[[469,470],[470,471],[471,472],[472,469]],Tr=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function ee(e){let t=e.map(o=>o[0]);return t.push(e[e.length-1][1]),t}var vr={lips:ee(ur),leftEye:ee(hr),leftEyebrow:ee(br),leftIris:ee(gr),rightEye:ee(Mr),rightEyebrow:ee(Pr),rightIris:ee(Rr),faceOval:ee(Tr)},wr=Object.entries(vr).map(([e,t])=>t.map(o=>[o,e])).flat(),V7=new Map(wr),o2=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],de=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],fe=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];async function l3(e,t){let o={lips:await t.filter(s=>s.size===160)[0].data(),irisL:await t.filter(s=>s.size===10)[0].data(),eyeL:await t.filter(s=>s.size===142)[0].data(),irisR:await t.filter(s=>s.size===10)[1].data(),eyeR:await t.filter(s=>s.size===142)[1].data()},n=de.reduce((s,a)=>s+=e[a][2],0)/de.length;for(let s=0;ss+=e[a][2],0)/fe.length;for(let s=0;sg()-W0.timestamp,n=W0.skipped<(((y=t.face.detector)==null?void 0:y.skipFrames)||0);!t.skipAllowed||!o||!n||W0.boxes.length===0?(W0.boxes=await vt(e,t),W0.timestamp=g(),W0.skipped=0):W0.skipped++;let r=[],s=[],a=0;for(let m=0;mO.shape[O.shape.length-1]===1).data();if(k.faceScore=Math.round(100*B[0])/100,k.faceScore<(((b=t.face.detector)==null?void 0:b.minConfidence)||1)){if(h.confidence=k.faceScore,(p=t.face.mesh)!=null&&p.keepInvalid){k.box=h2(h,e),k.boxRaw=b2(h,e),k.score=k.boxScore,k.mesh=h.landmarks.map(O=>[(h.startPoint[0]+h.endPoint[0])/2+(h.endPoint[0]+h.startPoint[0])*O[0]/we(),(h.startPoint[1]+h.endPoint[1])/2+(h.endPoint[1]+h.startPoint[1])*O[1]/we()]),k.meshRaw=k.mesh.map(O=>[O[0]/(e.shape[2]||1),O[1]/(e.shape[1]||1),(O[2]||0)/me]);for(let O of Object.keys(le))k.annotations[O]=[k.mesh[le[O]]]}}else{let O=z.find(e0=>e0.shape[e0.shape.length-1]===1404),K=A.reshape(O,[-1,3]),Z=await K.array();A.dispose(K),(R=t.face.attention)!=null&&R.enabled?Z=await l3(Z,z):(P=t.face.iris)!=null&&P.enabled&&(Z=await s3(Z,k.tensor,t,me)),k.mesh=bt(Z,h,C,j,me),k.meshRaw=k.mesh.map(e0=>[e0[0]/(e.shape[2]||0),e0[1]/(e.shape[1]||0),(e0[2]||0)/me]);for(let e0 of Object.keys(z0))k.annotations[e0]=z0[e0].map(R0=>k.mesh[R0]);k.score=k.faceScore;let S={...Mt(k.mesh,h),confidence:h.confidence,landmarks:h.landmarks};k.box=h2(S,e),k.boxRaw=b2(S,e),s.push(S)}A.dispose(z)}else{k.box=h2(h,e),k.boxRaw=b2(h,e),k.score=k.boxScore,k.mesh=h.landmarks.map(z=>[(h.startPoint[0]+h.endPoint[0])/2+(h.endPoint[0]+h.startPoint[0])*z[0]/we(),(h.startPoint[1]+h.endPoint[1])/2+(h.endPoint[1]+h.startPoint[1])*z[1]/we()]),k.meshRaw=k.mesh.map(z=>[z[0]/(e.shape[2]||0),z[1]/(e.shape[1]||0),(z[2]||0)/me]);for(let z of Object.keys(le))k.annotations[z]=[k.mesh[le[z]]]}k.score>(((M=t.face.detector)==null?void 0:M.minConfidence)||1)?r.push(k):A.dispose(k.tensor)}return W0.boxes=s,r}async function x3(e){var t,o,n,r,s,a;return v.initial&&(i0=null),((o=(t=e==null?void 0:e.face)==null?void 0:t.attention)==null?void 0:o.enabled)&&(i0==null?void 0:i0.signature)&&Object.keys(((n=i0==null?void 0:i0.signature)==null?void 0:n.outputs)||{}).length<6&&(i0=null),i0?e.debug&&u("cached model:",i0.modelUrl):(r=e.face.attention)!=null&&r.enabled?i0=await N((s=e.face.attention)==null?void 0:s.modelPath):i0=await N((a=e.face.mesh)==null?void 0:a.modelPath),me=i0.inputs[0].shape?i0.inputs[0].shape[2]:0,i0}var c3=ye,d3=$e;var g0,S2=[],f3=0,m3=0,D5=Number.MAX_SAFE_INTEGER;async function p3(e){var t;return v.initial&&(g0=null),g0?e.debug&&u("cached model:",g0.modelUrl):g0=await N((t=e.face.description)==null?void 0:t.modelPath),g0}function Z5(e){let t=e.image||e.tensor||e;if(!(g0!=null&&g0.inputs[0].shape))return t;let o=A.image.resizeBilinear(t,[g0.inputs[0].shape[2],g0.inputs[0].shape[1]],!1),n=A.mul(o,W.tf255);return A.dispose(o),n}async function X5(e,t,o,n){var a,i,y,x;if(!g0)return{age:0,gender:"unknown",genderScore:0,descriptor:[]};let r=D5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),s=(((i=t.face.description)==null?void 0:i.skipTime)||0)>g()-f3;return t.skipAllowed&&r&&s&&m3===n&&((y=S2[o])==null?void 0:y.age)&&((x=S2[o])==null?void 0:x.age)>0?(D5++,S2[o]):(D5=0,new Promise(async d=>{var f,c;let l={age:0,gender:"unknown",genderScore:0,descriptor:[]};if((f=t.face.description)!=null&&f.enabled){let b=Z5(e),p=g0==null?void 0:g0.execute(b);f3=g(),A.dispose(b);let P=await(await p.find(F=>F.shape[1]===1)).data(),M=Math.trunc(200*Math.abs(P[0]-.5))/100;M>(((c=t.face.description)==null?void 0:c.minConfidence)||0)&&(l.gender=P[0]<=.5?"female":"male",l.genderScore=Math.min(.99,M));let m=A.argMax(p.find(F=>F.shape[1]===100),1),h=(await m.data())[0];A.dispose(m);let j=await p.find(F=>F.shape[1]===100).data();l.age=Math.round(j[h-1]>j[h+1]?10*h-100*j[h-1]:10*h+100*j[h+1])/10;let k=p.find(F=>F.shape[1]===1024),z=k?await k.data():[];l.descriptor=Array.from(z),p.forEach(F=>A.dispose(F))}S2[o]=l,m3=n,d(l)}))}function C2(e){return[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])]}function n2(e){return[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2]}function b3(e,t,o){let n=t.shape[1],r=t.shape[2],s=[[e.startPoint[1]/n,e.startPoint[0]/r,e.endPoint[1]/n,e.endPoint[0]/r]];return A.image.cropAndResize(t,s,[0],o)}function g3(e,t){let o=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],n=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]],r=e.palmLandmarks.map(s=>[s[0]*t[0],s[1]*t[1]]);return{startPoint:o,endPoint:n,palmLandmarks:r,confidence:e.confidence}}function I2(e,t=1.5){let o=n2(e),n=C2(e),r=[t*n[0]/2,t*n[1]/2],s=[o[0]-r[0],o[1]-r[1]],a=[o[0]+r[0],o[1]+r[1]];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function j2(e){let t=n2(e),o=C2(e),r=Math.max(...o)/2,s=[t[0]-r,t[1]-r],a=[t[0]+r,t[1]+r];return{startPoint:s,endPoint:a,palmLandmarks:e.palmLandmarks}}function Er(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function M3(e,t){let o=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return Er(o)}var u3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function te(e,t){let o=0;for(let n=0;n[o.x,o.y]),this.anchorsTensor=A.tensor2d(this.anchors),this.inputSize=this.model&&this.model.inputs&&this.model.inputs[0].shape?this.model.inputs[0].shape[2]:0,this.inputSizeTensor=A.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=A.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let o={};o.boxOffsets=A.slice(t,[0,0],[-1,2]),o.boxSizes=A.slice(t,[0,2],[-1,2]),o.div=A.div(o.boxOffsets,this.inputSizeTensor),o.boxCenterPoints=A.add(o.div,this.anchorsTensor),o.halfBoxSizes=A.div(o.boxSizes,this.doubleInputSizeTensor),o.sub=A.sub(o.boxCenterPoints,o.halfBoxSizes),o.startPoints=A.mul(o.sub,this.inputSizeTensor),o.add=A.add(o.boxCenterPoints,o.halfBoxSizes),o.endPoints=A.mul(o.add,this.inputSizeTensor);let n=A.concat2d([o.startPoints,o.endPoints],1);return Object.keys(o).forEach(r=>A.dispose(o[r])),n}normalizeLandmarks(t,o){let n={};n.reshape=A.reshape(t,[-1,7,2]),n.div=A.div(n.reshape,this.inputSizeTensor),n.landmarks=A.add(n.div,this.anchors[o]);let r=A.mul(n.landmarks,this.inputSizeTensor);return Object.keys(n).forEach(s=>A.dispose(n[s])),r}async predict(t,o){let n={};n.resize=A.image.resizeBilinear(t,[this.inputSize,this.inputSize]),n.div=A.div(n.resize,W.tf127),n.image=A.sub(n.div,W.tf1),n.batched=this.model.execute(n.image),n.predictions=A.squeeze(n.batched),n.slice=A.slice(n.predictions,[0,0],[-1,1]),n.sigmoid=A.sigmoid(n.slice),n.scores=A.squeeze(n.sigmoid);let r=await n.scores.data();n.boxes=A.slice(n.predictions,[0,1],[-1,4]),n.norm=this.normalizeBoxes(n.boxes),n.nms=A.image.nonMaxSuppression(n.norm,n.scores,3*o.hand.maxDetected,o.hand.iouThreshold,o.hand.minConfidence);let s=await n.nms.array(),a=[];for(let i of s){let y={};y.box=A.slice(n.norm,[i,0],[1,-1]),y.slice=A.slice(n.predictions,[i,5],[1,14]),y.norm=this.normalizeLandmarks(y.slice,i),y.palmLandmarks=A.reshape(y.norm,[-1,2]);let x=await y.box.data(),d=x.slice(0,2),l=x.slice(2,4),f=await y.palmLandmarks.array(),c={startPoint:d,endPoint:l,palmLandmarks:f,confidence:r[i]},b=g3(c,[t.shape[2]/this.inputSize,t.shape[1]/this.inputSize]);a.push(b),Object.keys(y).forEach(p=>A.dispose(y[p]))}return Object.keys(n).forEach(i=>A.dispose(n[i])),a}};var Ir=5,v3=1.65,w3=[0,5,9,13,17,1,2],jr=0,Nr=2,k3=0,O2=class{constructor(t,o){w(this,"handDetector");w(this,"handPoseModel");w(this,"inputSize");w(this,"storedBoxes");w(this,"skipped");w(this,"detectedHands");this.handDetector=t,this.handPoseModel=o,this.inputSize=this.handPoseModel&&this.handPoseModel.inputs[0].shape?this.handPoseModel.inputs[0].shape[2]:0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let o=t.map(a=>a[0]),n=t.map(a=>a[1]),r=[Math.min(...o),Math.min(...n)],s=[Math.max(...o),Math.max(...n)];return{startPoint:r,endPoint:s}}getBoxForPalmLandmarks(t,o){let n=t.map(s=>Y5([...s,1],o)),r=this.calculateLandmarksBoundingBox(n);return I2(j2(r),Ir)}getBoxForHandLandmarks(t){let o=this.calculateLandmarksBoundingBox(t),n=I2(j2(o),v3);n.palmLandmarks=[];for(let r=0;r[a[0]*(c[0]-this.inputSize/2),a[1]*(c[1]-this.inputSize/2),a[2]*c[2]]),y=U5(n,[0,0]),x=i.map(c=>[...Y5(c,y),c[2]]),d=P3(r),l=[...n2(o),1],f=[te(l,d[0]),te(l,d[1])];return x.map(c=>[Math.trunc(c[0]+f[0]),Math.trunc(c[1]+f[1]),Math.trunc(c[2])])}async estimateHands(t,o){let n=!1,r,s=(o.hand.skipTime||0)>g()-k3,a=this.skipped<(o.hand.skipFrames||0);o.skipAllowed&&s&&a&&(r=await this.handDetector.predict(t,o),this.skipped=0),o.skipAllowed&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==o.hand.maxDetected||!o.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(n=!0));let i=[];for(let y=0;y=o.hand.minConfidence/4){let C=A.reshape(m,[-1,3]),j=await C.array();A.dispose(m),A.dispose(C);let k=this.transformRawCoords(j,p,d,b),z=this.getBoxForHandLandmarks(k);this.storedBoxes[y]={...z,confidence:h};let F={landmarks:k,confidence:h,boxConfidence:x.confidence,fingerConfidence:h,box:{topLeft:z.startPoint,bottomRight:z.endPoint}};i.push(F)}else this.storedBoxes[y]=null;A.dispose(m)}else{let d=I2(j2(x),v3),l={confidence:x.confidence,boxConfidence:x.confidence,fingerConfidence:0,box:{topLeft:d.startPoint,bottomRight:d.endPoint},landmarks:[]};i.push(l)}}return this.storedBoxes=this.storedBoxes.filter(y=>y!==null),this.detectedHands=i.length,i.length>o.hand.maxDetected&&(i.length=o.hand.maxDetected),i}};var f0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>f0.nameMapping[e],getPoints:e=>f0.pointsMapping[e]},ne={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>ne.nameMapping[e]},J={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>J.nameMapping[e]},oe=class{constructor(t){w(this,"name");w(this,"curls");w(this,"directions");w(this,"weights");w(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,o,n){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([o,n])}direction(t,o,n){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([o,n])}weight(t,o){this.weights[t]=o;let n=this.weights.reduce((r,s)=>r+s,0);this.weightsRelative=this.weights.map(r=>r*5/n)}matchAgainst(t,o){let n=0;for(let r in t){let s=t[r],a=this.curls[r];if(typeof a=="undefined"){n+=this.weightsRelative[r];continue}for(let[i,y]of a)if(s===i){n+=y*this.weightsRelative[r];break}}for(let r in o){let s=o[r],a=this.directions[r];if(typeof a=="undefined"){n+=this.weightsRelative[r];continue}for(let[i,y]of a)if(s===i){n+=y*this.weightsRelative[r];break}}return n/10}};var{thumb:C0,index:Z0,middle:X0,ring:pe,pinky:ue}=f0,{none:I0,half:Lr,full:j0}=ne,{verticalUp:Ce,verticalDown:n4,horizontalLeft:K5,horizontalRight:Wr,diagonalUpRight:Fr,diagonalUpLeft:Ie,diagonalDownRight:r4,diagonalDownLeft:A4}=J,re=new oe("thumbs up");re.curl(C0,I0,1);re.direction(C0,Ce,1);re.direction(C0,Ie,.25);re.direction(C0,Fr,.25);for(let e of[f0.index,f0.middle,f0.ring,f0.pinky])re.curl(e,j0,1),re.direction(e,K5,1),re.direction(e,Wr,1);var o0=new oe("victory");o0.curl(C0,Lr,.5);o0.curl(C0,I0,.5);o0.direction(C0,Ce,1);o0.direction(C0,Ie,1);o0.curl(Z0,I0,1);o0.direction(Z0,Ce,.75);o0.direction(Z0,Ie,1);o0.curl(X0,I0,1);o0.direction(X0,Ce,1);o0.direction(X0,Ie,.75);o0.curl(pe,j0,1);o0.direction(pe,Ce,.2);o0.direction(pe,Ie,1);o0.direction(pe,K5,.2);o0.curl(ue,j0,1);o0.direction(ue,Ce,.2);o0.direction(ue,Ie,1);o0.direction(ue,K5,.2);o0.weight(Z0,2);o0.weight(X0,2);var Ae=new oe("point");Ae.curl(C0,j0,1);Ae.curl(Z0,I0,.5);Ae.curl(X0,j0,.5);Ae.curl(pe,j0,.5);Ae.curl(ue,j0,.5);Ae.weight(Z0,2);Ae.weight(X0,2);var se=new oe("middle finger");se.curl(C0,I0,1);se.curl(Z0,j0,.5);se.curl(X0,j0,.5);se.curl(pe,j0,.5);se.curl(ue,j0,.5);se.weight(Z0,2);se.weight(X0,2);var je=new oe("open palm");je.curl(C0,I0,.75);je.curl(Z0,I0,.75);je.curl(X0,I0,.75);je.curl(pe,I0,.75);je.curl(ue,I0,.75);var E3=[re,o0,Ae,se,je];var Gr=.7,he={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function z3(e,t,o,n){let r=(t-n)/(e-o),s=Math.atan(r)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function C3(e,t){if(!e||!t)return[0,0];let o=z3(e[0],e[1],t[0],t[1]);if(e.length===2)return o;let n=z3(e[1],e[2],t[1],t[2]);return[o,n]}function S3(e,t=1){let o=0,n=0,r=0;return e>=75&&e<=105?o=1*t:e>=25&&e<=155?n=1*t:r=1*t,[o,n,r]}function Br(e,t,o){let n=e[0]-t[0],r=e[0]-o[0],s=t[0]-o[0],a=e[1]-t[1],i=e[1]-o[1],y=t[1]-o[1],x=e[2]-t[2],d=e[2]-o[2],l=t[2]-o[2],f=Math.sqrt(n*n+a*a+x*x),c=Math.sqrt(r*r+i*i+d*d),b=Math.sqrt(s*s+y*y+l*l),p=(b*b+f*f-c*c)/(2*b*f);p>1?p=1:p<-1&&(p=-1);let R=Math.acos(p);R=57.2958*R%180;let P;return R>he.NO_CURL_START_LIMIT?P=ne.none:R>he.HALF_CURL_START_LIMIT?P=ne.half:P=ne.full,P}function I3(e,t,o,n){let r;return n===Math.abs(e)?e>0?r=J.horizontalLeft:r=J.horizontalRight:n===Math.abs(t)?t>0?r=J.horizontalLeft:r=J.horizontalRight:o>0?r=J.horizontalLeft:r=J.horizontalRight,r}function j3(e,t,o,n){let r;return n===Math.abs(e)?e<0?r=J.verticalDown:r=J.verticalUp:n===Math.abs(t)?t<0?r=J.verticalDown:r=J.verticalUp:o<0?r=J.verticalDown:r=J.verticalUp,r}function Hr(e,t,o,n,r,s,a,i){let y,x=j3(e,t,o,n),d=I3(r,s,a,i);return x===J.verticalUp?d===J.horizontalLeft?y=J.diagonalUpLeft:y=J.diagonalUpRight:d===J.horizontalLeft?y=J.diagonalDownLeft:y=J.diagonalDownRight,y}function Vr(e,t,o,n){let r=e[0]-t[0],s=e[0]-o[0],a=t[0]-o[0],i=e[1]-t[1],y=e[1]-o[1],x=t[1]-o[1],d=Math.max(Math.abs(r),Math.abs(s),Math.abs(a)),l=Math.max(Math.abs(i),Math.abs(y),Math.abs(x)),f=0,c=0,b=0,p=l/(d+1e-5);p>1.5?f+=he.DISTANCE_VOTE_POWER:p>.66?c+=he.DISTANCE_VOTE_POWER:b+=he.DISTANCE_VOTE_POWER;let R=Math.sqrt(r*r+i*i),P=Math.sqrt(s*s+y*y),M=Math.sqrt(a*a+x*x),m=Math.max(R,P,M),h=e[0],C=e[1],j=o[0],k=o[1];m===R?(j=o[0],k=o[1]):m===M&&(h=t[0],C=t[1]);let B=C3([h,C],[j,k]),O=S3(B,he.TOTAL_ANGLE_VOTE_POWER);f+=O[0],c+=O[1],b+=O[2];for(let Z of n){let S=S3(Z,he.SINGLE_ANGLE_VOTE_POWER);f+=S[0],c+=S[1],b+=S[2]}let K;return f===Math.max(f,c,b)?K=j3(y,i,x,l):b===Math.max(c,b)?K=I3(s,r,a,d):K=Hr(y,i,x,l,s,r,a,d),K}function N3(e){let t=[],o=[],n=[],r=[];if(!e)return{curls:n,directions:r};for(let s of f0.all){let a=f0.getPoints(s),i=[],y=[];for(let x of a){let d=e[x[0]],l=e[x[1]],f=C3(d,l),c=f[0],b=f[1];i.push(c),y.push(b)}t.push(i),o.push(y)}for(let s of f0.all){let a=s===f0.thumb?1:0,i=f0.getPoints(s),y=e[i[a][0]],x=e[i[a+1][1]],d=e[i[3][1]],l=Br(y,x,d),f=Vr(y,x,d,t[s].slice(a));n[s]=l,r[s]=f}return{curls:n,directions:r}}function L2(e){if(!e||e.length===0)return null;let t=N3(e),o={};for(let n of f0.all)o[f0.getName(n)]={curl:ne.getName(t.curls[n]),direction:J.getName(t.directions[n])};return o}function O3(e){let t=[];if(!e||e.length===0)return t;let o=N3(e);for(let n of E3){let r=n.matchAgainst(o.curls,o.directions);r>=Gr&&t.push({name:n.name,confidence:r})}return t}var L3={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},Ne,Oe,W3;async function Q5(e,t){let o=await W3.estimateHands(e,t);if(!o)return[];let n=[];for(let r=0;ro[r].landmarks[l]);let a=o[r].landmarks,i=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],y=[0,0,0,0];if(a&&a.length>0){for(let d of a)d[0]i[2]&&(i[2]=d[0]),d[1]>i[3]&&(i[3]=d[1]);i[2]-=i[0],i[3]-=i[1],y=[i[0]/(e.shape[2]||0),i[1]/(e.shape[1]||0),i[2]/(e.shape[2]||0),i[3]/(e.shape[1]||0)]}else i=o[r].box?[Math.trunc(Math.max(0,o[r].box.topLeft[0])),Math.trunc(Math.max(0,o[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,o[r].box.bottomRight[0])-Math.max(0,o[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,o[r].box.bottomRight[1])-Math.max(0,o[r].box.topLeft[1]))]:[0,0,0,0],y=[o[r].box.topLeft[0]/(e.shape[2]||0),o[r].box.topLeft[1]/(e.shape[1]||0),(o[r].box.bottomRight[0]-o[r].box.topLeft[0])/(e.shape[2]||0),(o[r].box.bottomRight[1]-o[r].box.topLeft[1])/(e.shape[1]||0)];let x=L2(a);n.push({id:r,score:Math.round(100*o[r].confidence)/100,boxScore:Math.round(100*o[r].boxConfidence)/100,fingerScore:Math.round(100*o[r].fingerConfidence)/100,label:"hand",box:i,boxRaw:y,keypoints:a,annotations:s,landmarks:x})}return n}async function _5(e){var o,n;v.initial&&(Ne=null,Oe=null),!Ne||!Oe?[Ne,Oe]=await Promise.all([e.hand.enabled?N((o=e.hand.detector)==null?void 0:o.modelPath):null,e.hand.landmarks?N((n=e.hand.skeleton)==null?void 0:n.modelPath):null]):(e.debug&&u("cached model:",Ne.modelUrl),e.debug&&u("cached model:",Oe.modelUrl));let t=new N2(Ne);return W3=new O2(t,Oe),[Ne,Oe]}var Y={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function Dr(){let e=Y.gl;!e||(Y.extensions=e.getSupportedExtensions())}async function G3(e){var t;if(e.config.backend==="humangl"&&(Y.name in A.engine().registry&&(!Y.gl||!Y.gl.getParameter(Y.gl.VERSION))&&(u("error: humangl backend invalid context"),W2(e)),!A.findBackend(Y.name))){try{Y.canvas=await c0(100,100)}catch(n){u("error: cannot create canvas:",n);return}try{if(Y.gl=(t=Y.canvas)==null?void 0:t.getContext("webgl2",Y.webGLattr),!Y.gl.getParameter(Y.gl.VERSION).includes("2.0")){u("override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}Y.canvas&&(Y.canvas.addEventListener("webglcontextlost",async r=>{throw u("error: humangl:",r.type),u("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),Y.canvas.addEventListener("webglcontextrestored",r=>{u("error: humangl context restored:",r)}),Y.canvas.addEventListener("webglcontextcreationerror",r=>{u("error: humangl context create:",r)}))}catch(n){u("error: cannot get WebGL context:",n);return}try{A.setWebGLContext(2,Y.gl)}catch(n){u("error: cannot set WebGL context:",n);return}try{let n=new A.GPGPUContext(Y.gl);A.registerBackend(Y.name,()=>new A.MathBackendWebGL(n),Y.priority)}catch(n){u("error: cannot register WebGL backend:",n);return}try{A.getKernelsForBackend("webgl").forEach(r=>{let s={...r,backendName:Y.name};A.registerKernel(s)})}catch(n){u("error: cannot update WebGL backend registration:",n);return}let o=A.backend().getGPGPUContext?A.backend().getGPGPUContext().gl:null;if(o)u(`humangl webgl version:${o.getParameter(o.VERSION)} renderer:${o.getParameter(o.RENDERER)}`);else{u("error: no current gl context:",o,Y.gl);return}try{A.env().flagRegistry.WEBGL_VERSION&&A.env().set("WEBGL_VERSION",2)}catch(n){u("error: cannot set WebGL backend flags:",n);return}Dr(),u("backend registered:",Y.name)}}function Zr(){if(!v.kernels.includes("mod")){let e={kernelName:"Mod",backendName:A.getBackend(),kernelFunc:t=>A.tidy(()=>A.sub(t.inputs.a,A.mul(A.div(t.inputs.a,t.inputs.b),t.inputs.b)))};A.registerKernel(e),v.kernels.push("mod")}if(!v.kernels.includes("floormod")){let e={kernelName:"FloorMod",backendName:A.getBackend(),kernelFunc:t=>A.tidy(()=>A.floorDiv(t.inputs.a/t.inputs.b)*t.inputs.b+A.mod(t.inputs.a,t.inputs.b))};A.registerKernel(e),v.kernels.push("floormod")}}async function F2(e,t=!1){if(e.state="backend",t||v.initial||e.config.backend&&e.config.backend.length>0&&A.getBackend()!==e.config.backend){let o=g();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&u("running inside web worker"),v.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&u("override: backend set to tensorflow while running in browser"),e.config.backend="humangl"),v.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&u(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),v.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")u("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="humangl";else{let r=await navigator.gpu.requestAdapter();if(e.config.debug&&u("enumerated webgpu adapter:",r),!r)u("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="humangl";else{let s="requestAdapterInfo"in r?await r.requestAdapterInfo():void 0;u("webgpu adapter info:",s)}}e.config.backend==="humangl"&&await G3(e);let n=Object.keys(A.engine().registryFactory);if(e.config.debug&&u("available backends:",n),n.includes(e.config.backend)||(u(`error: backend ${e.config.backend} not found in registry`),e.config.backend=v.node?"tensorflow":"webgl",e.config.debug&&u(`override: setting backend ${e.config.backend}`)),e.config.debug&&u("setting backend:",e.config.backend),e.config.backend==="wasm"){if(A.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&A.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&u("wasm path:",e.config.wasmPath),typeof(A==null?void 0:A.setWasmPaths)!="undefined")await A.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let r=await A.env().getAsync("WASM_HAS_SIMD_SUPPORT"),s=await A.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");e.config.debug&&u(`wasm execution: ${r?"SIMD":"no SIMD"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!r&&u("warning: wasm simd support is not enabled")}try{await A.setBackend(e.config.backend),await A.ready(),et()}catch(r){return u("error: cannot set backend:",e.config.backend,r),!1}}if(A.getBackend()==="humangl"&&(A.env().flagRegistry.CHECK_COMPUTATION_FOR_ERRORS&&A.env().set("CHECK_COMPUTATION_FOR_ERRORS",!1),A.env().flagRegistry.WEBGL_CPU_FORWARD&&A.env().set("WEBGL_CPU_FORWARD",!0),A.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&A.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),A.env().flagRegistry.CPU_HANDOFF_SIZE_THRESHOLD&&A.env().set("CPU_HANDOFF_SIZE_THRESHOLD",256),A.env().flagRegistry.WEBGL_EXP_CONV&&A.env().set("WEBGL_EXP_CONV",!0),A.env().flagRegistry.USE_SETTIMEOUTCUSTOM&&A.env().set("USE_SETTIMEOUTCUSTOM",!0),typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),A.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0)),A.backend().getGPGPUContext)){let n=await A.backend().getGPGPUContext().gl;e.config.debug&&u(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}A.getBackend(),A.enableProdMode(),await A.ready(),e.performance.initBackend=Math.trunc(g()-o),e.config.backend=A.getBackend(),await v.updateBackend(),Zr()}return!0}function G2(e,t){for(let o of e){let n={kernelName:o,backendName:t.backend,kernelFunc:()=>{t.debug&&u("kernelFunc",o,t.backend)}};A.registerKernel(n)}v.kernels=A.getKernelsForBackend(A.getBackend()).map(o=>o.kernelName.toLowerCase())}var r0=[null,null],qr=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],ae=[[0,0],[0,0]],Ur=["hand","fist","pinch","point","face","tip","pinchtip"],H3=4,V3=1.6,Yr=512,Kr=1.4,B2=Number.MAX_SAFE_INTEGER,e1=0,q0=[0,0],$={boxes:[],hands:[]},D3={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function Z3(e){var t;if(v.initial&&(r0[0]=null),r0[0])e.debug&&u("cached model:",r0[0].modelUrl);else{G2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),r0[0]=await N((t=e.hand.detector)==null?void 0:t.modelPath);let o=Object.values(r0[0].modelSignature.inputs);ae[0][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,ae[0][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return r0[0]}async function X3(e){var t;if(v.initial&&(r0[1]=null),r0[1])e.debug&&u("cached model:",r0[1].modelUrl);else{r0[1]=await N((t=e.hand.skeleton)==null?void 0:t.modelPath);let o=Object.values(r0[1].modelSignature.inputs);ae[1][0]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[1].size):0,ae[1][1]=Array.isArray(o)?parseInt(o[0].tensorShape.dim[2].size):0}return r0[1]}async function Jr(e,t){let o=[];if(!e||!r0[0])return o;let n={},r=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,Yr),a=Math.round(s*r/8)*8;n.resize=A.image.resizeBilinear(e,[s,a]),n.cast=A.cast(n.resize,"int32"),[n.rawScores,n.rawBoxes]=await r0[0].executeAsync(n.cast,qr),n.boxes=A.squeeze(n.rawBoxes,[0,2]),n.scores=A.squeeze(n.rawScores,[0]);let i=A.unstack(n.scores,1);A.dispose(i[H3]),i.splice(H3,1),n.filtered=A.stack(i,1),A.dispose(i),n.max=A.max(n.filtered,1),n.argmax=A.argMax(n.filtered,1);let y=0;n.nms=A.image.nonMaxSuppression(n.boxes,n.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let x=await n.nms.data(),d=await n.max.data(),l=await n.argmax.data();for(let f of Array.from(x)){let c=A.slice(n.boxes,f,1),b=await c.data();A.dispose(c);let p=[b[1],b[0],b[3]-b[1],b[2]-b[0]],R=T2(p,Kr),P=[Math.trunc(p[0]*q0[0]),Math.trunc(p[1]*q0[1]),Math.trunc(p[2]*q0[0]),Math.trunc(p[3]*q0[1])],M=d[f],m=Ur[l[f]],h={id:y++,score:M,box:P,boxRaw:R,label:m};o.push(h)}return Object.keys(n).forEach(f=>A.dispose(n[f])),o.sort((f,c)=>c.score-f.score),o.length>(t.hand.maxDetected||1)&&(o.length=t.hand.maxDetected||1),o}async function t1(e,t,o){let n={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&r0[1]&&o.hand.landmarks&&t.score>(o.hand.minConfidence||0)){let r={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];r.crop=A.image.cropAndResize(e,[s],[0],[ae[1][0],ae[1][1]],"bilinear"),r.div=A.div(r.crop,W.tf255),[r.score,r.keypoints]=r0[1].execute(r.div,["Identity_1","Identity"]);let a=(await r.score.data())[0],i=(100-Math.trunc(100/(1+Math.exp(a))))/100;if(i>=(o.hand.minConfidence||0)){n.fingerScore=i,r.reshaped=A.reshape(r.keypoints,[-1,3]);let d=(await r.reshaped.array()).map(l=>[l[0]/ae[1][1],l[1]/ae[1][0],l[2]||0]).map(l=>[l[0]*t.boxRaw[2],l[1]*t.boxRaw[3],l[2]||0]);n.keypoints=d.map(l=>[q0[0]*(l[0]+t.boxRaw[0]),q0[1]*(l[1]+t.boxRaw[1]),l[2]||0]),n.landmarks=L2(n.keypoints);for(let l of Object.keys(D3))n.annotations[l]=D3[l].map(f=>n.landmarks&&n.keypoints[f]?n.keypoints[f]:null)}Object.keys(r).forEach(y=>A.dispose(r[y]))}return n}async function o1(e,t){var r,s;if(!r0[0]||!r0[1]||!((r=r0[0])!=null&&r.inputs[0].shape)||!((s=r0[1])!=null&&s.inputs[0].shape))return[];q0=[e.shape[2]||0,e.shape[1]||0],B2++;let o=(t.hand.skipTime||0)>g()-e1,n=B2<(t.hand.skipFrames||0);return t.skipAllowed&&o&&n?$.hands:new Promise(async a=>{let i=3*(t.hand.skipTime||0)>g()-e1,y=B2<3*(t.hand.skipFrames||0);t.skipAllowed&&$.hands.length===t.hand.maxDetected?$.hands=await Promise.all($.boxes.map(d=>t1(e,d,t))):t.skipAllowed&&i&&y&&$.hands.length>0?$.hands=await Promise.all($.boxes.map(d=>t1(e,d,t))):($.boxes=await Jr(e,t),e1=g(),$.hands=await Promise.all($.boxes.map(d=>t1(e,d,t))),B2=0);let x=[...$.boxes];if($.boxes.length=0,t.cacheSensitivity>0)for(let d=0;d<$.hands.length;d++){let l=zt($.hands[d].keypoints,q0);if(l.box[2]/(e.shape[2]||1)>.05&&l.box[3]/(e.shape[1]||1)>.05&&$.hands[d].fingerScore&&$.hands[d].fingerScore>(t.hand.minConfidence||0)){let f=T2(l.box,V3),c=T2(l.boxRaw,V3);$.boxes.push({...x[d],box:f,boxRaw:c})}}for(let d=0;d<$.hands.length;d++){let l=H0($.hands[d].keypoints,q0);$.hands[d].box=l.box,$.hands[d].boxRaw=l.boxRaw}a($.hands)})}var l0,H2=[],n1=Number.MAX_SAFE_INTEGER,U3=0,Y3=0;async function K3(e){var t;return v.initial&&(l0=null),l0?e.debug&&u("cached model:",l0.modelUrl):l0=await N((t=e.face.liveness)==null?void 0:t.modelPath),l0}async function r1(e,t,o,n){var a,i;if(!l0)return 0;let r=(((a=t.face.liveness)==null?void 0:a.skipTime)||0)>g()-Y3,s=n1<(((i=t.face.liveness)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&r&&s&&U3===n&&H2[o]?(n1++,H2[o]):(n1=0,new Promise(async y=>{let x=A.image.resizeBilinear(e,[l0!=null&&l0.inputs[0].shape?l0.inputs[0].shape[2]:0,l0!=null&&l0.inputs[0].shape?l0.inputs[0].shape[1]:0],!1),d=l0==null?void 0:l0.execute(x),l=(await d.data())[0];H2[o]=Math.round(100*l)/100,U3=n,Y3=g(),A.dispose([x,d]),y(H2[o])}))}var r2={};K0(r2,{connected:()=>D2,horizontal:()=>A1,kpt:()=>V2,relative:()=>a1,vertical:()=>s1});var V2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],A1=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],s1=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],a1=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],D2={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var Q3=.005,M0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function i1(e){for(let t of A1){let o=e.keypoints.findIndex(r=>r.part===t[0]),n=e.keypoints.findIndex(r=>r.part===t[1]);if(e.keypoints[o]&&e.keypoints[n]&&e.keypoints[o].position[0]r&&r.part===t[0]),n=e.keypoints.findIndex(r=>r&&r.part===t[1]);e.keypoints[o]&&e.keypoints[n]&&e.keypoints[o].position[1]x&&x.part===t[0]),r=e.keypoints.findIndex(x=>x&&x.part===t[1]),s=e.keypoints.findIndex(x=>x&&x.part===o[0]),a=e.keypoints.findIndex(x=>x&&x.part===o[1]);if(!e.keypoints[s]||!e.keypoints[a])continue;let i=e.keypoints[n]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[n].position[0]),Math.abs(e.keypoints[a].position[0]-e.keypoints[n].position[0])]:[0,0],y=e.keypoints[r]?[Math.abs(e.keypoints[a].position[0]-e.keypoints[r].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[r].position[0])]:[0,0];if(i[0]>i[1]||y[0]>y[1]){let x=e.keypoints[n];e.keypoints[n]=e.keypoints[r],e.keypoints[r]=x}}}function _3(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],o.pad=A.pad(e,M0.padding),o.resize=A.image.resizeBilinear(o.pad,[t,t]);let n=A.cast(o.resize,"int32");return Object.keys(o).forEach(r=>A.dispose(o[r])),n}function eo(e,t){e.keypoints=e.keypoints.filter(n=>n&&n.position);for(let n of e.keypoints)n.position=[n.position[0]*(t[0]+M0.padding[2][0]+M0.padding[2][1])/t[0]-M0.padding[2][0],n.position[1]*(t[1]+M0.padding[1][0]+M0.padding[1][1])/t[1]-M0.padding[1][0]],n.positionRaw=[n.position[0]/t[0],n.position[1]/t[1]];let o=H0(e.keypoints.map(n=>n.position),t);return e.box=o.box,e.boxRaw=o.boxRaw,e}var P0,Z2=0,l1=Number.MAX_SAFE_INTEGER,be={boxes:[],bodies:[],last:0};async function to(e){return v.initial&&(P0=null),P0?e.debug&&u("cached model:",P0.modelUrl):(G2(["size"],e),P0=await N(e.body.modelPath)),Z2=P0.inputs[0].shape?P0.inputs[0].shape[2]:0,Z2<64&&(Z2=256),P0}async function _r(e,t,o){let n=e[0][0],r=[],s=0;for(let d=0;dt.body.minConfidence){let l=[n[d][1],n[d][0]];r.push({score:Math.round(100*s)/100,part:V2[d],positionRaw:l,position:[Math.round((o.shape[2]||0)*l[0]),Math.round((o.shape[1]||0)*l[1])]})}s=r.reduce((d,l)=>l.score>d?l.score:d,0);let a=[],i=H0(r.map(d=>d.position),[o.shape[2],o.shape[1]]),y={};for(let[d,l]of Object.entries(D2)){let f=[];for(let c=0;cR.part===l[c]),p=r.find(R=>R.part===l[c+1]);b&&p&&b.score>(t.body.minConfidence||0)&&p.score>(t.body.minConfidence||0)&&f.push([b.position,p.position])}y[d]=f}let x={id:0,score:s,box:i.box,boxRaw:i.boxRaw,keypoints:r,annotations:y};return i1(x),a.push(x),a}async function $r(e,t,o){let n=[];for(let r=0;rt.body.minConfidence){let i=[];for(let l=0;l<17;l++){let f=s[3*l+2];if(f>t.body.minConfidence){let c=[s[3*l+1],s[3*l+0]];i.push({part:V2[l],score:Math.round(100*f)/100,positionRaw:c,position:[Math.round((o.shape[2]||0)*c[0]),Math.round((o.shape[1]||0)*c[1])]})}}let y=H0(i.map(l=>l.position),[o.shape[2],o.shape[1]]),x={};for(let[l,f]of Object.entries(D2)){let c=[];for(let b=0;bP.part===f[b]),R=i.find(P=>P.part===f[b+1]);p&&R&&p.score>(t.body.minConfidence||0)&&R.score>(t.body.minConfidence||0)&&c.push([p.position,R.position])}x[l]=c}let d={id:r,score:a,box:y.box,boxRaw:y.boxRaw,keypoints:[...i],annotations:x};i1(d),n.push(d)}}return n.sort((r,s)=>s.score-r.score),n.length>t.body.maxDetected&&(n.length=t.body.maxDetected),n}async function y1(e,t){if(!P0||!(P0!=null&&P0.inputs[0].shape))return[];t.skipAllowed||(be.boxes.length=0),l1++;let o=(t.body.skipTime||0)>g()-be.last,n=l1<(t.body.skipFrames||0);return t.skipAllowed&&o&&n?be.bodies:new Promise(async r=>{let s={};l1=0,s.input=$3(e,Z2),s.res=P0==null?void 0:P0.execute(s.input),be.last=g();let a=await s.res.array();be.bodies=s.res.shape[2]===17?await _r(a,t,e):await $r(a,t,e);for(let i of be.bodies)eo(i,[e.shape[2]||1,e.shape[1]||1]),_3(i.keypoints);Object.keys(s).forEach(i=>A.dispose(s[i])),r(be.bodies)})}var Le,X2=[],no=0,x1=Number.MAX_SAFE_INTEGER,U2=0,q2=2.5;async function ro(e){if(!Le||v.initial){Le=await N(e.object.modelPath);let t=Object.values(Le.modelSignature.inputs);U2=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):0}else e.debug&&u("cached model:",Le.modelUrl);return Le}async function eA(e,t,o){let n=0,r=[];for(let y of[1,2,4]){let x=y*13,d=A.squeeze(e.find(R=>R.shape[1]===x**2&&(R.shape[2]||0)===Ee.length)),l=await d.array(),f=A.squeeze(e.find(R=>R.shape[1]===x**2&&(R.shape[2]||0)(o.object.minConfidence||0)&&P!==61){let m=(.5+Math.trunc(R%x))/x,h=(.5+Math.trunc(R/x))/x,C=p[R].map(Z=>Z*(x/y/U2)),[j,k]=[m-q2/y*C[0],h-q2/y*C[1]],[z,F]=[m+q2/y*C[2]-j,h+q2/y*C[3]-k],B=[j,k,z,F];B=B.map(Z=>Math.max(0,Math.min(Z,1)));let O=[B[0]*t[0],B[1]*t[1],B[2]*t[0],B[3]*t[1]],K={id:n++,score:Math.round(100*M)/100,class:P+1,label:Ee[P].label,box:O.map(Z=>Math.trunc(Z)),boxRaw:B};r.push(K)}}A.dispose([d,f,c,b])}let s=r.map(y=>[y.boxRaw[1],y.boxRaw[0],y.boxRaw[3],y.boxRaw[2]]),a=r.map(y=>y.score),i=[];if(s&&s.length>0){let y=A.image.nonMaxSuppression(s,a,o.object.maxDetected,o.object.iouThreshold,o.object.minConfidence);i=await y.data(),A.dispose(y)}return r=r.filter((y,x)=>i.includes(x)).sort((y,x)=>x.score-y.score),r}async function c1(e,t){let o=(t.object.skipTime||0)>g()-no,n=x1<(t.object.skipFrames||0);return t.skipAllowed&&o&&n&&X2.length>0?(x1++,X2):(x1=0,!v.kernels.includes("mod")||!v.kernels.includes("sparsetodense")?X2:new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],a=A.image.resizeBilinear(e,[U2,U2],!1),i=A.div(a,W.tf255),y=A.transpose(i,[0,3,1,2]),x;t.object.enabled&&(x=Le.execute(y)),no=g();let d=await eA(x,s,t);X2=d,A.dispose([a,i,y,...x]),r(d)}))}var s2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],tA=s2.length,A2=s2.reduce((e,t,o)=>(e[t]=o,e),{}),oA=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],I4=oA.map(([e,t])=>[A2[e],A2[t]]),so=[["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 ao(e){let t=e.reduce(({maxX:o,maxY:n,minX:r,minY:s},{position:{x:a,y:i}})=>({maxX:Math.max(o,a),maxY:Math.max(n,i),minX:Math.min(r,a),minY:Math.min(s,i)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function io(e,[t,o],[n,r]){let s=t/n,a=o/r,i=(x,d)=>({id:d,score:x.score,boxRaw:[x.box[0]/r,x.box[1]/n,x.box[2]/r,x.box[3]/n],box:[Math.trunc(x.box[0]*a),Math.trunc(x.box[1]*s),Math.trunc(x.box[2]*a),Math.trunc(x.box[3]*s)],keypoints:x.keypoints.map(({score:l,part:f,position:c})=>({score:l,part:f,position:[Math.trunc(c.x*a),Math.trunc(c.y*s)],positionRaw:[c.x/n,c.y/n]})),annotations:{}});return e.map((x,d)=>i(x,d))}var Y2=class{constructor(t,o){w(this,"priorityQueue");w(this,"numberOfElements");w(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=o}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let o=2*t;if(oo?o:e}function lo(e,t,o,n){let r=o-e,s=n-t;return r*r+s*s}function p1(e,t){return{x:e.x+t.x,y:e.y+t.y}}var N0,rA=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],K2=1,We=16,AA=50**2;function yo(e,t,o,n,r,s,a=2){let i=P=>({y:s.get(P.y,P.x,e),x:s.get(P.y,P.x,s.shape[2]/2+e)}),y=(P,M,m)=>({y:m1(Math.round(P.y/We),0,M-1),x:m1(Math.round(P.x/We),0,m-1)}),[x,d]=n.shape,l=y(t.position,x,d),f=i(l),b=p1(t.position,f);for(let P=0;P[A2[f],A2[c]]),a=s.map(([,f])=>f),i=s.map(([f])=>f),y=t.shape[2],x=a.length,d=new Array(y),l=f1(e.part,We,o);d[e.part.id]={score:e.score,part:s2[e.part.id],position:l};for(let f=x-1;f>=0;--f){let c=a[f],b=i[f];d[c]&&!d[b]&&(d[b]=yo(f,d[c],b,t,o,r))}for(let f=0;ft){i=!1;break}if(!i)break}return i}function iA(e,t){let[o,n,r]=t.shape,s=new Y2(o*n*r,({score:a})=>a);for(let a=0;a{var a;let s=(a=r[n])==null?void 0:a.position;return s?lo(o,t,s.y,s.x)<=AA:!1})}function lA(e,t){return t.reduce((n,{position:r,score:s},a)=>(xo(e,r,a)||(n+=s),n),0)/t.length}function yA(e,t,o,n,r,s){let a=[],i=iA(s,t);for(;a.lengthc.score>s);let l=lA(a,d),f=ao(d);l>s&&a.push({keypoints:d,box:f,score:Math.round(100*l)/100})}return a}async function u1(e,t){let o=A.tidy(()=>{if(!N0.inputs[0].shape)return[];let a=A.image.resizeBilinear(e,[N0.inputs[0].shape[2],N0.inputs[0].shape[1]]),i=A.sub(A.div(A.cast(a,"float32"),127.5),1),x=N0.execute(i,rA).map(d=>A.squeeze(d,[0]));return x[1]=A.sigmoid(x[1]),x}),n=await Promise.all(o.map(a=>a.buffer()));for(let a of o)A.dispose(a);let r=await yA(n[0],n[1],n[2],n[3],t.body.maxDetected,t.body.minConfidence);return N0.inputs[0].shape?io(r,[e.shape[1],e.shape[2]],[N0.inputs[0].shape[2],N0.inputs[0].shape[1]]):[]}async function co(e){return!N0||v.initial?N0=await N(e.body.modelPath):e.debug&&u("cached model:",N0.modelUrl),N0}var F0,h1=!1;async function b1(e){return!F0||v.initial?F0=await N(e.segmentation.modelPath):e.debug&&u("cached model:",F0.modelUrl),F0}async function mo(e,t,o){var p,R;if(h1)return{data:[],canvas:null,alpha:null};h1=!0,F0||await b1(o);let n=await Te(e,o),r=((p=n.tensor)==null?void 0:p.shape[2])||0,s=((R=n.tensor)==null?void 0:R.shape[1])||0;if(!n.tensor)return{data:[],canvas:null,alpha:null};let a={};a.resize=A.image.resizeBilinear(n.tensor,[F0.inputs[0].shape?F0.inputs[0].shape[1]:0,F0.inputs[0].shape?F0.inputs[0].shape[2]:0],!1),A.dispose(n.tensor),a.norm=A.div(a.resize,W.tf255),a.res=F0.execute(a.norm),a.squeeze=A.squeeze(a.res,0),a.squeeze.shape[2]===2?(a.softmax=A.softmax(a.squeeze),[a.bg,a.fg]=A.unstack(a.softmax,2),a.expand=A.expandDims(a.fg,2),a.pad=A.expandDims(a.expand,0),a.crop=A.image.cropAndResize(a.pad,[[0,0,.5,.5]],[0],[r,s]),a.data=A.squeeze(a.crop,0)):a.data=A.image.resizeBilinear(a.squeeze,[s,r]);let i=Array.from(await a.data.data());if(v.node&&!v.Canvas&&typeof ImageData=="undefined")return o.debug&&u("canvas support missing"),Object.keys(a).forEach(P=>A.dispose(a[P])),{data:i,canvas:null,alpha:null};let y=c0(r,s);A.browser&&await A.browser.toPixels(a.data,y);let x=y.getContext("2d");o.segmentation.blur&&o.segmentation.blur>0&&(x.filter=`blur(${o.segmentation.blur}px)`);let d=x.getImageData(0,0,r,s),l=c0(r,s),f=l.getContext("2d");n.canvas&&f.drawImage(n.canvas,0,0),f.globalCompositeOperation="darken",o.segmentation.blur&&o.segmentation.blur>0&&(f.filter=`blur(${o.segmentation.blur}px)`),f.drawImage(y,0,0),f.globalCompositeOperation="source-over",f.filter="none";let c=f.getImageData(0,0,r,s);for(let P=0;PA.dispose(a[P])),h1=!1,{data:i,canvas:l,alpha:y}}var a2=class{constructor(){w(this,"ssrnetage",null);w(this,"gear",null);w(this,"blazeposedetect",null);w(this,"blazepose",null);w(this,"centernet",null);w(this,"efficientpose",null);w(this,"mobilefacenet",null);w(this,"insightface",null);w(this,"emotion",null);w(this,"facedetect",null);w(this,"faceiris",null);w(this,"facemesh",null);w(this,"faceres",null);w(this,"ssrnetgender",null);w(this,"handpose",null);w(this,"handskeleton",null);w(this,"handtrack",null);w(this,"liveness",null);w(this,"movenet",null);w(this,"nanodet",null);w(this,"posenet",null);w(this,"segmentation",null);w(this,"antispoof",null)}},g1=e=>{let t=0,o=0,n=0;for(let s of Object.values(O0))t+=s.sizeFromManifest,o+=s.sizeLoadedWeights,n+=s.sizeDesired;let r=n>0?o/n:0;return{numLoadedModels:Object.values(O0).length,numEnabledModels:void 0,numDefinedModels:Object.keys(e.models).length,percentageLoaded:r,totalSizeFromManifest:t,totalSizeWeights:o,totalSizeLoading:n,totalSizeEnabled:void 0,modelStats:Object.values(O0)}};function W2(e){for(let t of Object.keys(e.models))e.models[t]=null}async function M1(e){var t,o,n,r,s,a,i,y,x,d,l,f,c,b,p,R,P,M,m,h,C,j,k,z,F,B,O,K,Z,S,e0,R0;v.initial&&W2(e),e.config.hand.enabled&&(!e.models.handpose&&((o=(t=e.config.hand.detector)==null?void 0:t.modelPath)==null?void 0:o.includes("handdetect"))&&([e.models.handpose,e.models.handskeleton]=await _5(e.config)),!e.models.handskeleton&&e.config.hand.landmarks&&((r=(n=e.config.hand.detector)==null?void 0:n.modelPath)==null?void 0:r.includes("handdetect"))&&([e.models.handpose,e.models.handskeleton]=await _5(e.config))),e.config.body.enabled&&!e.models.blazepose&&((a=(s=e.config.body)==null?void 0:s.modelPath)==null?void 0:a.includes("blazepose"))&&(e.models.blazepose=Nt(e.config)),e.config.body.enabled&&!e.models.blazeposedetect&&e.config.body.detector&&e.config.body.detector.modelPath&&(e.models.blazeposedetect=jt(e.config)),e.config.body.enabled&&!e.models.efficientpose&&((y=(i=e.config.body)==null?void 0:i.modelPath)==null?void 0:y.includes("efficientpose"))&&(e.models.efficientpose=Bt(e.config)),e.config.body.enabled&&!e.models.movenet&&((d=(x=e.config.body)==null?void 0:x.modelPath)==null?void 0:d.includes("movenet"))&&(e.models.movenet=to(e.config)),e.config.body.enabled&&!e.models.posenet&&((f=(l=e.config.body)==null?void 0:l.modelPath)==null?void 0:f.includes("posenet"))&&(e.models.posenet=co(e.config)),e.config.face.enabled&&!e.models.facedetect&&(e.models.facedetect=Tt(e.config)),e.config.face.enabled&&((c=e.config.face.antispoof)==null?void 0:c.enabled)&&!e.models.antispoof&&(e.models.antispoof=xt(e.config)),e.config.face.enabled&&((b=e.config.face.liveness)==null?void 0:b.enabled)&&!e.models.liveness&&(e.models.liveness=K3(e.config)),e.config.face.enabled&&((p=e.config.face.description)==null?void 0:p.enabled)&&!e.models.faceres&&(e.models.faceres=p3(e.config)),e.config.face.enabled&&((R=e.config.face.emotion)==null?void 0:R.enabled)&&!e.models.emotion&&(e.models.emotion=Zt(e.config)),e.config.face.enabled&&((P=e.config.face.iris)==null?void 0:P.enabled)&&!((M=e.config.face.attention)!=null&&M.enabled)&&!e.models.faceiris&&(e.models.faceiris=A3(e.config)),e.config.face.enabled&&((m=e.config.face.mesh)==null?void 0:m.enabled)&&!e.models.facemesh&&(e.models.facemesh=x3(e.config)),e.config.face.enabled&&((h=e.config.face.gear)==null?void 0:h.enabled)&&!e.models.gear&&(e.models.gear=_1(e.config)),e.config.face.enabled&&((C=e.config.face.ssrnet)==null?void 0:C.enabled)&&!e.models.ssrnetage&&(e.models.ssrnetage=nt(e.config)),e.config.face.enabled&&((j=e.config.face.ssrnet)==null?void 0:j.enabled)&&!e.models.ssrnetgender&&(e.models.ssrnetgender=at(e.config)),e.config.face.enabled&&((k=e.config.face.mobilefacenet)==null?void 0:k.enabled)&&!e.models.mobilefacenet&&(e.models.mobilefacenet=Kt(e.config)),e.config.face.enabled&&((z=e.config.face.insightface)==null?void 0:z.enabled)&&!e.models.insightface&&(e.models.insightface=e3(e.config)),e.config.hand.enabled&&!e.models.handtrack&&((B=(F=e.config.hand.detector)==null?void 0:F.modelPath)==null?void 0:B.includes("handtrack"))&&(e.models.handtrack=Z3(e.config)),e.config.hand.enabled&&e.config.hand.landmarks&&!e.models.handskeleton&&((K=(O=e.config.hand.detector)==null?void 0:O.modelPath)==null?void 0:K.includes("handtrack"))&&(e.models.handskeleton=X3(e.config)),e.config.object.enabled&&!e.models.centernet&&((S=(Z=e.config.object)==null?void 0:Z.modelPath)==null?void 0:S.includes("centernet"))&&(e.models.centernet=Wt(e.config)),e.config.object.enabled&&!e.models.nanodet&&((R0=(e0=e.config.object)==null?void 0:e0.modelPath)==null?void 0:R0.includes("nanodet"))&&(e.models.nanodet=ro(e.config)),e.config.segmentation.enabled&&!e.models.segmentation&&(e.models.segmentation=b1(e.config));for await(let T of Object.keys(e.models))e.models[T]&&typeof e.models[T]!="undefined"&&(e.models[T]=await e.models[T])}var v0;function Fe(e,t,o){if(e&&(v0=e),!t||(v0||u("instance not registred"),!v0.config.validateModels))return null;let n=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],r=["biasadd","fusedbatchnormv3","matmul"],s=[],a=[],i=t.modelUrl,y=t.executor;if(y&&y.graph.nodes)for(let x of Object.values(y.graph.nodes)){let d=x.op.toLowerCase();s.includes(d)||s.push(d)}else!y&&v0.config.debug&&u("model signature not determined:",o);for(let x of s)!n.includes(x)&&!r.includes(x)&&!v0.env.kernels.includes(x)&&!v0.env.kernels.includes(x.replace("_",""))&&!v0.env.kernels.includes(x.replace("native",""))&&!v0.env.kernels.includes(x.replace("v2",""))&&a.push(x);return v0.config.debug&&a.length>0&&u("model validation failed:",o,a),a.length>0?{name:o,missing:a,ops:s,url:i}:null}function J2(e){v0=e;let t=[];for(let o of Object.keys(v0.models)){let n=v0.models[o];if(!n)continue;let r=Fe(v0,n,o);r&&t.push(r)}return t}var m0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},O0={};async function xA(e,t){return m0.debug&&u("load model fetch:",e,t),fetch(e,t)}function uo(e){m0.cacheModels=e.cacheModels,m0.verbose=e.debug,m0.modelBasePath=e.modelBasePath}async function N(e){var x,d,l;let t=B1(m0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let o=t.includes("/")?t.split("/"):t.split("\\"),n=o[o.length-1].replace(".json",""),r="indexeddb://"+n;O0[n]={name:n,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:s5[n],inCache:!1},m0.cacheSupported=typeof window!="undefined"&&typeof window.localStorage!="undefined"&&typeof window.indexedDB!="undefined";let s={};try{s=m0.cacheSupported&&m0.cacheModels?await A.io.listModels():{}}catch(f){m0.cacheSupported=!1}O0[n].inCache=m0.cacheSupported&&m0.cacheModels&&Object.keys(s).includes(r);let a=typeof fetch=="undefined"?{}:{fetchFunc:(f,c)=>xA(f,c)},i=new o5(O0[n].inCache?r:t,a),y=!1;try{i.findIOHandler(),m0.debug&&u("model load handler:",i.handler);let f=await i.handler.load();O0[n].sizeFromManifest=((x=f==null?void 0:f.weightData)==null?void 0:x.byteLength)||0,i.loadSync(f),O0[n].sizeLoadedWeights=((l=(d=i==null?void 0:i.artifacts)==null?void 0:d.weightData)==null?void 0:l.byteLength)||0,m0.verbose&&u("load model:",i.modelUrl,{bytes:O0[n].sizeLoadedWeights},m0),y=!0}catch(f){u("error loading model:",t,f)}if(y&&m0.cacheModels&&m0.cacheSupported&&!O0[n].inCache)try{let f=await i.save(r);u("model saved:",r,f)}catch(f){u("error saving model:",t,f)}return Fe(null,i,`${e}`),i}var P1="2.9.3";var bo={};K0(bo,{all:()=>E1,body:()=>Be,canvas:()=>k1,face:()=>Ge,gesture:()=>De,hand:()=>He,object:()=>Ve,options:()=>y0,person:()=>w1});var w0=e=>{if(!e)u("draw error: invalid canvas");else if(!e.getContext)u("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)u("draw error: cannot get canvas context");else return t}return null},ge=e=>Math.round(e*180/Math.PI),U0=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let o=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${o[0]}, ${o[1]}, ${o[2]}, ${t.alpha})`};function Y0(e,t,o,n,r){e.fillStyle=U0(n,r),e.beginPath(),e.arc(t,o,r.pointSize,0,2*Math.PI),e.fill()}function G0(e,t,o,n,r,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let a=(t+t+n)/2,i=(o+o+r)/2;e.ellipse(a,i,n/2,r/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,o),e.lineTo(t+n-s.roundRect,o),e.quadraticCurveTo(t+n,o,t+n,o+s.roundRect),e.lineTo(t+n,o+r-s.roundRect),e.quadraticCurveTo(t+n,o+r,t+n-s.roundRect,o+r),e.lineTo(t+s.roundRect,o+r),e.quadraticCurveTo(t,o+r,t,o+r-s.roundRect),e.lineTo(t,o+s.roundRect),e.quadraticCurveTo(t,o,t+s.roundRect,o),e.closePath();e.stroke()}function R1(e,t,o){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let n of t)e.strokeStyle=U0(n[2]||0,o),e.lineTo(Math.trunc(n[0]),Math.trunc(n[1]));e.stroke(),o.fillPolygons&&(e.closePath(),e.fill())}}function ho(e,t,o){if(!(t.length<2)){if(e.lineWidth=o.lineWidth,!o.useCurves||t.length<=2){R1(e,t,o);return}e.moveTo(t[0][0],t[0][1]);for(let n=0;n0){let n=e.emotion.map(r=>`${Math.trunc(100*r.score)}% ${r.emotion}`);n.length>3&&(n.length=3),o.push(n.join(" "))}e.rotation&&e.rotation.angle&&e.rotation.gaze&&(e.rotation.angle.roll&&o.push(`roll: ${ge(e.rotation.angle.roll)}\xB0 yaw:${ge(e.rotation.angle.yaw)}\xB0 pitch:${ge(e.rotation.angle.pitch)}\xB0`),e.rotation.gaze.bearing&&o.push(`gaze: ${ge(e.rotation.gaze.bearing)}\xB0`)),o.length===0&&o.push("face"),t.fillStyle=D.color;for(let n=o.length-1;n>=0;n--){let r=Math.max(e.box[0],0),s=n*D.lineHeight+e.box[1];D.shadowColor&&D.shadowColor!==""&&(t.fillStyle=D.shadowColor,t.fillText(o[n],r+5,s+16)),t.fillStyle=D.labelColor,t.fillText(o[n],r+4,s+15)}}}function mA(e,t){if(e.annotations&&e.annotations.leftEyeIris&&e.annotations.leftEyeIris[0]){t.strokeStyle=D.useDepth?"rgba(255, 200, 255, 0.3)":D.color,t.beginPath();let o=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,n=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],o,n,0,0,2*Math.PI),t.stroke(),D.fillPolygons&&(t.fillStyle=D.useDepth?"rgba(255, 255, 200, 0.3)":D.color,t.fill())}if(e.annotations&&e.annotations.rightEyeIris&&e.annotations.rightEyeIris[0]){t.strokeStyle=D.useDepth?"rgba(255, 200, 255, 0.3)":D.color,t.beginPath();let o=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,n=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],o,n,0,0,2*Math.PI),t.stroke(),D.fillPolygons&&(t.fillStyle=D.useDepth?"rgba(255, 255, 200, 0.3)":D.color,t.fill())}}function pA(e,t){var o;if(D.drawGaze&&((o=e.rotation)==null?void 0:o.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let n=e.box[0]+e.box[2]/2-e.box[3]*ge(e.rotation.angle.yaw)/90,r=e.box[1]+e.box[3]/2+e.box[2]*ge(e.rotation.angle.pitch)/90,s=new Path2D(` + M ${e.box[0]+e.box[2]/2} ${e.box[1]} C - ${valX} ${f.box[1]}, - ${valX} ${f.box[1] + f.box[3]}, - ${f.box[0] + f.box[2] / 2} ${f.box[1] + f.box[3]} - `); - const pathH = new Path2D(` - M ${f.box[0]} ${f.box[1] + f.box[3] / 2} + ${n} ${e.box[1]}, + ${n} ${e.box[1]+e.box[3]}, + ${e.box[0]+e.box[2]/2} ${e.box[1]+e.box[3]} + `),a=new Path2D(` + M ${e.box[0]} ${e.box[1]+e.box[3]/2} C - ${f.box[0]} ${valY}, - ${f.box[0] + f.box[2]} ${valY}, - ${f.box[0] + f.box[2]} ${f.box[1] + f.box[3] / 2} - `); - ctx.stroke(pathH); - ctx.stroke(pathV); - } -} -function drawGazeArrows(f, ctx) { - var _a, _b, _c, _d; - if (opt.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) && f.annotations["leftEyeIris"] && f.annotations["rightEyeIris"] && f.annotations["leftEyeIris"][0] && f.annotations["rightEyeIris"][0]) { - ctx.strokeStyle = "pink"; - ctx.fillStyle = "pink"; - 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] - ]; - arrow(ctx, [f.annotations["leftEyeIris"][0][0], f.annotations["leftEyeIris"][0][1]], [leftGaze[0], leftGaze[1]], 4); - 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] - ]; - arrow(ctx, [f.annotations["rightEyeIris"][0][0], f.annotations["rightEyeIris"][0][1]], [rightGaze[0], rightGaze[1]], 4); - } -} -function drawFacePolygons(f, ctx) { - if (opt.drawPolygons && f.mesh.length >= 468) { - 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((index2) => f.mesh[index2]); - lines(ctx, points, opt); - } - drawIrisElipse(f, ctx); - } -} -function drawFacePoints(f, ctx) { - if (opt.drawPoints && f.mesh.length >= 468) { - for (let i = 0; i < f.mesh.length; i++) { - point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2], opt); - if (opt.drawAttention) { - if (LANDMARKS_REFINEMENT_LIPS_CONFIG.includes(i)) - point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] + 127, opt); - if (LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.includes(i)) - point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] - 127, opt); - if (LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.includes(i)) - point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] - 127, opt); - } - } - } -} -function drawFaceBoxes(f, ctx) { - if (opt.drawBoxes) { - rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], opt); - } -} -async function face(inCanvas2, result, drawOptions) { - opt = mergeDeep(options3, drawOptions); - if (!result || !inCanvas2) - return; - const ctx = getCanvasContext(inCanvas2); - if (!ctx) - return; - ctx.font = opt.font; - ctx.strokeStyle = opt.color; - ctx.fillStyle = opt.color; - for (const f of result) { - drawFaceBoxes(f, ctx); - drawLabels(f, ctx); - if (f.mesh && f.mesh.length > 0) { - drawFacePoints(f, ctx); - drawFacePolygons(f, ctx); - drawGazeSpheres(f, ctx); - drawGazeArrows(f, ctx); - } - } -} - -// src/draw/body.ts -async function body(inCanvas2, result, drawOptions) { - var _a; - const localOptions = mergeDeep(options3, drawOptions); - if (!result || !inCanvas2) - return; - const ctx = getCanvasContext(inCanvas2); - 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 && result[i].keypoints) { - for (let pt = 0; pt < result[i].keypoints.length; pt++) { - if (!result[i].keypoints[pt].score || result[i].keypoints[pt].score === 0) - continue; - ctx.fillStyle = colorDepth(result[i].keypoints[pt].position[2], localOptions); - point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); - } - } - if (localOptions.drawLabels && result[i].keypoints) { - ctx.font = localOptions.font; - for (const pt of result[i].keypoints) { - if (!pt.score || pt.score === 0) - continue; - ctx.fillStyle = colorDepth(pt.position[2], localOptions); - ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4); - } - } - if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) { - for (const part of Object.values(result[i].annotations)) { - for (const connected4 of part) - curves(ctx, connected4, localOptions); - } - } - } -} - -// src/draw/hand.ts -async function hand(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options3, drawOptions); - if (!result || !inCanvas2) - return; - const ctx = getCanvasContext(inCanvas2); - 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:${Math.trunc(100 * h.score)}%`, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); - } - ctx.fillStyle = localOptions.labelColor; - ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, 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 = colorDepth(pt[2], localOptions); - point(ctx, pt[0], pt[1], 0, localOptions); - } - } - } - if (localOptions.drawLabels && h.annotations) { - const addHandLabel = (part, title) => { - if (!part || part.length === 0 || !part[0]) - return; - const z = part[part.length - 1][2] || -256; - ctx.fillStyle = colorDepth(z, localOptions); - ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4); - }; - ctx.font = localOptions.font; - addHandLabel(h.annotations["index"], "index"); - addHandLabel(h.annotations["middle"], "middle"); - addHandLabel(h.annotations["ring"], "ring"); - addHandLabel(h.annotations["pinky"], "pinky"); - addHandLabel(h.annotations["thumb"], "thumb"); - addHandLabel(h.annotations["palm"], "palm"); - } - if (localOptions.drawPolygons && h.annotations) { - const addHandLine = (part) => { - if (!part || part.length === 0 || !part[0]) - return; - for (let i = 0; i < part.length; i++) { - ctx.beginPath(); - const z = part[i][2] || 0; - ctx.strokeStyle = colorDepth(i * z, localOptions); - 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["index"]); - addHandLine(h.annotations["middle"]); - addHandLine(h.annotations["ring"]); - addHandLine(h.annotations["pinky"]); - addHandLine(h.annotations["thumb"]); - } - } -} - -// src/draw/object.ts -async function object(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options3, drawOptions); - if (!result || !inCanvas2) - return; - const ctx = getCanvasContext(inCanvas2); - 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 = `${h.label} ${Math.round(100 * h.score)}%`; - 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(); - } - } -} - -// src/draw/gesture.ts -async function gesture(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options3, drawOptions); - if (!result || !inCanvas2) - return; - if (localOptions.drawGestures) { - const ctx = getCanvasContext(inCanvas2); - 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; - } - } - } -} - -// src/draw/draw.ts -var drawTime = 0; -async function person(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options3, drawOptions); - if (!result || !inCanvas2) - return; - const ctx = getCanvasContext(inCanvas2); - 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 canvas2(input, output) { - if (!input || !output) - return; - const ctx = getCanvasContext(output); - if (!ctx) - return; - ctx.drawImage(input, 0, 0); -} -async function all(inCanvas2, result, drawOptions) { - if (!result || !result.performance || !result || !inCanvas2) - return null; - const timeStamp = now(); - const localOptions = mergeDeep(options3, drawOptions); - const promise = Promise.all([ - face(inCanvas2, result.face, localOptions), - body(inCanvas2, result.body, localOptions), - hand(inCanvas2, result.hand, localOptions), - object(inCanvas2, result.object, localOptions), - gesture(inCanvas2, result.gesture, localOptions) - ]); - drawTime = env.perfadd ? drawTime + Math.round(now() - timeStamp) : Math.round(now() - timeStamp); - result.performance.draw = drawTime; - return promise; -} - -// src/face/mask.ts -var expandFact = 0.1; -var alpha = 0.5; -function insidePoly(x, y, polygon) { - let inside = false; - let j = polygon.length - 1; - for (let i = 0; i < polygon.length; j = i++) { - if (polygon[i].y > y !== polygon[j].y > y && x < (polygon[j].x - polygon[i].x) * (y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x) - inside = !inside; - } - return inside; -} -async function mask(face4) { - if (!face4.tensor) - return face4.tensor; - if (!face4.mesh || face4.mesh.length < 100) - return face4.tensor; - const width = face4.tensor.shape[2] || 0; - const height = face4.tensor.shape[1] || 0; - const buffer = await face4.tensor.buffer(); - let silhouette = []; - for (const pt of meshAnnotations.silhouette) - silhouette.push({ x: (face4.mesh[pt][0] - face4.box[0]) / face4.box[2], y: (face4.mesh[pt][1] - face4.box[1]) / face4.box[3] }); - if (expandFact && expandFact > 0) - silhouette = silhouette.map((pt) => ({ x: pt.x > 0.5 ? pt.x + expandFact : pt.x - expandFact, y: pt.y > 0.5 ? pt.y + expandFact : pt.y - expandFact })); - for (let x = 0; x < width; x++) { - for (let y = 0; y < height; y++) { - const inside = insidePoly(x / width, y / width, silhouette); - if (!inside) { - buffer.set(alpha * buffer.get(0, y, x, 0), 0, y, x, 0); - buffer.set(alpha * buffer.get(0, y, x, 1), 0, y, x, 1); - buffer.set(alpha * buffer.get(0, y, x, 2), 0, y, x, 2); - } - } - } - const output = buffer.toTensor(); - tfjs_esm_exports.dispose(buffer); - return output; -} - -// src/face/angles.ts -var calculateGaze = (face4) => { - const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); - if (!face4.annotations["rightEyeIris"] || !face4.annotations["leftEyeIris"]) - return { bearing: 0, strength: 0 }; - const offsetIris = [0, -0.1]; - const eyeRatio = 1; - const left = (face4.mesh[33][2] || 0) > (face4.mesh[263][2] || 0); - const irisCenter = left ? face4.mesh[473] : face4.mesh[468]; - const eyeCenter = left ? [(face4.mesh[133][0] + face4.mesh[33][0]) / 2, (face4.mesh[133][1] + face4.mesh[33][1]) / 2] : [(face4.mesh[263][0] + face4.mesh[362][0]) / 2, (face4.mesh[263][1] + face4.mesh[362][1]) / 2]; - const eyeSize = left ? [face4.mesh[133][0] - face4.mesh[33][0], face4.mesh[23][1] - face4.mesh[27][1]] : [face4.mesh[263][0] - face4.mesh[362][0], face4.mesh[253][1] - face4.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] * eyeDiff[0] + eyeDiff[1] * eyeDiff[1]); - strength = Math.min(strength, face4.boxRaw[2] / 2, face4.boxRaw[3] / 2); - const bearing = (radians([0, 0], eyeDiff) + Math.PI / 2) % Math.PI; - return { bearing, strength }; -}; -var calculateFaceAngle = (face4, 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; - } - if (isNaN(thetaX)) - thetaX = 0; - if (isNaN(thetaY)) - thetaY = 0; - if (isNaN(thetaZ)) - thetaZ = 0; - return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ }; - }; - const mesh = face4.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 size2 = Math.max(face4.boxRaw[2] * imageSize[0], face4.boxRaw[3] * imageSize[1]) / 1.5; - const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [pt[0] * imageSize[0] / size2, pt[1] * imageSize[1] / size2, 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(face4) : { bearing: 0, strength: 0 }; - return { angle, matrix, gaze }; -}; - -// src/face/face.ts -var detectFace = async (instance2, input) => { - var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w; - let timeStamp = now(); - let ageRes; - let gearRes; - let genderRes; - let emotionRes; - let mobilefacenetRes; - let insightfaceRes; - let antispoofRes; - let livenessRes; - let descRes; - const faceRes = []; - instance2.state = "run:face"; - const faces = await predict11(input, instance2.config); - instance2.performance.face = env.perfadd ? (instance2.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - if (!input.shape || input.shape.length !== 4) - return []; - if (!faces) - return []; - for (let i = 0; i < faces.length; i++) { - instance2.analyze("Get Face"); - if (!faces[i].tensor || faces[i].tensor["isDisposedInternal"]) { - log("Face object is disposed:", faces[i].tensor); - continue; - } - if ((_a = instance2.config.face.detector) == null ? void 0 : _a.mask) { - const masked = await mask(faces[i]); - tfjs_esm_exports.dispose(faces[i].tensor); - faces[i].tensor = masked; - } - const rotation = faces[i].mesh && faces[i].mesh.length > 200 ? calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]) : null; - instance2.analyze("Start Emotion:"); - if (instance2.config.async) { - emotionRes = ((_b = instance2.config.face.emotion) == null ? void 0 : _b.enabled) ? predict8(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : []; - } else { - instance2.state = "run:emotion"; - timeStamp = now(); - emotionRes = ((_c = instance2.config.face.emotion) == null ? void 0 : _c.enabled) ? await predict8(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : []; - instance2.performance.emotion = env.perfadd ? (instance2.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - } - instance2.analyze("End Emotion:"); - instance2.analyze("Start AntiSpoof:"); - if (instance2.config.async) { - antispoofRes = ((_d = instance2.config.face.antispoof) == null ? void 0 : _d.enabled) ? predict4(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : 0; - } else { - instance2.state = "run:antispoof"; - timeStamp = now(); - antispoofRes = ((_e = instance2.config.face.antispoof) == null ? void 0 : _e.enabled) ? await predict4(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : 0; - instance2.performance.antispoof = env.perfadd ? (instance2.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - } - instance2.analyze("End AntiSpoof:"); - instance2.analyze("Start Liveness:"); - if (instance2.config.async) { - livenessRes = ((_f = instance2.config.face.liveness) == null ? void 0 : _f.enabled) ? predict15(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : 0; - } else { - instance2.state = "run:liveness"; - timeStamp = now(); - livenessRes = ((_g = instance2.config.face.liveness) == null ? void 0 : _g.enabled) ? await predict15(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : 0; - instance2.performance.liveness = env.perfadd ? (instance2.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - } - instance2.analyze("End Liveness:"); - instance2.analyze("Start GEAR:"); - if (instance2.config.async) { - gearRes = ((_h = instance2.config.face["gear"]) == null ? void 0 : _h.enabled) ? predict(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - } else { - instance2.state = "run:gear"; - timeStamp = now(); - gearRes = ((_i = instance2.config.face["gear"]) == null ? void 0 : _i.enabled) ? await predict(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - instance2.performance.gear = Math.trunc(now() - timeStamp); - } - instance2.analyze("End GEAR:"); - instance2.analyze("Start SSRNet:"); - if (instance2.config.async) { - ageRes = ((_j = instance2.config.face["ssrnet"]) == null ? void 0 : _j.enabled) ? predict2(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - genderRes = ((_k = instance2.config.face["ssrnet"]) == null ? void 0 : _k.enabled) ? predict3(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - } else { - instance2.state = "run:ssrnet"; - timeStamp = now(); - ageRes = ((_l = instance2.config.face["ssrnet"]) == null ? void 0 : _l.enabled) ? await predict2(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - genderRes = ((_m = instance2.config.face["ssrnet"]) == null ? void 0 : _m.enabled) ? await predict3(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - instance2.performance.ssrnet = Math.trunc(now() - timeStamp); - } - instance2.analyze("End SSRNet:"); - instance2.analyze("Start MobileFaceNet:"); - if (instance2.config.async) { - mobilefacenetRes = ((_n = instance2.config.face["mobilefacenet"]) == null ? void 0 : _n.enabled) ? predict9(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - } else { - instance2.state = "run:mobilefacenet"; - timeStamp = now(); - mobilefacenetRes = ((_o = instance2.config.face["mobilefacenet"]) == null ? void 0 : _o.enabled) ? await predict9(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - instance2.performance.mobilefacenet = Math.trunc(now() - timeStamp); - } - instance2.analyze("End MobileFaceNet:"); - instance2.analyze("Start InsightFace:"); - if (instance2.config.async) { - insightfaceRes = ((_p = instance2.config.face["insightface"]) == null ? void 0 : _p.enabled) ? predict10(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - } else { - instance2.state = "run:mobilefacenet"; - timeStamp = now(); - insightfaceRes = ((_q = instance2.config.face["insightface"]) == null ? void 0 : _q.enabled) ? await predict10(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length) : null; - instance2.performance.mobilefacenet = Math.trunc(now() - timeStamp); - } - instance2.analyze("End InsightFace:"); - instance2.analyze("Start Description:"); - if (instance2.config.async) { - descRes = predict12(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length); - } else { - instance2.state = "run:description"; - timeStamp = now(); - descRes = await predict12(faces[i].tensor || tfjs_esm_exports.tensor([]), instance2.config, i, faces.length); - instance2.performance.description = env.perfadd ? (instance2.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - } - instance2.analyze("End Description:"); - if (instance2.config.async) { - [ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes]); - } - instance2.analyze("Finish Face:"); - if (((_r = instance2.config.face["ssrnet"]) == null ? void 0 : _r.enabled) && ageRes && genderRes) { - descRes = { - ...descRes, - age: ageRes.age, - gender: genderRes.gender, - genderScore: genderRes.genderScore - }; - } - if (((_s = instance2.config.face["gear"]) == null ? void 0 : _s.enabled) && gearRes) { - descRes = { - ...descRes, - age: gearRes.age, - gender: gearRes.gender, - genderScore: gearRes.genderScore, - race: gearRes.race - }; - } - if (((_t = instance2.config.face["mobilefacenet"]) == null ? void 0 : _t.enabled) && mobilefacenetRes) { - descRes.descriptor = mobilefacenetRes; - } - if (((_u = instance2.config.face["insightface"]) == null ? void 0 : _u.enabled) && insightfaceRes) { - descRes.descriptor = insightfaceRes; - } - if (!((_v = instance2.config.face.iris) == null ? void 0 : _v.enabled)) { - } - const irisSize = faces[i].annotations && faces[i].annotations.leftEyeIris && faces[i].annotations.leftEyeIris[0] && faces[i].annotations.rightEyeIris && faces[i].annotations.rightEyeIris[0] && faces[i].annotations.leftEyeIris.length > 0 && faces[i].annotations.rightEyeIris.length > 0 && faces[i].annotations.leftEyeIris[0] !== null && faces[i].annotations.rightEyeIris[0] !== null ? 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; - const tensor3 = ((_w = instance2.config.face.detector) == null ? void 0 : _w.return) ? tfjs_esm_exports.squeeze(faces[i].tensor) : null; - tfjs_esm_exports.dispose(faces[i].tensor); - if (faces[i].tensor) - delete faces[i].tensor; - const res = { - ...faces[i], - id: i - }; - if (descRes == null ? void 0 : descRes.age) - res.age = descRes.age; - if (descRes == null ? void 0 : descRes.gender) - res.gender = descRes.gender; - if (descRes == null ? void 0 : descRes.genderScore) - res.genderScore = descRes == null ? void 0 : descRes.genderScore; - if (descRes == null ? void 0 : descRes.descriptor) - res.embedding = descRes == null ? void 0 : descRes.descriptor; - if (descRes == null ? void 0 : descRes.race) - res.race = descRes == null ? void 0 : descRes.race; - if (emotionRes) - res.emotion = emotionRes; - if (antispoofRes) - res.real = antispoofRes; - if (livenessRes) - res.live = livenessRes; - if (irisSize && irisSize !== 0) - res.iris = Math.trunc(500 / irisSize / 11.7) / 100; - if (rotation) - res.rotation = rotation; - if (tensor3) - res.tensor = tensor3; - faceRes.push(res); - instance2.analyze("End Face"); - } - instance2.analyze("End FaceMesh:"); - if (instance2.config.async) { - if (instance2.performance.face) - delete instance2.performance.face; - if (instance2.performance.age) - delete instance2.performance.age; - if (instance2.performance.gender) - delete instance2.performance.gender; - if (instance2.performance.emotion) - delete instance2.performance.emotion; - } - return faceRes; -}; - -// src/gesture/gesture.ts -var body2 = (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[1] < nose.position[1] && rightWrist.position[1] < nose.position[1]) - gestures.push({ body: i, gesture: "i give up" }); - else if (nose && leftWrist && leftWrist.position[1] < nose.position[1]) - gestures.push({ body: i, gesture: "raise left hand" }); - else if (nose && rightWrist && rightWrist.position[1] < nose.position[1]) - 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 && Math.abs(leftShoulder.positionRaw[1] - rightShoulder.positionRaw[1]) > 0.1) { - gestures.push({ body: i, gesture: `leaning ${leftShoulder.position[1] > rightShoulder.position[1] ? "left" : "right"}` }); - } - } - return gestures; -}; -var face2 = (res) => { - if (!res) - return []; - const gestures = []; - for (let i = 0; i < res.length; i++) { - if (res[i].mesh && res[i].mesh.length > 450) { - const zDiff = (res[i].mesh[33][2] || 0) - (res[i].mesh[263][2] || 0); - const xDiff = res[i].mesh[33][0] - res[i].mesh[263][0]; - if (Math.abs(zDiff / xDiff) <= 0.15) - gestures.push({ face: i, gesture: "facing center" }); - else - gestures.push({ face: i, gesture: `facing ${zDiff < 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] || 0; - if (Math.abs(chinDepth) > 10) - gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? "up" : "down"}` }); - } - } - return gestures; -}; -var iris2 = (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.leftEyeIris[0] || !res[i].annotations.rightEyeIris || !res[i].annotations.rightEyeIris[0]) - 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 leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2]; - const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2]; - if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) - center = false; - if (leftIrisCenterX > rightIrisCenterX) { - if (leftIrisCenterX > 0.05) - gestures.push({ iris: i, gesture: "looking right" }); - } else { - if (rightIrisCenterX > 0.05) - 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 hand2 = (res) => { - if (!res) - return []; - const gestures = []; - for (let i = 0; i < res.length; i++) { - const fingers = []; - if (res[i]["annotations"]) { - for (const [finger, pos] of Object.entries(res[i]["annotations"])) { - if (finger !== "palmBase" && Array.isArray(pos) && pos[0]) - fingers.push({ name: finger.toLowerCase(), position: pos[0] }); - } - } - if (fingers && fingers.length > 0) { - const closest = fingers.reduce((best, a) => (best.position[2] || 0) < (a.position[2] || 0) ? best : a); - gestures.push({ hand: i, gesture: `${closest.name} forward` }); - const highest = fingers.reduce((best, a) => best.position[1] < a.position[1] ? best : a); - gestures.push({ hand: i, gesture: `${highest.name} up` }); - } - if (res[i]["keypoints"]) { - const poses = match(res[i]["keypoints"]); - for (const pose of poses) - gestures.push({ hand: i, gesture: pose.name }); - } - } - return gestures; -}; - -// src/util/interpolate.ts -var bufferedResult = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null }; -var interpolateTime = 0; -function calc2(newResult, config3) { - var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A; - const t0 = now(); - if (!newResult) - return { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null }; - const elapsed = Date.now() - newResult.timestamp; - const bufferedFactor = elapsed < 1e3 ? 8 - Math.log(elapsed + 1) : 1; - if (newResult.canvas) - bufferedResult.canvas = newResult.canvas; - if (newResult.error) - bufferedResult.error = newResult.error; - 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 box = newResult.body[i].box.map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + newBoxCoord) / bufferedFactor); - const boxRaw = newResult.body[i].boxRaw.map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + newBoxCoord) / bufferedFactor); - const keypoints = newResult.body[i].keypoints.map((newKpt, j) => { - var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2; - return { - score: newKpt.score, - part: newKpt.part, - position: [ - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2] - ], - positionRaw: [ - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2] - ], - distance: [ - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_a2 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _a2[0]) || 0) + (((_b2 = newKpt.distance) == null ? void 0 : _b2[0]) || 0)) / bufferedFactor : (_c2 = newKpt.distance) == null ? void 0 : _c2[0], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_d2 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _d2[1]) || 0) + (((_e2 = newKpt.distance) == null ? void 0 : _e2[1]) || 0)) / bufferedFactor : (_f2 = newKpt.distance) == null ? void 0 : _f2[1], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_g2 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _g2[2]) || 0) + (((_h2 = newKpt.distance) == null ? void 0 : _h2[2]) || 0)) / bufferedFactor : (_i2 = newKpt.distance) == null ? void 0 : _i2[2] - ] - }; - }); - const annotations2 = {}; - let coords = { connected: {} }; - if ((_b = (_a = config3.body) == null ? void 0 : _a.modelPath) == null ? void 0 : _b.includes("efficientpose")) - coords = efficientposecoords_exports; - else if ((_d = (_c = config3.body) == null ? void 0 : _c.modelPath) == null ? void 0 : _d.includes("blazepose")) - coords = blazeposecoords_exports; - else if ((_f = (_e = config3.body) == null ? void 0 : _e.modelPath) == null ? void 0 : _f.includes("movenet")) - coords = movenetcoords_exports; - for (const [name, indexes] of Object.entries(coords.connected)) { - const pt = []; - for (let j = 0; j < indexes.length - 1; j++) { - const pt0 = keypoints.find((kp) => kp.part === indexes[j]); - const pt1 = keypoints.find((kp) => kp.part === indexes[j + 1]); - if (pt0 && pt1) - pt.push([pt0.position, pt1.position]); - } - annotations2[name] = pt; - } - bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints, annotations: annotations2 }; - } - } - 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 box = newResult.hand[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor); - const boxRaw = newResult.hand[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor); - if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) - bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; - const keypoints = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : []; - let annotations2 = {}; - if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) { - bufferedResult.hand[i].annotations = newResult.hand[i].annotations; - annotations2 = bufferedResult.hand[i].annotations; - } else if (newResult.hand[i].annotations) { - for (const key of Object.keys(newResult.hand[i].annotations)) { - annotations2[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null; - } - } - bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations2 }; - } - } - 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 box = newResult.face[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor); - const boxRaw = newResult.face[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor); - if (newResult.face[i].rotation) { - 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 = (_g = newResult.face[i].rotation) == null ? void 0 : _g.matrix; - rotation.angle = { - roll: ((bufferedFactor - 1) * (((_i = (_h = bufferedResult.face[i].rotation) == null ? void 0 : _h.angle) == null ? void 0 : _i.roll) || 0) + (((_k = (_j = newResult.face[i].rotation) == null ? void 0 : _j.angle) == null ? void 0 : _k.roll) || 0)) / bufferedFactor, - yaw: ((bufferedFactor - 1) * (((_m = (_l = bufferedResult.face[i].rotation) == null ? void 0 : _l.angle) == null ? void 0 : _m.yaw) || 0) + (((_o = (_n = newResult.face[i].rotation) == null ? void 0 : _n.angle) == null ? void 0 : _o.yaw) || 0)) / bufferedFactor, - pitch: ((bufferedFactor - 1) * (((_q = (_p = bufferedResult.face[i].rotation) == null ? void 0 : _p.angle) == null ? void 0 : _q.pitch) || 0) + (((_s = (_r = newResult.face[i].rotation) == null ? void 0 : _r.angle) == null ? void 0 : _s.pitch) || 0)) / bufferedFactor - }; - rotation.gaze = { - bearing: ((bufferedFactor - 1) * (((_u = (_t = bufferedResult.face[i].rotation) == null ? void 0 : _t.gaze) == null ? void 0 : _u.bearing) || 0) + (((_w = (_v = newResult.face[i].rotation) == null ? void 0 : _v.gaze) == null ? void 0 : _w.bearing) || 0)) / bufferedFactor, - strength: ((bufferedFactor - 1) * (((_y = (_x = bufferedResult.face[i].rotation) == null ? void 0 : _x.gaze) == null ? void 0 : _y.strength) || 0) + (((_A = (_z = newResult.face[i].rotation) == null ? void 0 : _z.gaze) == null ? void 0 : _A.strength) || 0)) / bufferedFactor - }; - bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; - } - bufferedResult.face[i] = { ...newResult.face[i], box, boxRaw }; - } - } - 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 box = newResult.object[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor); - const boxRaw = newResult.object[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor); - bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; - } - } - if (newResult.persons) { - 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((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor); - } - } - } - if (newResult.gesture) - bufferedResult.gesture = newResult.gesture; - const t1 = now(); - interpolateTime = env.perfadd ? interpolateTime + Math.round(t1 - t0) : Math.round(t1 - t0); - if (newResult.performance) - bufferedResult.performance = { ...newResult.performance, interpolate: interpolateTime }; - return bufferedResult; -} - -// src/face/match.ts -var match_exports = {}; -__export(match_exports, { - distance: () => distance, - match: () => match2, - similarity: () => similarity -}); -function distance(descriptor1, descriptor2, options4 = { order: 2, multiplier: 25 }) { - if (!descriptor1 || !descriptor1) - return Number.MAX_SAFE_INTEGER; - let sum3 = 0; - for (let i = 0; i < descriptor1.length; i++) { - const diff = !options4.order || options4.order === 2 ? descriptor1[i] - descriptor2[i] : Math.abs(descriptor1[i] - descriptor2[i]); - sum3 += !options4.order || options4.order === 2 ? diff * diff : diff ** options4.order; - } - return (options4.multiplier || 20) * sum3; -} -var normalizeDistance = (dist, order, min2, max4) => { - if (dist === 0) - return 1; - const root = order === 2 ? Math.sqrt(dist) : dist ** (1 / order); - const norm = (1 - root / 100 - min2) / (max4 - min2); - const clamp2 = Math.max(Math.min(norm, 1), 0); - return clamp2; -}; -function similarity(descriptor1, descriptor2, options4 = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }) { - const dist = distance(descriptor1, descriptor2, options4); - return normalizeDistance(dist, options4.order || 2, options4.min || 0, options4.max || 1); -} -function match2(descriptor, descriptors, options4 = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) { - if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0) { - return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 }; - } - let lowestDistance = Number.MAX_SAFE_INTEGER; - let index2 = -1; - for (let i = 0; i < descriptors.length; i++) { - const res = descriptors[i].length === descriptor.length ? distance(descriptor, descriptors[i], options4) : Number.MAX_SAFE_INTEGER; - if (res < lowestDistance) { - lowestDistance = res; - index2 = i; - } - if (lowestDistance < (options4.threshold || 0)) - break; - } - const normalizedSimilarity = normalizeDistance(lowestDistance, options4.order || 2, options4.min || 0, options4.max || 1); - return { index: index2, distance: lowestDistance, similarity: normalizedSimilarity }; -} - -// src/util/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 persons = []; - for (const face4 of faces) { - const person2 = { id: id++, face: face4, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] }; - for (const body4 of bodies) { - if (face4.box[0] > body4.box[0] && face4.box[0] < body4.box[0] + body4.box[2] && face4.box[1] + face4.box[3] > body4.box[1] && face4.box[1] + face4.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 gesture2 of gestures) { - if (gesture2["face"] !== void 0 && gesture2["face"] === face4.id) - (_a = person2.gestures) == null ? void 0 : _a.push(gesture2); - else if (gesture2["iris"] !== void 0 && gesture2["iris"] === face4.id) - (_b = person2.gestures) == null ? void 0 : _b.push(gesture2); - else if (gesture2["body"] !== void 0 && gesture2["body"] === ((_c = person2.body) == null ? void 0 : _c.id)) - (_d = person2.gestures) == null ? void 0 : _d.push(gesture2); - else if (gesture2["hand"] !== void 0 && gesture2["hand"] === ((_f = (_e = person2.hands) == null ? void 0 : _e.left) == null ? void 0 : _f.id)) - (_g = person2.gestures) == null ? void 0 : _g.push(gesture2); - else if (gesture2["hand"] !== void 0 && gesture2["hand"] === ((_i = (_h = person2.hands) == null ? void 0 : _h.right) == null ? void 0 : _i.id)) - (_j = person2.gestures) == null ? void 0 : _j.push(gesture2); - } - const x = []; - const y = []; - const extractXY = (box) => { - if (box && box.length === 4) { - x.push(box[0], box[0] + box[2]); - y.push(box[1], box[1] + box[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[1] && shape[2]) - person2.boxRaw = [person2.box[0] / shape[2], person2.box[1] / shape[1], person2.box[2] / shape[2], person2.box[3] / shape[1]]; - persons.push(person2); - } - return persons; -} - -// src/sample.ts -var face3 = ` + ${e.box[0]} ${r}, + ${e.box[0]+e.box[2]} ${r}, + ${e.box[0]+e.box[2]} ${e.box[1]+e.box[3]/2} + `);t.stroke(a),t.stroke(s)}}function uA(e,t){var o,n,r,s;if(D.drawGaze&&((n=(o=e.rotation)==null?void 0:o.gaze)==null?void 0:n.strength)&&((s=(r=e.rotation)==null?void 0:r.gaze)==null?void 0:s.bearing)&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let a=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];T1(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[a[0],a[1]],4);let i=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];T1(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[i[0],i[1]],4)}}function hA(e,t){if(D.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let o=0;oe.mesh[r]);R1(t,n,D)}mA(e,t)}}function bA(e,t){if(D.drawPoints&&e.mesh.length>=468)for(let o=0;o0&&(bA(r,n),hA(r,n),pA(r,n),uA(r,n))}}async function Be(e,t,o){var s;let n=_(y0,o);if(!t||!e)return;let r=w0(e);if(!!r){r.lineJoin="round";for(let a=0;a0)for(let a of s.keypoints)r.fillStyle=U0(a[2],n),Y0(r,a[0],a[1],0,n);if(n.drawLabels&&s.annotations){let a=(i,y)=>{if(!i||i.length===0||!i[0])return;let x=i[i.length-1][2]||-256;r.fillStyle=U0(x,n),r.fillText(y,i[i.length-1][0]+4,i[i.length-1][1]+4)};r.font=n.font,a(s.annotations.index,"index"),a(s.annotations.middle,"middle"),a(s.annotations.ring,"ring"),a(s.annotations.pinky,"pinky"),a(s.annotations.thumb,"thumb"),a(s.annotations.palm,"palm")}if(n.drawPolygons&&s.annotations){let a=i=>{if(!(!i||i.length===0||!i[0]))for(let y=0;y0?y-1:0][0],i[y>0?y-1:0][1]),r.lineTo(i[y][0],i[y][1]),r.stroke()}};r.lineWidth=n.lineWidth,a(s.annotations.index),a(s.annotations.middle),a(s.annotations.ring),a(s.annotations.pinky),a(s.annotations.thumb)}}}}async function Ve(e,t,o){let n=_(y0,o);if(!t||!e)return;let r=w0(e);if(!!r){r.lineJoin="round",r.font=n.font;for(let s of t)if(n.drawBoxes){if(r.strokeStyle=n.color,r.fillStyle=n.color,G0(r,s.box[0],s.box[1],s.box[2],s.box[3],n),n.drawLabels){let a=`${s.label} ${Math.round(100*s.score)}%`;n.shadowColor&&n.shadowColor!==""&&(r.fillStyle=n.shadowColor,r.fillText(a,s.box[0]+3,1+s.box[1]+n.lineHeight,s.box[2])),r.fillStyle=n.labelColor,r.fillText(a,s.box[0]+2,0+s.box[1]+n.lineHeight,s.box[2])}r.stroke()}}}async function De(e,t,o){let n=_(y0,o);if(!(!t||!e)&&n.drawGestures){let r=w0(e);if(!r)return;r.font=n.font,r.fillStyle=n.color;let s=1;for(let a=0;a1&&y[1].length>0){let x=i[1]>0?`#${i[1]}`:"",d=`${i[0]} ${x}: ${y[1]}`;n.shadowColor&&n.shadowColor!==""&&(r.fillStyle=n.shadowColor,r.fillText(d,8,2+s*n.lineHeight)),r.fillStyle=n.labelColor,r.fillText(d,6,0+s*n.lineHeight),s+=1}}}}var v1=0;async function w1(e,t,o){let n=_(y0,o);if(!t||!e)return;let r=w0(e);if(!!r){r.lineJoin="round",r.font=n.font;for(let s=0;st!=o[r].y>t&&e<(o[r].x-o[s].x)*(t-o[s].y)/(o[r].y-o[s].y)+o[s].x&&(n=!n);return n}async function go(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,o=e.tensor.shape[1]||0,n=await e.tensor.buffer(),r=[];for(let a of z0.silhouette)r.push({x:(e.mesh[a][0]-e.box[0])/e.box[2],y:(e.mesh[a][1]-e.box[1])/e.box[3]});Ze&&Ze>0&&(r=r.map(a=>({x:a.x>.5?a.x+Ze:a.x-Ze,y:a.y>.5?a.y+Ze:a.y-Ze})));for(let a=0;a{let t=(l,f)=>Math.atan2(l[1]-f[1],l[0]-f[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let o=[0,-.1],n=1,r=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=r?e.mesh[473]:e.mesh[468],a=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],i=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],y=[(a[0]-s[0])/i[0]-o[0],n*(s[1]-a[1])/i[1]-o[1]],x=Math.sqrt(y[0]*y[0]+y[1]*y[1]);return x=Math.min(x,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],y)+Math.PI/2)%Math.PI,strength:x}},Mo=(e,t)=>{let o=p=>{let R=Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);return p[0]/=R,p[1]/=R,p[2]/=R,p},n=(p,R)=>{let P=p[0]-R[0],M=p[1]-R[1],m=p[2]-R[2];return[P,M,m]},r=(p,R)=>{let P=p[1]*R[2]-p[2]*R[1],M=p[2]*R[0]-p[0]*R[2],m=p[0]*R[1]-p[1]*R[0];return[P,M,m]},s=p=>{let[R,P,M,m,h,C,j,k,z]=p,F,B,O;return m<1?m>-1?(O=Math.asin(m),B=Math.atan2(-j,R),F=Math.atan2(-C,h)):(O=-Math.PI/2,B=-Math.atan2(k,z),F=0):(O=Math.PI/2,B=Math.atan2(k,z),F=0),isNaN(F)&&(F=0),isNaN(B)&&(B=0),isNaN(O)&&(O=0),{pitch:2*-F,yaw:2*-B,roll:2*-O}},a=e.meshRaw;if(!a||a.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let i=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,y=[a[10],a[152],a[234],a[454]].map(p=>[p[0]*t[0]/i,p[1]*t[1]/i,p[2]]),x=o(n(y[1],y[0])),d=o(n(y[3],y[2])),l=o(r(d,x));d=r(x,l);let f=[d[0],d[1],d[2],x[0],x[1],x[2],l[0],l[1],l[2]],c=s(f),b=a.length===478?RA(e):{bearing:0,strength:0};return{angle:c,matrix:f,gaze:b}};var S1=async(e,t)=>{var b,p,R,P,M,m,h,C,j,k,z,F,B,O,K,Z,S,e0,R0,T,n0,x0,X;let o=g(),n,r,s,a,i,y,x,d,l,f=[];e.state="run:face";let c=await y3(t,e.config);if(e.performance.face=v.perfadd?(e.performance.face||0)+Math.trunc(g()-o):Math.trunc(g()-o),!t.shape||t.shape.length!==4)return[];if(!c)return[];for(let E=0;E200?Mo(c[E],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?a=(p=e.config.face.emotion)!=null&&p.enabled?O5(c[E].tensor||A.tensor([]),e.config,E,c.length):[]:(e.state="run:emotion",o=g(),a=(R=e.config.face.emotion)!=null&&R.enabled?await O5(c[E].tensor||A.tensor([]),e.config,E,c.length):[],e.performance.emotion=v.perfadd?(e.performance.emotion||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?x=(P=e.config.face.antispoof)!=null&&P.enabled?p5(c[E].tensor||A.tensor([]),e.config,E,c.length):0:(e.state="run:antispoof",o=g(),x=(M=e.config.face.antispoof)!=null&&M.enabled?await p5(c[E].tensor||A.tensor([]),e.config,E,c.length):0,e.performance.antispoof=v.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?d=(m=e.config.face.liveness)!=null&&m.enabled?r1(c[E].tensor||A.tensor([]),e.config,E,c.length):0:(e.state="run:liveness",o=g(),d=(h=e.config.face.liveness)!=null&&h.enabled?await r1(c[E].tensor||A.tensor([]),e.config,E,c.length):0,e.performance.liveness=v.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?r=(C=e.config.face.gear)!=null&&C.enabled?l5(c[E].tensor||A.tensor([]),e.config,E,c.length):null:(e.state="run:gear",o=g(),r=(j=e.config.face.gear)!=null&&j.enabled?await l5(c[E].tensor||A.tensor([]),e.config,E,c.length):null,e.performance.gear=Math.trunc(g()-o)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(n=(k=e.config.face.ssrnet)!=null&&k.enabled?x5(c[E].tensor||A.tensor([]),e.config,E,c.length):null,s=(z=e.config.face.ssrnet)!=null&&z.enabled?f5(c[E].tensor||A.tensor([]),e.config,E,c.length):null):(e.state="run:ssrnet",o=g(),n=(F=e.config.face.ssrnet)!=null&&F.enabled?await x5(c[E].tensor||A.tensor([]),e.config,E,c.length):null,s=(B=e.config.face.ssrnet)!=null&&B.enabled?await f5(c[E].tensor||A.tensor([]),e.config,E,c.length):null,e.performance.ssrnet=Math.trunc(g()-o)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?i=(O=e.config.face.mobilefacenet)!=null&&O.enabled?W5(c[E].tensor||A.tensor([]),e.config,E,c.length):null:(e.state="run:mobilefacenet",o=g(),i=(K=e.config.face.mobilefacenet)!=null&&K.enabled?await W5(c[E].tensor||A.tensor([]),e.config,E,c.length):null,e.performance.mobilefacenet=Math.trunc(g()-o)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?y=(Z=e.config.face.insightface)!=null&&Z.enabled?G5(c[E].tensor||A.tensor([]),e.config,E,c.length):null:(e.state="run:mobilefacenet",o=g(),y=(S=e.config.face.insightface)!=null&&S.enabled?await G5(c[E].tensor||A.tensor([]),e.config,E,c.length):null,e.performance.mobilefacenet=Math.trunc(g()-o)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?l=X5(c[E].tensor||A.tensor([]),e.config,E,c.length):(e.state="run:description",o=g(),l=await X5(c[E].tensor||A.tensor([]),e.config,E,c.length),e.performance.description=v.perfadd?(e.performance.description||0)+Math.trunc(g()-o):Math.trunc(g()-o)),e.analyze("End Description:"),e.config.async&&([n,s,a,i,y,l,r,x,d]=await Promise.all([n,s,a,i,y,l,r,x,d])),e.analyze("Finish Face:"),((e0=e.config.face.ssrnet)==null?void 0:e0.enabled)&&n&&s&&(l={...l,age:n.age,gender:s.gender,genderScore:s.genderScore}),((R0=e.config.face.gear)==null?void 0:R0.enabled)&&r&&(l={...l,age:r.age,gender:r.gender,genderScore:r.genderScore,race:r.race}),((T=e.config.face.mobilefacenet)==null?void 0:T.enabled)&&i&&(l.descriptor=i),((n0=e.config.face.insightface)==null?void 0:n0.enabled)&&y&&(l.descriptor=y),(x0=e.config.face.iris)!=null&&x0.enabled;let G=c[E].annotations&&c[E].annotations.leftEyeIris&&c[E].annotations.leftEyeIris[0]&&c[E].annotations.rightEyeIris&&c[E].annotations.rightEyeIris[0]&&c[E].annotations.leftEyeIris.length>0&&c[E].annotations.rightEyeIris.length>0&&c[E].annotations.leftEyeIris[0]!==null&&c[E].annotations.rightEyeIris[0]!==null?Math.max(Math.abs(c[E].annotations.leftEyeIris[3][0]-c[E].annotations.leftEyeIris[1][0]),Math.abs(c[E].annotations.rightEyeIris[4][1]-c[E].annotations.rightEyeIris[2][1]))/t.shape[2]:0,H=(X=e.config.face.detector)!=null&&X.return?A.squeeze(c[E].tensor):null;A.dispose(c[E].tensor),c[E].tensor&&delete c[E].tensor;let Q={...c[E],id:E};l!=null&&l.age&&(Q.age=l.age),l!=null&&l.gender&&(Q.gender=l.gender),l!=null&&l.genderScore&&(Q.genderScore=l==null?void 0:l.genderScore),l!=null&&l.descriptor&&(Q.embedding=l==null?void 0:l.descriptor),l!=null&&l.race&&(Q.race=l==null?void 0:l.race),a&&(Q.emotion=a),x&&(Q.real=x),d&&(Q.live=d),G&&G!==0&&(Q.iris=Math.trunc(500/G/11.7)/100),A0&&(Q.rotation=A0),H&&(Q.tensor=H),f.push(Q),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),f};var Po=e=>{if(!e)return[];let t=[];for(let o=0;oy.part==="leftWrist"),r=e[o].keypoints.find(y=>y.part==="rightWrist"),s=e[o].keypoints.find(y=>y.part==="nose");s&&n&&r&&n.position[1]y.part==="leftShoulder"),i=e[o].keypoints.find(y=>y.part==="rightShoulder");a&&i&&Math.abs(a.positionRaw[1]-i.positionRaw[1])>.1&&t.push({body:o,gesture:`leaning ${a.position[1]>i.position[1]?"left":"right"}`})}return t},Ro=e=>{if(!e)return[];let t=[];for(let o=0;o450){let n=(e[o].mesh[33][2]||0)-(e[o].mesh[263][2]||0),r=e[o].mesh[33][0]-e[o].mesh[263][0];Math.abs(n/r)<=.15?t.push({face:o,gesture:"facing center"}):t.push({face:o,gesture:`facing ${n<0?"left":"right"}`}),Math.abs(e[o].mesh[374][1]-e[o].mesh[386][1])/Math.abs(e[o].mesh[443][1]-e[o].mesh[450][1])<.2&&t.push({face:o,gesture:"blink left eye"}),Math.abs(e[o].mesh[145][1]-e[o].mesh[159][1])/Math.abs(e[o].mesh[223][1]-e[o].mesh[230][1])<.2&&t.push({face:o,gesture:"blink right eye"});let i=Math.min(100,500*Math.abs(e[o].mesh[13][1]-e[o].mesh[14][1])/Math.abs(e[o].mesh[10][1]-e[o].mesh[152][1]));i>10&&t.push({face:o,gesture:`mouth ${Math.trunc(i)}% open`});let y=e[o].mesh[152][2]||0;Math.abs(y)>10&&t.push({face:o,gesture:`head ${y<0?"up":"down"}`})}return t},To=e=>{if(!e)return[];let t=[];for(let o=0;o.06||f>.06)&&(x=!1),l>f?l>.05&&t.push({iris:o,gesture:"looking right"}):f>.05&&t.push({iris:o,gesture:"looking left"});let c=Math.abs(e[o].mesh[145][1]-e[o].annotations.rightEyeIris[0][1])/e[o].box[3],b=Math.abs(e[o].mesh[374][1]-e[o].annotations.leftEyeIris[0][1])/e[o].box[3];(b<.01||c<.01||b>.022||c>.022)&&(x=!1),(b<.01||c<.01)&&t.push({iris:o,gesture:"looking down"}),(b>.022||c>.022)&&t.push({iris:o,gesture:"looking up"}),x&&t.push({iris:o,gesture:"looking center"})}return t},vo=e=>{if(!e)return[];let t=[];for(let o=0;o0){let r=n.reduce((a,i)=>(a.position[2]||0)<(i.position[2]||0)?a:i);t.push({hand:o,gesture:`${r.name} forward`});let s=n.reduce((a,i)=>a.position[1]((r-1)*I.body[T].box[H]+G)/r),x0=e.body[T].boxRaw.map((G,H)=>((r-1)*I.body[T].boxRaw[H]+G)/r),X=e.body[T].keypoints.map((G,H)=>{var Q,S0,qe,Ue,Me,N1,O1,L1,W1;return{score:G.score,part:G.part,position:[I.body[T].keypoints[H]?((r-1)*(I.body[T].keypoints[H].position[0]||0)+(G.position[0]||0))/r:G.position[0],I.body[T].keypoints[H]?((r-1)*(I.body[T].keypoints[H].position[1]||0)+(G.position[1]||0))/r:G.position[1],I.body[T].keypoints[H]?((r-1)*(I.body[T].keypoints[H].position[2]||0)+(G.position[2]||0))/r:G.position[2]],positionRaw:[I.body[T].keypoints[H]?((r-1)*(I.body[T].keypoints[H].positionRaw[0]||0)+(G.positionRaw[0]||0))/r:G.positionRaw[0],I.body[T].keypoints[H]?((r-1)*(I.body[T].keypoints[H].positionRaw[1]||0)+(G.positionRaw[1]||0))/r:G.positionRaw[1],I.body[T].keypoints[H]?((r-1)*(I.body[T].keypoints[H].positionRaw[2]||0)+(G.positionRaw[2]||0))/r:G.positionRaw[2]],distance:[I.body[T].keypoints[H]?((r-1)*(((Q=I.body[T].keypoints[H].distance)==null?void 0:Q[0])||0)+(((S0=G.distance)==null?void 0:S0[0])||0))/r:(qe=G.distance)==null?void 0:qe[0],I.body[T].keypoints[H]?((r-1)*(((Ue=I.body[T].keypoints[H].distance)==null?void 0:Ue[1])||0)+(((Me=G.distance)==null?void 0:Me[1])||0))/r:(N1=G.distance)==null?void 0:N1[1],I.body[T].keypoints[H]?((r-1)*(((O1=I.body[T].keypoints[H].distance)==null?void 0:O1[2])||0)+(((L1=G.distance)==null?void 0:L1[2])||0))/r:(W1=G.distance)==null?void 0:W1[2]]}}),E={},A0={connected:{}};(i=(a=t.body)==null?void 0:a.modelPath)!=null&&i.includes("efficientpose")?A0=k2:(x=(y=t.body)==null?void 0:y.modelPath)!=null&&x.includes("blazepose")?A0=P2:(l=(d=t.body)==null?void 0:d.modelPath)!=null&&l.includes("movenet")&&(A0=r2);for(let[G,H]of Object.entries(A0.connected)){let Q=[];for(let S0=0;S0Me.part===H[S0]),Ue=X.find(Me=>Me.part===H[S0+1]);qe&&Ue&&Q.push([qe.position,Ue.position])}E[G]=Q}I.body[T]={...e.body[T],box:n0,boxRaw:x0,keypoints:X,annotations:E}}if(!I.hand||e.hand.length!==I.hand.length)I.hand=JSON.parse(JSON.stringify(e.hand));else for(let T=0;T((r-1)*I.hand[T].box[G]+A0)/r),x0=e.hand[T].boxRaw.map((A0,G)=>((r-1)*I.hand[T].boxRaw[G]+A0)/r);I.hand[T].keypoints.length!==e.hand[T].keypoints.length&&(I.hand[T].keypoints=e.hand[T].keypoints);let X=e.hand[T].keypoints&&e.hand[T].keypoints.length>0?e.hand[T].keypoints.map((A0,G)=>A0.map((H,Q)=>((r-1)*(I.hand[T].keypoints[G][Q]||1)+(H||0))/r)):[],E={};if(Object.keys(I.hand[T].annotations).length!==Object.keys(e.hand[T].annotations).length)I.hand[T].annotations=e.hand[T].annotations,E=I.hand[T].annotations;else if(e.hand[T].annotations)for(let A0 of Object.keys(e.hand[T].annotations))E[A0]=e.hand[T].annotations[A0]&&e.hand[T].annotations[A0][0]?e.hand[T].annotations[A0].map((G,H)=>G.map((Q,S0)=>((r-1)*I.hand[T].annotations[A0][H][S0]+Q)/r)):null;I.hand[T]={...e.hand[T],box:n0,boxRaw:x0,keypoints:X,annotations:E}}if(!I.face||e.face.length!==I.face.length)I.face=JSON.parse(JSON.stringify(e.face));else for(let T=0;T((r-1)*I.face[T].box[E]+X)/r),x0=e.face[T].boxRaw.map((X,E)=>((r-1)*I.face[T].boxRaw[E]+X)/r);if(e.face[T].rotation){let X={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};X.matrix=(f=e.face[T].rotation)==null?void 0:f.matrix,X.angle={roll:((r-1)*(((b=(c=I.face[T].rotation)==null?void 0:c.angle)==null?void 0:b.roll)||0)+(((R=(p=e.face[T].rotation)==null?void 0:p.angle)==null?void 0:R.roll)||0))/r,yaw:((r-1)*(((M=(P=I.face[T].rotation)==null?void 0:P.angle)==null?void 0:M.yaw)||0)+(((h=(m=e.face[T].rotation)==null?void 0:m.angle)==null?void 0:h.yaw)||0))/r,pitch:((r-1)*(((j=(C=I.face[T].rotation)==null?void 0:C.angle)==null?void 0:j.pitch)||0)+(((z=(k=e.face[T].rotation)==null?void 0:k.angle)==null?void 0:z.pitch)||0))/r},X.gaze={bearing:((r-1)*(((B=(F=I.face[T].rotation)==null?void 0:F.gaze)==null?void 0:B.bearing)||0)+(((K=(O=e.face[T].rotation)==null?void 0:O.gaze)==null?void 0:K.bearing)||0))/r,strength:((r-1)*(((S=(Z=I.face[T].rotation)==null?void 0:Z.gaze)==null?void 0:S.strength)||0)+(((R0=(e0=e.face[T].rotation)==null?void 0:e0.gaze)==null?void 0:R0.strength)||0))/r},I.face[T]={...e.face[T],rotation:X,box:n0,boxRaw:x0}}I.face[T]={...e.face[T],box:n0,boxRaw:x0}}if(!I.object||e.object.length!==I.object.length)I.object=JSON.parse(JSON.stringify(e.object));else for(let T=0;T((r-1)*I.object[T].box[E]+X)/r),x0=e.object[T].boxRaw.map((X,E)=>((r-1)*I.object[T].boxRaw[E]+X)/r);I.object[T]={...e.object[T],box:n0,boxRaw:x0}}if(e.persons){let T=e.persons;if(!I.persons||T.length!==I.persons.length)I.persons=JSON.parse(JSON.stringify(T));else for(let n0=0;n0((r-1)*I.persons[n0].box[X]+x0)/r)}e.gesture&&(I.gesture=e.gesture);let s=g();return C1=v.perfadd?C1+Math.round(s-o):Math.round(s-o),e.performance&&(I.performance={...e.performance,interpolate:C1}),I}var Eo={};K0(Eo,{distance:()=>i2,match:()=>j1,similarity:()=>I1});function i2(e,t,o={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let n=0;for(let r=0;r{if(e===0)return 1;let r=t===2?Math.sqrt(e):e**(1/t),s=(1-r/100-o)/(n-o);return Math.max(Math.min(s,1),0)};function I1(e,t,o={order:2,multiplier:25,min:.2,max:.8}){let n=i2(e,t,o);return ko(n,o.order||2,o.min||0,o.max||1)}function j1(e,t,o={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let n=Number.MAX_SAFE_INTEGER,r=-1;for(let a=0;aS.box[0]&&k.box[0]S.box[1]&&k.box[1]+k.box[3]z.body.box[0]&&S.box[0]+S.box[2]z.body.box[1]&&S.box[1]+S.box[3]z.body.box[0]&&S.box[1]+S.box[3]>z.body.box[1]&&S.box[1]+S.box[3]{S&&S.length===4&&(F.push(S[0],S[0]+S[2]),B.push(S[1],S[1]+S[3]))};O((P=z.face)==null?void 0:P.box),O((M=z.body)==null?void 0:M.box),O((h=(m=z.hands)==null?void 0:m.left)==null?void 0:h.box),O((j=(C=z.hands)==null?void 0:C.right)==null?void 0:j.box);let K=Math.min(...F),Z=Math.min(...B);z.box=[K,Z,Math.max(...F)-K,Math.max(...B)-Z],r&&r[1]&&r[2]&&(z.boxRaw=[z.box[0]/r[2],z.box[1]/r[1],z.box[2]/r[2],z.box[3]/r[1]]),a.push(z)}return a}var Q2=` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -13483,8 +259,7 @@ PQ4GJ+ashuK0MhWaoWcA0AaOmASMK7jRNPWYBmHyiuepO2x10qfcv6vYxCzYqoGK4HVYVTJrmb5l c6oaM5TUJ8EgGsG4kLNUHT0M64OaqMMikSRsuKbnFMRLG3zVehOaGNE445NNlnVFpDMu6uie9Vo1 8z5mOAOST2pDK91cNN+5tsrH3PrW54a06KxT7fdrlh/q1Pc+tJ6IUdZGvHPLezMcnBOWbsPap5r3 ylFtbdT1xUWNWzU0/Zbwlgfmx8zGsHWtRHmMqE59aAMyNifvHPc1f0gtPdqkY5JosJHeNci2tktY -euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`; -var body3 = ` +euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`,_2=` /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk JyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwNDREPESESEiFFLicuRUVFRUVF RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX/wAARCASwBLADASIA @@ -14052,524 +827,5 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`; - -// src/warmup.ts -async function warmupBitmap(instance2) { - const b64toBlob = (base64, type = "application/octet-stream") => fetch(`data:${type};base64,${base64}`).then((res2) => res2.blob()); - let blob; - let res; - switch (instance2.config.warmup) { - case "face": - blob = await b64toBlob(face3); - break; - case "body": - case "full": - blob = await b64toBlob(body3); - break; - default: - blob = null; - } - if (blob) { - const bitmap = await createImageBitmap(blob); - res = await instance2.detect(bitmap, instance2.config); - bitmap.close(); - } - return res; -} -async function warmupCanvas(instance2) { - return new Promise((resolve) => { - let src; - switch (instance2.config.warmup) { - case "face": - src = "data:image/jpeg;base64," + face3; - break; - case "full": - case "body": - src = "data:image/jpeg;base64," + body3; - break; - default: - src = null; - } - let img; - if (typeof Image !== "undefined") - img = new Image(); - else if (env.Image) - img = new env.Image(); - else - return; - img.onload = async () => { - const canvas3 = canvas(img.naturalWidth, img.naturalHeight); - if (!canvas3) { - log("Warmup: Canvas not found"); - resolve(void 0); - } else { - const ctx = canvas3.getContext("2d"); - if (ctx) - ctx.drawImage(img, 0, 0); - const tensor3 = await instance2.image(canvas3); - const res = await instance2.detect(tensor3.tensor, instance2.config); - resolve(res); - } - }; - if (src) - img.src = src; - else - resolve(void 0); - }); -} -async function warmupNode(instance2) { - const atob = (str) => Buffer.from(str, "base64"); - let img; - if (instance2.config.warmup === "face") - img = atob(face3); - else - img = atob(body3); - let res; - if ("node" in tfjs_esm_exports && tfjs_esm_exports.getBackend() === "tensorflow") { - const data = tfjs_esm_exports["node"].decodeJpeg(img); - const expanded = data.expandDims(0); - instance2.tf.dispose(data); - res = await instance2.detect(expanded, instance2.config); - instance2.tf.dispose(expanded); - } else { - if (instance2.config.debug) - log("Warmup tfjs-node not loaded"); - } - return res; -} -async function runInference(instance2) { - let res; - if (typeof createImageBitmap === "function") - res = await warmupBitmap(instance2); - else if (typeof Image !== "undefined" || env.Canvas !== void 0) - res = await warmupCanvas(instance2); - else - res = await warmupNode(instance2); - return res; -} -async function runCompile(allModels) { - if (!tfjs_esm_exports.env().flagRegistry["ENGINE_COMPILE_ONLY"]) - return; - const backendType = tfjs_esm_exports.getBackend(); - const webGLBackend = tfjs_esm_exports.backend(); - if (backendType !== "webgl" && backendType !== "humangl" || (!webGLBackend || !webGLBackend.checkCompileCompletion)) { - return; - } - tfjs_esm_exports.env().set("ENGINE_COMPILE_ONLY", true); - const numTensorsStart = tfjs_esm_exports.engine().state.numTensors; - const compiledModels = []; - for (const [modelName, model19] of Object.entries(allModels).filter(([key, val]) => key !== null && val !== null)) { - const shape = model19.inputs && model19.inputs[0] && model19.inputs[0].shape ? [...model19.inputs[0].shape] : [1, 64, 64, 3]; - const dtype = model19.inputs && model19.inputs[0] && model19.inputs[0].dtype ? model19.inputs[0].dtype : "float32"; - for (let dim = 0; dim < shape.length; dim++) { - if (shape[dim] === -1) - shape[dim] = dim === 0 ? 1 : 64; - } - const tensor3 = tfjs_esm_exports.zeros(shape, dtype); - try { - const res = model19.execute(tensor3); - compiledModels.push(modelName); - if (Array.isArray(res)) - res.forEach((t) => tfjs_esm_exports.dispose(t)); - else - tfjs_esm_exports.dispose(res); - } catch (e) { - log("compile fail model:", modelName); - } - tfjs_esm_exports.dispose(tensor3); - } - const kernels = await webGLBackend.checkCompileCompletionAsync(); - webGLBackend.getUniformLocations(); - log("compile pass models:", compiledModels); - log("compile pass kernels:", kernels.length); - tfjs_esm_exports.env().set("ENGINE_COMPILE_ONLY", false); - const numTensorsEnd = tfjs_esm_exports.engine().state.numTensors; - if (numTensorsEnd - numTensorsStart > 0) - log("tensor leak:", numTensorsEnd - numTensorsStart); -} -async function warmup(instance2, userConfig) { - const t0 = now(); - instance2.state = "warmup"; - if (userConfig) - instance2.config = mergeDeep(instance2.config, userConfig); - if (!instance2.config.warmup || instance2.config.warmup.length === 0 || instance2.config.warmup === "none") { - return { face: [], body: [], hand: [], gesture: [], object: [], performance: instance2.performance, timestamp: now(), persons: [], error: null }; - } - return new Promise(async (resolve) => { - await runCompile(instance2.models); - const res = await runInference(instance2); - const t1 = now(); - if (instance2.config.debug) - log("warmup", instance2.config.warmup, Math.round(t1 - t0), "ms"); - instance2.emit("warmup"); - resolve(res); - }); -} - -// src/human.ts -var _numTensors, _analyzeMemoryLeaks, _checkSanity, _sanity; -var Human = class { - constructor(userConfig) { - __publicField(this, "version"); - __publicField(this, "config"); - __publicField(this, "result"); - __publicField(this, "state"); - __publicField(this, "process"); - __publicField(this, "tf"); - __publicField(this, "env"); - __publicField(this, "draw"); - __publicField(this, "models"); - __publicField(this, "events"); - __publicField(this, "faceTriangulation"); - __publicField(this, "faceUVMap"); - __publicField(this, "performance"); - __privateAdd(this, _numTensors, void 0); - __privateAdd(this, _analyzeMemoryLeaks, void 0); - __privateAdd(this, _checkSanity, void 0); - __publicField(this, "gl"); - __publicField(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.env.node && !(input instanceof Tensor)) - return "input must be a tensor"; - try { - this.tf.getBackend(); - } catch (e) { - return "backend not loaded"; - } - return null; - }); - __publicField(this, "similarity", similarity); - __publicField(this, "distance", distance); - __publicField(this, "match", match2); - __publicField(this, "emit", (event) => { - var _a; - if (this.events && this.events.dispatchEvent) - (_a = this.events) == null ? void 0 : _a.dispatchEvent(new Event(event)); - }); - var _a; - this.env = env; - const tfVersion = (((_a = version8) == null ? void 0 : _a.tfjs) || tfjs_esm_exports.version_core).replace(/-(.*)/, ""); - config.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tfVersion}/dist/`; - config.modelBasePath = env.browser ? "../models/" : "file://models/"; - config.backend = env.browser ? "humangl" : "tensorflow"; - this.version = version9; - Object.defineProperty(this, "version", { value: version9 }); - this.config = JSON.parse(JSON.stringify(config)); - Object.seal(this.config); - this.config.cacheModels = typeof indexedDB !== "undefined"; - if (userConfig) - this.config = mergeDeep(this.config, userConfig); - setModelLoadOptions(this.config); - this.tf = tfjs_esm_exports; - this.state = "idle"; - __privateSet(this, _numTensors, 0); - __privateSet(this, _analyzeMemoryLeaks, false); - __privateSet(this, _checkSanity, false); - this.performance = {}; - this.events = typeof EventTarget !== "undefined" ? new EventTarget() : void 0; - this.models = new Models(); - this.draw = { - options: options3, - canvas: (input, output) => canvas2(input, output), - face: (output, result, options4) => face(output, result, options4), - body: (output, result, options4) => body(output, result, options4), - hand: (output, result, options4) => hand(output, result, options4), - gesture: (output, result, options4) => gesture(output, result, options4), - object: (output, result, options4) => object(output, result, options4), - person: (output, result, options4) => person(output, result, options4), - all: (output, result, options4) => all(output, result, options4) - }; - this.result = { face: [], body: [], hand: [], gesture: [], object: [], performance: {}, timestamp: 0, persons: [], error: null }; - this.process = { tensor: null, canvas: null }; - this.faceTriangulation = triangulation; - this.faceUVMap = uvmap; - this.gl = config2; - validateModel(this, null, ""); - this.emit("create"); - } - reset() { - const currentBackend = this.config.backend; - this.config = JSON.parse(JSON.stringify(config)); - this.config.backend = currentBackend; - } - validate(userConfig) { - return validate(config, userConfig || this.config); - } - check() { - return validate2(this); - } - now() { - return now(); - } - image(input, getTensor = true) { - return process2(input, this.config, getTensor); - } - async segmentation(input, background) { - return process5(input, background, this.config); - } - enhance(input) { - return enhance(input); - } - compare(firstImageTensor, secondImageTensor) { - return compare(this.config, firstImageTensor, secondImageTensor); - } - async init() { - await check(this, true); - await this.tf.ready(); - } - async load(userConfig) { - this.state = "load"; - const timeStamp = now(); - const count2 = Object.values(this.models).filter((model19) => model19).length; - if (userConfig) - this.config = mergeDeep(this.config, userConfig); - if (this.env.initial) { - if (this.config.debug) - log(`version: ${this.version}`); - if (this.config.debug) - log(`tfjs version: ${this.tf.version["tfjs-core"]}`); - if (!await check(this)) - log("error: backend check failed"); - await tfjs_esm_exports.ready(); - if (this.env.browser) { - if (this.config.debug) - log("configuration:", this.config); - if (this.config.debug) - log("environment:", this.env); - if (this.config.debug) - log("tf flags:", this.tf.ENV["flags"]); - } - } - await load20(this); - if (this.env.initial && this.config.debug) - log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors"); - this.env.initial = false; - const loaded = Object.values(this.models).filter((model19) => model19).length; - if (loaded !== count2) { - await validate2(this); - this.emit("load"); - } - const current = Math.trunc(now() - timeStamp); - if (current > (this.performance.loadModels || 0)) - this.performance.loadModels = this.env.perfadd ? (this.performance.loadModels || 0) + current : current; - } - next(result = this.result) { - return calc2(result, this.config); - } - getModelStats() { - return getModelStats(this); - } - async warmup(userConfig) { - const t0 = now(); - const res = await warmup(this, userConfig); - const t1 = now(); - this.performance.warmup = Math.trunc(t1 - t0); - return res; - } - async profile(input, userConfig) { - const profile = await this.tf.profile(() => this.detect(input, userConfig)); - const kernels = {}; - let total = 0; - for (const kernel of profile.kernels) { - if (kernels[kernel.name]) - kernels[kernel.name] += kernel.kernelTimeMs; - else - kernels[kernel.name] = kernel.kernelTimeMs; - total += kernel.kernelTimeMs; - } - const kernelArr = []; - Object.entries(kernels).forEach((key) => kernelArr.push({ kernel: key[0], time: key[1], perc: 0 })); - for (const kernel of kernelArr) { - kernel.perc = Math.round(1e3 * kernel.time / total) / 1e3; - kernel.time = Math.round(1e3 * kernel.time) / 1e3; - } - kernelArr.sort((a, b) => b.time - a.time); - kernelArr.length = 20; - return kernelArr; - } - async detect(input, userConfig) { - this.state = "detect"; - return new Promise(async (resolve) => { - var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v; - 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); - this.emit("error"); - resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error }); - } - const timeStart = now(); - await check(this); - await this.load(); - timeStamp = now(); - this.state = "image"; - const img = await process2(input, this.config); - this.process = img; - this.performance.inputProcess = this.env.perfadd ? (this.performance.inputProcess || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - this.analyze("Get Image:"); - if (!img.tensor) { - if (this.config.debug) - log("could not convert input to tensor"); - this.emit("error"); - resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error: "could not convert input to tensor" }); - return; - } - this.emit("image"); - timeStamp = now(); - this.config.skipAllowed = await skip(this.config, img.tensor); - if (!this.performance.totalFrames) - this.performance.totalFrames = 0; - if (!this.performance.cachedFrames) - this.performance.cachedFrames = 0; - this.performance.totalFrames++; - if (this.config.skipAllowed) - this.performance.cachedFrames++; - this.performance.cacheCheck = this.env.perfadd ? (this.performance.cacheCheck || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - this.analyze("Check Changed:"); - let faceRes = []; - let bodyRes = []; - let handRes = []; - let objectRes = []; - this.state = "detect:face"; - if (this.config.async) { - faceRes = this.config.face.enabled ? detectFace(this, img.tensor) : []; - if (this.performance.face) - delete this.performance.face; - } else { - timeStamp = now(); - faceRes = this.config.face.enabled ? await detectFace(this, img.tensor) : []; - this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - } - if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1)) - faceRes = await faceRes; - this.analyze("Start Body:"); - this.state = "detect:body"; - const bodyConfig = this.config.body.maxDetected === -1 ? mergeDeep(this.config, { body: { maxDetected: this.config.face.enabled ? 1 * faceRes.length : 1 } }) : this.config; - if (this.config.async) { - if ((_a = this.config.body.modelPath) == null ? void 0 : _a.includes("posenet")) - bodyRes = this.config.body.enabled ? predict18(img.tensor, bodyConfig) : []; - else if ((_b = this.config.body.modelPath) == null ? void 0 : _b.includes("blazepose")) - bodyRes = this.config.body.enabled ? predict5(img.tensor, bodyConfig) : []; - else if ((_c = this.config.body.modelPath) == null ? void 0 : _c.includes("efficientpose")) - bodyRes = this.config.body.enabled ? predict7(img.tensor, bodyConfig) : []; - else if ((_d = this.config.body.modelPath) == null ? void 0 : _d.includes("movenet")) - bodyRes = this.config.body.enabled ? predict16(img.tensor, bodyConfig) : []; - if (this.performance.body) - delete this.performance.body; - } else { - timeStamp = now(); - if ((_e = this.config.body.modelPath) == null ? void 0 : _e.includes("posenet")) - bodyRes = this.config.body.enabled ? await predict18(img.tensor, bodyConfig) : []; - else if ((_f = this.config.body.modelPath) == null ? void 0 : _f.includes("blazepose")) - bodyRes = this.config.body.enabled ? await predict5(img.tensor, bodyConfig) : []; - else if ((_g = this.config.body.modelPath) == null ? void 0 : _g.includes("efficientpose")) - bodyRes = this.config.body.enabled ? await predict7(img.tensor, bodyConfig) : []; - else if ((_h = this.config.body.modelPath) == null ? void 0 : _h.includes("movenet")) - bodyRes = this.config.body.enabled ? await predict16(img.tensor, bodyConfig) : []; - this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - } - this.analyze("End Body:"); - this.analyze("Start Hand:"); - this.state = "detect:hand"; - const handConfig = this.config.hand.maxDetected === -1 ? mergeDeep(this.config, { hand: { maxDetected: this.config.face.enabled ? 2 * faceRes.length : 1 } }) : this.config; - if (this.config.async) { - if ((_j = (_i = this.config.hand.detector) == null ? void 0 : _i.modelPath) == null ? void 0 : _j.includes("handdetect")) - handRes = this.config.hand.enabled ? predict13(img.tensor, handConfig) : []; - else if ((_l = (_k = this.config.hand.detector) == null ? void 0 : _k.modelPath) == null ? void 0 : _l.includes("handtrack")) - handRes = this.config.hand.enabled ? predict14(img.tensor, handConfig) : []; - if (this.performance.hand) - delete this.performance.hand; - } else { - timeStamp = now(); - if ((_n = (_m = this.config.hand.detector) == null ? void 0 : _m.modelPath) == null ? void 0 : _n.includes("handdetect")) - handRes = this.config.hand.enabled ? await predict13(img.tensor, handConfig) : []; - else if ((_p = (_o = this.config.hand.detector) == null ? void 0 : _o.modelPath) == null ? void 0 : _p.includes("handtrack")) - handRes = this.config.hand.enabled ? await predict14(img.tensor, handConfig) : []; - this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - } - this.analyze("End Hand:"); - this.analyze("Start Object:"); - this.state = "detect:object"; - if (this.config.async) { - if ((_q = this.config.object.modelPath) == null ? void 0 : _q.includes("nanodet")) - objectRes = this.config.object.enabled ? predict17(img.tensor, this.config) : []; - else if ((_r = this.config.object.modelPath) == null ? void 0 : _r.includes("centernet")) - objectRes = this.config.object.enabled ? predict6(img.tensor, this.config) : []; - if (this.performance.object) - delete this.performance.object; - } else { - timeStamp = now(); - if ((_s = this.config.object.modelPath) == null ? void 0 : _s.includes("nanodet")) - objectRes = this.config.object.enabled ? await predict17(img.tensor, this.config) : []; - else if ((_t = this.config.object.modelPath) == null ? void 0 : _t.includes("centernet")) - objectRes = this.config.object.enabled ? await predict6(img.tensor, this.config) : []; - this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - } - this.analyze("End Object:"); - this.state = "detect:await"; - if (this.config.async) - [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]); - this.state = "detect:gesture"; - let gestureRes = []; - if (this.config.gesture.enabled) { - timeStamp = now(); - gestureRes = [...face2(faceRes), ...body2(bodyRes), ...hand2(handRes), ...iris2(faceRes)]; - if (!this.config.async) - this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); - else if (this.performance.gesture) - delete this.performance.gesture; - } - this.performance.total = this.env.perfadd ? (this.performance.total || 0) + Math.trunc(now() - timeStart) : Math.trunc(now() - timeStart); - const shape = ((_v = (_u = this.process) == null ? void 0 : _u.tensor) == null ? void 0 : _v.shape) || []; - this.result = { - face: faceRes, - body: bodyRes, - hand: handRes, - gesture: gestureRes, - object: objectRes, - performance: this.performance, - canvas: this.process.canvas, - timestamp: Date.now(), - error: null, - get persons() { - return join2(faceRes, bodyRes, handRes, gestureRes, shape); - } - }; - tfjs_esm_exports.dispose(img.tensor); - this.emit("detect"); - this.state = "idle"; - resolve(this.result); - }); - } -}; -_numTensors = new WeakMap(); -_analyzeMemoryLeaks = new WeakMap(); -_checkSanity = new WeakMap(); -_sanity = new WeakMap(); -export { - Human, - Human as default, - config as defaults, - draw_exports as draw, - env, - match_exports as match, - models_exports2 as models -}; +2Q==`;async function zA(e){let t=(r,s="application/octet-stream")=>fetch(`data:${s};base64,${r}`).then(a=>a.blob()),o,n;switch(e.config.warmup){case"face":o=await t(Q2);break;case"body":case"full":o=await t(_2);break;default:o=null}if(o){let r=await createImageBitmap(o);n=await e.detect(r,e.config),r.close()}return n}async function SA(e){return new Promise(t=>{let o;switch(e.config.warmup){case"face":o="data:image/jpeg;base64,"+Q2;break;case"full":case"body":o="data:image/jpeg;base64,"+_2;break;default:o=null}let n;if(typeof Image!="undefined")n=new Image;else if(v.Image)n=new v.Image;else return;n.onload=async()=>{let r=c0(n.naturalWidth,n.naturalHeight);if(!r)u("Warmup: Canvas not found"),t(void 0);else{let s=r.getContext("2d");s&&s.drawImage(n,0,0);let a=await e.image(r),i=await e.detect(a.tensor,e.config);t(i)}},o?n.src=o:t(void 0)})}async function CA(e){let t=r=>Buffer.from(r,"base64"),o;e.config.warmup==="face"?o=t(Q2):o=t(_2);let n;if("node"in A&&A.getBackend()==="tensorflow"){let r=A.node.decodeJpeg(o),s=r.expandDims(0);e.tf.dispose(r),n=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&u("Warmup tfjs-node not loaded");return n}async function IA(e){let t;return typeof createImageBitmap=="function"?t=await zA(e):typeof Image!="undefined"||v.Canvas!==void 0?t=await SA(e):t=await CA(e),t}async function jA(e){if(!A.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=A.getBackend(),o=A.backend();if(t!=="webgl"&&t!=="humangl"||!o||!o.checkCompileCompletion)return;A.env().set("ENGINE_COMPILE_ONLY",!0);let n=A.engine().state.numTensors,r=[];for(let[i,y]of Object.entries(e).filter(([x,d])=>x!==null&&d!==null)){let x=y.inputs&&y.inputs[0]&&y.inputs[0].shape?[...y.inputs[0].shape]:[1,64,64,3],d=y.inputs&&y.inputs[0]&&y.inputs[0].dtype?y.inputs[0].dtype:"float32";for(let f=0;fA.dispose(c)):A.dispose(f)}catch(f){u("compile fail model:",i)}A.dispose(l)}let s=await o.checkCompileCompletionAsync();o.getUniformLocations(),u("compile pass models:",r),u("compile pass kernels:",s.length),A.env().set("ENGINE_COMPILE_ONLY",!1);let a=A.engine().state.numTensors;a-n>0&&u("tensor leak:",a-n)}async function So(e,t){let o=g();return e.state="warmup",t&&(e.config=_(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?{face:[],body:[],hand:[],gesture:[],object:[],performance:e.performance,timestamp:g(),persons:[],error:null}:new Promise(async n=>{await jA(e.models);let r=await IA(e),s=g();e.config.debug&&u("warmup",e.config.warmup,Math.round(s-o),"ms"),e.emit("warmup"),n(r)})}var Xe,l2,y2,$2,Co=class{constructor(t){w(this,"version");w(this,"config");w(this,"result");w(this,"state");w(this,"process");w(this,"tf");w(this,"env");w(this,"draw");w(this,"models");w(this,"events");w(this,"faceTriangulation");w(this,"faceUVMap");w(this,"performance");Ke(this,Xe,void 0);Ke(this,l2,void 0);Ke(this,y2,void 0);w(this,"gl");w(this,"analyze",(...t)=>{if(!Ye(this,l2))return;let o=this.tf.engine().state.numTensors,n=Ye(this,Xe);Je(this,Xe,o);let r=o-n;r!==0&&u(...t,r)});Ke(this,$2,t=>{if(!Ye(this,y2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof Pe))return"input must be a tensor";try{this.tf.getBackend()}catch(o){return"backend not loaded"}return null});w(this,"similarity",I1);w(this,"distance",i2);w(this,"match",j1);w(this,"emit",t=>{var o;this.events&&this.events.dispatchEvent&&((o=this.events)==null||o.dispatchEvent(new Event(t)))});var n;this.env=v;let o=(((n=Qe)==null?void 0:n.tfjs)||A.version_core).replace(/-(.*)/,"");ie.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${o}/dist/`,ie.modelBasePath=v.browser?"../models/":"file://models/",ie.backend=v.browser?"humangl":"tensorflow",this.version=P1,Object.defineProperty(this,"version",{value:P1}),this.config=JSON.parse(JSON.stringify(ie)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=_(this.config,t)),uo(this.config),this.tf=A,this.state="idle",Je(this,Xe,0),Je(this,l2,!1),Je(this,y2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new a2,this.draw={options:y0,canvas:(r,s)=>k1(r,s),face:(r,s,a)=>Ge(r,s,a),body:(r,s,a)=>Be(r,s,a),hand:(r,s,a)=>He(r,s,a),gesture:(r,s,a)=>De(r,s,a),object:(r,s,a)=>Ve(r,s,a),person:(r,s,a)=>w1(r,s,a),all:(r,s,a)=>E1(r,s,a)},this.result={face:[],body:[],hand:[],gesture:[],object:[],performance:{},timestamp:0,persons:[],error:null},this.process={tensor:null,canvas:null},this.faceTriangulation=c3,this.faceUVMap=d3,this.gl=Y,Fe(this,null,""),this.emit("create")}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(ie)),this.config.backend=t}validate(t){return t5(ie,t||this.config)}check(){return J2(this)}now(){return g()}image(t,o=!0){return Te(t,this.config,o)}async segmentation(t,o){return mo(t,o,this.config)}enhance(t){return Z5(t)}compare(t,o){return K1(this.config,t,o)}async init(){await F2(this,!0),await this.tf.ready()}async load(t){this.state="load";let o=g(),n=Object.values(this.models).filter(a=>a).length;t&&(this.config=_(this.config,t)),this.env.initial&&(this.config.debug&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version["tfjs-core"]}`),await F2(this)||u("error: backend check failed"),await A.ready(),this.env.browser&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("environment:",this.env),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),await M1(this),this.env.initial&&this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models).filter(a=>a).length!==n&&(await J2(this),this.emit("load"));let s=Math.trunc(g()-o);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return wo(t,this.config)}getModelStats(){return g1(this)}async warmup(t){let o=g(),n=await So(this,t),r=g();return this.performance.warmup=Math.trunc(r-o),n}async profile(t,o){let n=await this.tf.profile(()=>this.detect(t,o)),r={},s=0;for(let i of n.kernels)r[i.name]?r[i.name]+=i.kernelTimeMs:r[i.name]=i.kernelTimeMs,s+=i.kernelTimeMs;let a=[];Object.entries(r).forEach(i=>a.push({kernel:i[0],time:i[1],perc:0}));for(let i of a)i.perc=Math.round(1e3*i.time/s)/1e3,i.time=Math.round(1e3*i.time)/1e3;return a.sort((i,y)=>y.time-i.time),a.length=20,a}async detect(t,o){return this.state="detect",new Promise(async n=>{var R,P,M,m,h,C,j,k,z,F,B,O,K,Z,S,e0,R0,T,n0,x0,X,E;this.state="config";let r;this.config=_(this.config,o),this.state="check";let s=Ye(this,$2).call(this,t);s&&(u(s,t),this.emit("error"),n({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:g(),persons:[],error:s}));let a=g();await F2(this),await this.load(),r=g(),this.state="image";let i=await Te(t,this.config);if(this.process=i,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Get Image:"),!i.tensor){this.config.debug&&u("could not convert input to tensor"),this.emit("error"),n({face:[],body:[],hand:[],gesture:[],object:[],performance:this.performance,timestamp:g(),persons:[],error:"could not convert input to tensor"});return}this.emit("image"),r=g(),this.config.skipAllowed=await Y1(this.config,i.tensor),this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Check Changed:");let y=[],x=[],d=[],l=[];this.state="detect:face",this.config.async?(y=this.config.face.enabled?S1(this,i.tensor):[],this.performance.face&&delete this.performance.face):(r=g(),y=this.config.face.enabled?await S1(this,i.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(y=await y),this.analyze("Start Body:"),this.state="detect:body";let f=this.config.body.maxDetected===-1?_(this.config,{body:{maxDetected:this.config.face.enabled?1*y.length:1}}):this.config;this.config.async?((R=this.config.body.modelPath)!=null&&R.includes("posenet")?x=this.config.body.enabled?u1(i.tensor,f):[]:(P=this.config.body.modelPath)!=null&&P.includes("blazepose")?x=this.config.body.enabled?w5(i.tensor,f):[]:(M=this.config.body.modelPath)!=null&&M.includes("efficientpose")?x=this.config.body.enabled?j5(i.tensor,f):[]:(m=this.config.body.modelPath)!=null&&m.includes("movenet")&&(x=this.config.body.enabled?y1(i.tensor,f):[]),this.performance.body&&delete this.performance.body):(r=g(),(h=this.config.body.modelPath)!=null&&h.includes("posenet")?x=this.config.body.enabled?await u1(i.tensor,f):[]:(C=this.config.body.modelPath)!=null&&C.includes("blazepose")?x=this.config.body.enabled?await w5(i.tensor,f):[]:(j=this.config.body.modelPath)!=null&&j.includes("efficientpose")?x=this.config.body.enabled?await j5(i.tensor,f):[]:(k=this.config.body.modelPath)!=null&&k.includes("movenet")&&(x=this.config.body.enabled?await y1(i.tensor,f):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let c=this.config.hand.maxDetected===-1?_(this.config,{hand:{maxDetected:this.config.face.enabled?2*y.length:1}}):this.config;this.config.async?((F=(z=this.config.hand.detector)==null?void 0:z.modelPath)!=null&&F.includes("handdetect")?d=this.config.hand.enabled?Q5(i.tensor,c):[]:(O=(B=this.config.hand.detector)==null?void 0:B.modelPath)!=null&&O.includes("handtrack")&&(d=this.config.hand.enabled?o1(i.tensor,c):[]),this.performance.hand&&delete this.performance.hand):(r=g(),(Z=(K=this.config.hand.detector)==null?void 0:K.modelPath)!=null&&Z.includes("handdetect")?d=this.config.hand.enabled?await Q5(i.tensor,c):[]:(e0=(S=this.config.hand.detector)==null?void 0:S.modelPath)!=null&&e0.includes("handtrack")&&(d=this.config.hand.enabled?await o1(i.tensor,c):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((R0=this.config.object.modelPath)!=null&&R0.includes("nanodet")?l=this.config.object.enabled?c1(i.tensor,this.config):[]:(T=this.config.object.modelPath)!=null&&T.includes("centernet")&&(l=this.config.object.enabled?z5(i.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(r=g(),(n0=this.config.object.modelPath)!=null&&n0.includes("nanodet")?l=this.config.object.enabled?await c1(i.tensor,this.config):[]:(x0=this.config.object.modelPath)!=null&&x0.includes("centernet")&&(l=this.config.object.enabled?await z5(i.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([y,x,d,l]=await Promise.all([y,x,d,l])),this.state="detect:gesture";let b=[];this.config.gesture.enabled&&(r=g(),b=[...Ro(y),...Po(x),...vo(d),...To(y)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(g()-a):Math.trunc(g()-a);let p=((E=(X=this.process)==null?void 0:X.tensor)==null?void 0:E.shape)||[];this.result={face:y,body:x,hand:d,gesture:b,object:l,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,get persons(){return zo(y,x,d,b,p)}},A.dispose(i.tensor),this.emit("detect"),this.state="idle",n(this.result)})}};Xe=new WeakMap,l2=new WeakMap,y2=new WeakMap,$2=new WeakMap;export{Co as Human,Co as default,ie as defaults,bo as draw,v as env,Eo as match,$5 as models}; //# sourceMappingURL=human.esm-nobundle.js.map diff --git a/dist/human.esm-nobundle.js.map b/dist/human.esm-nobundle.js.map index e8584e19..2b5c34b9 100644 --- a/dist/human.esm-nobundle.js.map +++ b/dist/human.esm-nobundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/util/util.ts", "../src/config.ts", "tfjs.esm.js", "../src/image/imagefxshaders.ts", "../src/image/imagefx.ts", "../src/image/enhance.ts", "../src/image/image.ts", "../src/util/env.ts", "../src/models.ts", "../src/gear/gear.ts", "../src/tfjs/constants.ts", "../src/gear/ssrnet-age.ts", "../src/gear/ssrnet-gender.ts", "../src/face/antispoof.ts", "../src/face/facemeshcoords.ts", "../src/face/facemeshutil.ts", "../src/face/blazeface.ts", "../src/body/blazeposecoords.ts", "../src/body/blazeposedetector.ts", "../src/util/box.ts", "../src/body/blazepose.ts", "../src/object/labels.ts", "../src/object/centernet.ts", "../src/body/efficientposecoords.ts", "../src/body/efficientpose.ts", "../src/gear/emotion.ts", "../src/face/mobilefacenet.ts", "../src/face/insightface.ts", "../src/face/iris.ts", "../src/face/constants.ts", "../src/face/attention.ts", "../src/face/facemesh.ts", "../src/face/faceres.ts", "../src/hand/handposeutil.ts", "../src/hand/handposeanchors.ts", "../src/hand/handposedetector.ts", "../src/hand/handposepipeline.ts", "../src/hand/fingerdef.ts", "../src/hand/fingergesture.ts", "../src/hand/fingerpose.ts", "../src/hand/handpose.ts", "../src/tfjs/humangl.ts", "../src/tfjs/backend.ts", "../src/hand/handtrack.ts", "../src/face/liveness.ts", "../src/body/movenetcoords.ts", "../src/body/movenetfix.ts", "../src/body/movenet.ts", "../src/object/nanodet.ts", "../src/body/posenetutils.ts", "../src/body/posenet.ts", "../src/segmentation/segmentation.ts", "../src/tfjs/load.ts", "../src/draw/draw.ts", "../src/draw/primitives.ts", "../src/draw/options.ts", "../src/draw/face.ts", "../src/draw/body.ts", "../src/draw/hand.ts", "../src/draw/object.ts", "../src/draw/gesture.ts", "../src/face/mask.ts", "../src/face/angles.ts", "../src/face/face.ts", "../src/gesture/gesture.ts", "../src/util/interpolate.ts", "../src/face/match.ts", "../src/util/persons.ts", "../src/sample.ts", "../src/warmup.ts", "../src/human.ts"], - "sourcesContent": ["import type { Config } from '../exports';\n\n/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`modelpath error: expecting json file: ${path}`);\n return path;\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: checks current config validity\nexport function validate(defaults: Partial, config: Partial, parent = 'config', msgs: Array<{ reason: string, where: string, expected?: string }> = []) {\n for (const key of Object.keys(config)) {\n if (typeof config[key] === 'object') {\n validate(defaults[key], config[key], key, msgs);\n } else {\n const defined = defaults && (typeof defaults[key] !== 'undefined');\n if (!defined) msgs.push({ reason: 'unknown property', where: `${parent}.${key} = ${config[key]}` });\n const same = defaults && typeof defaults[key] === typeof config[key];\n if (defined && !same) msgs.push({ reason: 'property type mismatch', where: `${parent}.${key} = ${config[key]}`, expected: typeof defaults[key] });\n }\n // ok = ok && defined && same;\n }\n if (config.debug && parent === 'config' && msgs.length > 0) log('invalid configuration', msgs);\n return msgs;\n}\n\n// helper function: perform deep merge of multiple objects so it allows full inheritance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: Array) => data.reduce((acc: Array, val) => {\n acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n return acc;\n}, []);\n\n// helper function: async wait\nexport async function wait(time: number) {\n const waiting = new Promise((resolve) => { setTimeout(() => resolve(true), time); });\n await waiting;\n}\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/** Generic config type inherited by all module types */\nexport interface GenericConfig {\n /** is module enabled? */\n enabled: boolean,\n /** path to model json file (relative to `modelBasePath` */\n modelPath: string,\n /** how many max frames to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipFrames: number,\n /** how many max milliseconds to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipTime: number,\n}\n\n/** Detector part of face configuration */\nexport interface FaceDetectorConfig extends GenericConfig {\n /** is face rotation correction performed after detecting face?\n * used to correctly analyze faces under high angles\n */\n rotation: boolean,\n /** maximum number of detected faces */\n maxDetected: number,\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected faces before one is discarded */\n iouThreshold: number,\n /** should child models perform on masked image of a face */\n mask: boolean,\n /** should face detection return processed and cropped face tensor that can with an external model for addtional processing?\n * if enabled it must be manually deallocated to avoid memory leak */\n return: boolean,\n}\n\n/** Mesh part of face configuration */\nexport interface FaceMeshConfig extends GenericConfig {\n /** Keep detected faces that cannot be verified using facemesh */\n keepInvalid: boolean\n}\n\n/** Iris part of face configuration */\nexport interface FaceIrisConfig extends GenericConfig {}\n\n/** Attention part of face configuration */\nexport interface FaceAttentionConfig extends GenericConfig {}\n\n/** Description or face embedding part of face configuration\n * - also used by age and gender detection\n */\nexport interface FaceDescriptionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Emotion part of face configuration */\nexport interface FaceEmotionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Anti-spoofing part of face configuration */\nexport interface FaceAntiSpoofConfig extends GenericConfig {}\n\n/** Liveness part of face configuration */\nexport interface FaceLivenessConfig extends GenericConfig {}\n\n/** Gear part of face configuration */\nexport interface FaceGearConfig extends GenericConfig {\n /** minimum confidence for a detected race before results are discarded */\n minConfidence: number,\n}\n\n/** Configures all face-specific options: face detection, mesh analysis, age, gender, emotion detection and face description */\nexport interface FaceConfig extends GenericConfig {\n detector: Partial,\n mesh: Partial,\n attention: Partial,\n iris: Partial,\n description: Partial,\n emotion: Partial,\n antispoof: Partial,\n liveness: Partial,\n gear: Partial,\n}\n\n/** Configures all body detection specific options */\nexport interface BodyConfig extends GenericConfig {\n /** maximum number of detected bodies */\n maxDetected: number,\n /** minimum confidence for a detected body before results are discarded */\n minConfidence: number,\n /* experimental\n /** experimental: detector used for body model before actual analysis\n detector?: {\n /** experimental: enable body detector before body landmarks\n enabled: boolean,\n /** experimental: path to optional body detector model json file\n modelPath: string,\n /** experimental: minimum confidence for a detected body before results are discarded\n minConfidence: number,\n /** experimental: minimum overlap between two detected bodies before one is discarded\n iouThreshold: number\n },\n */\n}\n\n/** Configures all hand detection specific options */\nexport interface HandConfig extends GenericConfig {\n /** should hand rotation correction be performed after hand detection? */\n rotation: boolean,\n /** minimum confidence for a detected hand before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected hands before one is discarded */\n iouThreshold: number,\n /** maximum number of detected hands */\n maxDetected: number,\n /** should hand landmarks be detected or just return detected hand box */\n landmarks: boolean,\n detector: {\n /** path to hand detector model json */\n modelPath?: string,\n },\n skeleton: {\n /** path to hand skeleton model json */\n modelPath?: string,\n },\n}\n\n/** Configures all object detection specific options */\nexport interface ObjectConfig extends GenericConfig {\n /** minimum confidence for a detected objects before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected objects before one is discarded */\n iouThreshold: number,\n /** maximum number of detected objects */\n maxDetected: number,\n}\n\n/** Configures all body segmentation module\n * removes background from input containing person\n * if segmentation is enabled it will run as preprocessing task before any other model\n * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n * remove background or replace it with user-provided background\n*/\nexport interface SegmentationConfig extends GenericConfig {\n /** blur segmentation output by pixels for more realistic image */\n blur: number,\n}\n\n/** Run input through image filters before inference\n * - available only in Browser environments\n * - image filters run with near-zero latency as they are executed on the GPU using WebGL\n*/\nexport interface FilterConfig {\n /** are image filters enabled? */\n enabled: boolean,\n /** perform image histogram equalization\n * - equalization is performed on input as a whole and detected face before its passed for further analysis\n */\n equalization: boolean,\n /** resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** return processed canvas imagedata in result */\n return: boolean,\n /** flip input as mirror image */\n flip: boolean,\n /** range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** image negative */\n negative: boolean,\n /** image sepia colors */\n sepia: boolean,\n /** image vintage colors */\n vintage: boolean,\n /** image kodachrome colors */\n kodachrome: boolean,\n /** image technicolor colors */\n technicolor: boolean,\n /** image polaroid camera effect */\n polaroid: boolean,\n /** range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n}\n\n/** Controlls gesture detection */\nexport interface GestureConfig {\n /** is gesture detection enabled? */\n enabled: boolean,\n}\n/** Possible TensorFlow backends */\nexport type BackendType = ['cpu', 'wasm', 'webgl', 'humangl', 'tensorflow', 'webgpu'];\n\n/** Possible values for `human.warmup` */\nexport type WarmupType = ['' | 'none' | 'face' | 'full' | 'body'];\n\n/**\n * Configuration interface definition for **Human** library\n * Contains all configurable parameters\n * Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\nexport interface Config {\n /** Backend used for TFJS operations\n * valid build-in backends are:\n * - Browser: `cpu`, `wasm`, `webgl`, `humangl`, `webgpu`\n * - NodeJS: `cpu`, `wasm`, `tensorflow`\n * default: `humangl` for browser and `tensorflow` for nodejs\n */\n backend: '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu',\n\n /** Path to *.wasm files if backend is set to `wasm`\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPath: string,\n\n /** Force WASM loader to use platform fetch\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPlatformFetch: boolean,\n\n /** Print debug statements to console\n *\n * default: `true`\n */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially\n *\n * default: `true`\n */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - used by `webgl`, `humangl` and `webgpu` backends\n *\n * default: `full`\n */\n warmup: '' | 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n *\n * default: `../models/` for browsers and `file://models/` for nodejs\n */\n modelBasePath: string,\n\n /** Cache models in IndexDB on first sucessfull load\n * default: true if indexdb is available (browsers), false if its not (nodejs)\n */\n cacheModels: boolean,\n\n /** Validate kernel ops used in model during model load\n * default: true\n * any errors will be printed on console but will be treated as non-fatal\n */\n validateModels: boolean,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n *\n * default: 0.7\n */\n cacheSensitivity: number;\n\n /** Perform immediate garbage collection on deallocated tensors instead of caching them */\n deallocate: boolean;\n\n /** Internal Variable */\n skipAllowed: boolean;\n\n /** Filter config {@link FilterConfig} */\n filter: Partial,\n\n /** Gesture config {@link GestureConfig} */\n gesture: Partial;\n\n /** Face config {@link FaceConfig} */\n face: Partial,\n\n /** Body config {@link BodyConfig} */\n body: Partial,\n\n /** Hand config {@link HandConfig} */\n hand: Partial,\n\n /** Object config {@link ObjectConfig} */\n object: Partial,\n\n /** Segmentation config {@link SegmentationConfig} */\n segmentation: Partial,\n}\n\n/** - [See all default Config values...](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) */\nconst config: Config = {\n backend: '',\n modelBasePath: '',\n cacheModels: true,\n validateModels: true,\n wasmPath: '',\n wasmPlatformFetch: false,\n debug: false,\n async: true,\n warmup: 'full',\n cacheSensitivity: 0.70,\n skipAllowed: false,\n deallocate: false,\n filter: {\n enabled: true,\n equalization: false,\n width: 0,\n height: 0,\n flip: false,\n return: true,\n brightness: 0,\n contrast: 0,\n sharpness: 0,\n blur: 0,\n saturation: 0,\n hue: 0,\n negative: false,\n sepia: false,\n vintage: false,\n kodachrome: false,\n technicolor: false,\n polaroid: false,\n pixelate: 0,\n },\n gesture: {\n enabled: true,\n },\n face: {\n enabled: true,\n detector: {\n modelPath: 'blazeface.json',\n rotation: true,\n maxDetected: 1,\n skipFrames: 99,\n skipTime: 2500,\n minConfidence: 0.2,\n iouThreshold: 0.1,\n mask: false,\n return: false,\n },\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json',\n keepInvalid: false,\n },\n attention: {\n enabled: false,\n modelPath: 'facemesh-attention.json',\n },\n iris: {\n enabled: true,\n modelPath: 'iris.json',\n },\n emotion: {\n enabled: true,\n minConfidence: 0.1,\n skipFrames: 99,\n skipTime: 1500,\n modelPath: 'emotion.json',\n },\n description: {\n enabled: true,\n modelPath: 'faceres.json',\n skipFrames: 99,\n skipTime: 3000,\n minConfidence: 0.1,\n },\n antispoof: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'antispoof.json',\n },\n liveness: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'liveness.json',\n },\n },\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json',\n maxDetected: -1,\n minConfidence: 0.3,\n skipFrames: 1,\n skipTime: 200,\n },\n hand: {\n enabled: true,\n rotation: true,\n skipFrames: 99,\n skipTime: 1000,\n minConfidence: 0.50,\n iouThreshold: 0.2,\n maxDetected: -1,\n landmarks: true,\n detector: {\n modelPath: 'handtrack.json',\n },\n skeleton: {\n modelPath: 'handlandmark-full.json',\n },\n },\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json',\n minConfidence: 0.2,\n iouThreshold: 0.4,\n maxDetected: 10,\n skipFrames: 99,\n skipTime: 2000,\n },\n segmentation: {\n enabled: false,\n modelPath: 'selfie.json',\n blur: 8,\n },\n};\n\nexport { config as defaults };\n", "/*\n Human\n homepage: \n author: '\n*/\n\n// tfjs/tf-browser.ts\nexport * from \"@tensorflow/tfjs/dist/index.js\";\nexport * from \"@tensorflow/tfjs-backend-webgl/dist/index.js\";\n\n// dist/tfjs.version.js\nvar version = \"3.19.0\";\nvar version2 = \"3.19.0\";\nvar version3 = \"3.19.0\";\nvar version4 = \"3.19.0\";\nvar version5 = \"3.19.0\";\nvar version6 = \"3.19.0\";\nvar version7 = \"3.19.0\";\nvar version8 = {\n tfjs: version,\n \"tfjs-core\": version2,\n \"tfjs-data\": version3,\n \"tfjs-layers\": version4,\n \"tfjs-converter\": version5,\n \"tfjs-backend-webgl\": version6,\n \"tfjs-backend-wasm\": version7\n};\n\n// tfjs/tf-browser.ts\nimport { Tensor } from \"@tensorflow/tfjs/dist/index.js\";\nimport { GraphModel } from \"@tensorflow/tfjs-converter/dist/index\";\nexport {\n GraphModel,\n Tensor,\n version8 as version\n};\n", "export const vertexIdentity = `\n precision highp float;\n attribute vec2 pos;\n attribute vec2 uv;\n varying vec2 vUv;\n uniform float flipY;\n void main(void) {\n vUv = uv;\n gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);\n }\n`;\n\nexport const fragmentIdentity = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n void main(void) {\n gl_FragColor = texture2D(texture, vUv);\n }\n`;\n\nexport const colorMatrixWithAlpha = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform float m[20];\n void main(void) {\n vec4 c = texture2D(texture, vUv);\n gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];\n gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];\n gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];\n gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];\n }\n`;\n\nexport const colorMatrixWithoutAlpha = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform float m[20];\n void main(void) {\n vec4 c = texture2D(texture, vUv);\n gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];\n gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];\n gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];\n gl_FragColor.a = c.a;\n }\n`;\n\nexport const pixelate = `\n precision highp float;\n varying vec2 vUv;\n uniform vec2 size;\n uniform sampler2D texture;\n vec2 pixelate(vec2 coord, vec2 size) {\n return floor( coord / size ) * size;\n }\n void main(void) {\n gl_FragColor = vec4(0.0);\n vec2 coord = pixelate(vUv, size);\n gl_FragColor += texture2D(texture, coord);\n }\n`;\n\nexport const blur = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform vec2 px;\n void main(void) {\n gl_FragColor = vec4(0.0);\n gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;\n gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;\n gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;\n gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;\n gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;\n gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;\n gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;\n gl_FragColor += texture2D(texture, vUv )*0.159576912161;\n gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;\n gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;\n gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;\n gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;\n gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;\n gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;\n gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;\n }\n`;\n\nexport const convolution = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform vec2 px;\n uniform float m[9];\n void main(void) {\n vec4 c11 = texture2D(texture, vUv - px); // top left\n vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center\n vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right\n vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left\n vec4 c22 = texture2D(texture, vUv); // mid center\n vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right\n vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left\n vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center\n vec4 c33 = texture2D(texture, vUv + px ); // bottom right\n gl_FragColor = \n c11 * m[0] + c12 * m[1] + c22 * m[2] +\n c21 * m[3] + c22 * m[4] + c23 * m[5] +\n c31 * m[6] + c32 * m[7] + c33 * m[8];\n gl_FragColor.a = c22.a;\n }\n`;\n", "/**\n * Image Filters in WebGL algoritm implementation\n * Based on: [WebGLImageFilter](https://github.com/phoboslab/WebGLImageFilter)\n */\n\nimport * as shaders from './imagefxshaders';\nimport { canvas } from './image';\nimport { log } from '../util/util';\n\nconst collect = (source, prefix, collection) => {\n const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n source.replace(r, (match, name) => {\n collection[name] = 0;\n return match;\n });\n};\n\nclass GLProgram {\n uniform = {};\n attribute = {};\n gl: WebGLRenderingContext;\n id: WebGLProgram;\n\n constructor(gl, vertexSource, fragmentSource) {\n this.gl = gl;\n const vertexShader = this.compile(vertexSource, this.gl.VERTEX_SHADER);\n const fragmentShader = this.compile(fragmentSource, this.gl.FRAGMENT_SHADER);\n this.id = this.gl.createProgram() as WebGLProgram;\n if (!vertexShader || !fragmentShader) return;\n if (!this.id) {\n log('filter: could not create webgl program');\n return;\n }\n this.gl.attachShader(this.id, vertexShader);\n this.gl.attachShader(this.id, fragmentShader);\n this.gl.linkProgram(this.id);\n if (!this.gl.getProgramParameter(this.id, this.gl.LINK_STATUS)) {\n log(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);\n return;\n }\n this.gl.useProgram(this.id);\n collect(vertexSource, 'attribute', this.attribute); // Collect attributes\n for (const a in this.attribute) this.attribute[a] = this.gl.getAttribLocation(this.id, a);\n collect(vertexSource, 'uniform', this.uniform); // Collect uniforms\n collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = this.gl.getUniformLocation(this.id, u);\n }\n\n compile = (source, type): WebGLShader | null => {\n const shader = this.gl.createShader(type) as WebGLShader;\n if (!shader) {\n log('filter: could not create shader');\n return null;\n }\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n log(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader)}`);\n return null;\n }\n return shader;\n };\n}\n\n// function that is instantiated as class so it has private this members\n/**\n * @class GLImageFilter\n * @property {function} reset reset current filter chain\n * @property {function} add add specified filter to filter chain\n * @property {function} apply execute filter chain and draw result\n * @property {function} draw just draw input to result\n */\n\nexport function GLImageFilter() {\n let drawCount = 0;\n let sourceTexture: WebGLTexture | null = null;\n let lastInChain = false;\n let currentFramebufferIndex = -1;\n let tempFramebuffers: [null, null] | [{ fbo: WebGLFramebuffer | null, texture: WebGLTexture | null }] = [null, null];\n let filterChain: Record[] = [];\n let vertexBuffer: WebGLBuffer | null = null;\n let currentProgram: GLProgram | null = null;\n const fxcanvas = canvas(100, 100);\n const shaderProgramCache = { }; // key is the shader program source, value is the compiled program\n const DRAW = { INTERMEDIATE: 1 };\n const gl = fxcanvas.getContext('webgl') as WebGLRenderingContext;\n if (!gl) {\n log('filter: cannot get webgl context');\n return;\n }\n // @ts-ignore used for sanity checks outside of imagefx\n this.gl = gl;\n\n function resize(width, height) {\n if (width === fxcanvas.width && height === fxcanvas.height) return; // Same width/height? Nothing to do here\n fxcanvas.width = width;\n fxcanvas.height = height;\n if (!vertexBuffer) { // Create the context if we don't have it yet\n const vertices = new Float32Array([-1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0]); // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n vertexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n }\n gl.viewport(0, 0, fxcanvas.width, fxcanvas.height);\n tempFramebuffers = [null, null]; // Delete old temp framebuffers\n }\n\n function createFramebufferTexture(width, height) {\n const fbo = gl.createFramebuffer() as WebGLFramebuffer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture() as WebGLTexture;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { fbo, texture };\n }\n\n function getTempFramebuffer(index): { fbo: WebGLFramebuffer | null, texture: WebGLTexture | null } {\n tempFramebuffers[index] = tempFramebuffers[index] || createFramebufferTexture(fxcanvas.width, fxcanvas.height);\n return tempFramebuffers[index] as { fbo: WebGLFramebuffer, texture: WebGLTexture };\n }\n\n function draw(flags = 0) {\n if (!currentProgram) return;\n let source: WebGLTexture | null = null;\n let target: WebGLFramebuffer | null = null;\n let flipY = false;\n if (drawCount === 0) source = sourceTexture; // First draw call - use the source texture\n else source = getTempFramebuffer(currentFramebufferIndex).texture || null; // All following draw calls use the temp buffer last drawn to\n drawCount++;\n if (lastInChain && !(flags & DRAW.INTERMEDIATE)) { // Last filter in our chain - draw directly to the WebGL Canvas. We may also have to flip the image vertically now\n target = null;\n flipY = drawCount % 2 === 0;\n } else {\n currentFramebufferIndex = (currentFramebufferIndex + 1) % 2;\n target = getTempFramebuffer(currentFramebufferIndex).fbo || null; // Intermediate draw call - get a temp buffer to draw to\n }\n gl.bindTexture(gl.TEXTURE_2D, source); // Bind the source and target and draw the two triangles\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.uniform1f(currentProgram.uniform['flipY'], (flipY ? -1 : 1));\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n\n function compileShader(fragmentSource): GLProgram | null {\n if (shaderProgramCache[fragmentSource]) {\n currentProgram = shaderProgramCache[fragmentSource];\n gl.useProgram((currentProgram ? currentProgram.id : null) || null);\n return currentProgram as GLProgram;\n }\n currentProgram = new GLProgram(gl, shaders.vertexIdentity, fragmentSource);\n if (!currentProgram) {\n log('filter: could not get webgl program');\n return null;\n }\n const floatSize = Float32Array.BYTES_PER_ELEMENT;\n const vertSize = 4 * floatSize;\n gl.enableVertexAttribArray(currentProgram.attribute['pos']);\n gl.vertexAttribPointer(currentProgram.attribute['pos'], 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n gl.enableVertexAttribArray(currentProgram.attribute['uv']);\n gl.vertexAttribPointer(currentProgram.attribute['uv'], 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n shaderProgramCache[fragmentSource] = currentProgram;\n return currentProgram as GLProgram;\n }\n\n const filter = {\n colorMatrix: (matrix) => { // general color matrix filter\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0) // Can we ignore the alpha value? Makes things a bit faster.\n ? shaders.colorMatrixWithoutAlpha\n : shaders.colorMatrixWithAlpha;\n const program = compileShader(shader);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n draw();\n },\n\n brightness: (brightness) => {\n const b = (brightness || 0) + 1;\n filter.colorMatrix([\n b, 0, 0, 0, 0,\n 0, b, 0, 0, 0,\n 0, 0, b, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n saturation: (amount) => {\n const x = (amount || 0) * 2 / 3 + 1;\n const y = ((x - 1) * -0.5);\n filter.colorMatrix([\n x, y, y, 0, 0,\n y, x, y, 0, 0,\n y, y, x, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n desaturate: () => {\n filter.saturation(-1);\n },\n\n contrast: (amount) => {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n filter.colorMatrix([\n v, 0, 0, 0, o,\n 0, v, 0, 0, o,\n 0, 0, v, 0, o,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n negative: () => {\n filter.contrast(-2);\n },\n\n hue: (rotation) => {\n rotation = (rotation || 0) / 180 * Math.PI;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const lumR = 0.213;\n const lumG = 0.715;\n const lumB = 0.072;\n filter.colorMatrix([\n lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n desaturateLuminance: () => {\n filter.colorMatrix([\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n sepia: () => {\n filter.colorMatrix([\n 0.393, 0.7689999, 0.18899999, 0, 0,\n 0.349, 0.6859999, 0.16799999, 0, 0,\n 0.272, 0.5339999, 0.13099999, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n brownie: () => {\n filter.colorMatrix([\n 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n vintagePinhole: () => {\n filter.colorMatrix([\n 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n kodachrome: () => {\n filter.colorMatrix([\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n technicolor: () => {\n filter.colorMatrix([\n 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n polaroid: () => {\n filter.colorMatrix([\n 1.438, -0.062, -0.062, 0, 0,\n -0.122, 1.378, -0.122, 0, 0,\n -0.016, -0.016, 1.483, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n shiftToBGR: () => {\n filter.colorMatrix([\n 0, 0, 1, 0, 0,\n 0, 1, 0, 0, 0,\n 1, 0, 0, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n convolution: (matrix) => { // general convolution Filter\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / fxcanvas.width;\n const pixelSizeY = 1 / fxcanvas.height;\n const program = compileShader(shaders.convolution);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n gl.uniform2f(program.uniform['px'], pixelSizeX, pixelSizeY);\n draw();\n },\n\n detectEdges: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n },\n\n sobelX: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n },\n\n sobelY: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n },\n\n sharpen: (amount) => {\n const a = amount || 1;\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, -1 * a, 0,\n -1 * a, 1 + 4 * a, -1 * a,\n 0, -1 * a, 0,\n ]);\n },\n\n emboss: (size) => {\n const s = size || 1;\n // @ts-ignore this\n filter.convolution.call(this, [\n -2 * s, -1 * s, 0,\n -1 * s, 1, 1 * s,\n 0, 1 * s, 2 * s,\n ]);\n },\n\n blur: (size) => {\n const blurSizeX = (size / 7) / fxcanvas.width;\n const blurSizeY = (size / 7) / fxcanvas.height;\n const program = compileShader(shaders.blur);\n if (!program) return;\n // Vertical\n gl.uniform2f(program.uniform['px'], 0, blurSizeY);\n draw(DRAW.INTERMEDIATE);\n // Horizontal\n gl.uniform2f(program.uniform['px'], blurSizeX, 0);\n draw();\n },\n\n pixelate: (size) => {\n const blurSizeX = (size) / fxcanvas.width;\n const blurSizeY = (size) / fxcanvas.height;\n const program = compileShader(shaders.pixelate);\n if (!program) return;\n gl.uniform2f(program.uniform['size'], blurSizeX, blurSizeY);\n draw();\n },\n };\n\n // @ts-ignore this\n this.add = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const func = filter[name];\n filterChain.push({ func, args });\n };\n\n // @ts-ignore this\n this.reset = function () {\n filterChain = [];\n };\n\n // @ts-ignore this\n this.get = function () {\n return filterChain;\n };\n\n // @ts-ignore this\n this.apply = function (image) {\n resize(image.width, image.height);\n drawCount = 0;\n if (!sourceTexture) sourceTexture = gl.createTexture(); // Create the texture for the input image if we haven't yet\n gl.bindTexture(gl.TEXTURE_2D, sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n for (let i = 0; i < filterChain.length; i++) {\n lastInChain = (i === filterChain.length - 1);\n const f = filterChain[i];\n // @ts-ignore function assigment\n f.func.apply(this, f.args || []);\n }\n return fxcanvas;\n };\n\n // @ts-ignore this\n this.draw = function (image) {\n this.add('brightness', 0);\n return this.apply(image);\n };\n}\n", "/**\n * Image enhancements\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../exports';\n\nexport async function histogramEqualization(inputImage: Tensor): Promise {\n // const maxValue = 254; // using 255 results in values slightly larger than 1 due to math rounding errors\n const squeeze = inputImage.shape.length === 4 ? tf.squeeze(inputImage) : inputImage;\n const channels = tf.split(squeeze, 3, 2);\n const min: Tensor[] = [tf.min(channels[0]), tf.min(channels[1]), tf.min(channels[2])];\n const max: Tensor[] = [tf.max(channels[0]), tf.max(channels[1]), tf.max(channels[2])];\n const absMax = await Promise.all(max.map((channel) => channel.data()));\n const maxValue = 0.99 * Math.max(absMax[0][0], absMax[1][0], absMax[2][0]);\n const sub = [tf.sub(channels[0], min[0]), tf.sub(channels[1], min[1]), tf.sub(channels[2], min[2])];\n const range = [tf.sub(max[0], min[0]), tf.sub(max[1], min[1]), tf.sub(max[2], min[2])];\n const fact = [tf.div(maxValue, range[0]), tf.div(maxValue, range[1]), tf.div(maxValue, range[2])];\n const enh = [tf.mul(sub[0], fact[0]), tf.mul(sub[1], fact[1]), tf.mul(sub[2], fact[2])];\n const rgb = tf.stack([enh[0], enh[1], enh[2]], 2);\n const reshape = tf.reshape(rgb, [1, squeeze.shape[0], squeeze.shape[1], 3]);\n tf.dispose([...channels, ...min, ...max, ...sub, ...range, ...fact, ...enh, rgb, squeeze]);\n return reshape; // output shape is [1, height, width, 3]\n}\n", "/**\n * Image Processing algorithm implementation\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport type { Input, AnyCanvas, Tensor, Config } from '../exports';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport * as enhance from './enhance';\n\nconst maxSize = 3840;\n// internal temp canvases\nlet inCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet outCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet tmpCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\n// @ts-ignore // imagefx is js module that should be converted to a class\nlet fx: fxImage.GLImageFilter | null; // instance of imagefx\n\nconst last: { inputSum: number, cacheDiff: number, sumMethod: number, inputTensor: undefined | Tensor } = {\n inputSum: 0,\n cacheDiff: 1,\n sumMethod: 0,\n inputTensor: undefined,\n};\n\nexport function canvas(width: number, height: number): AnyCanvas {\n let c;\n if (env.browser) { // browser defines canvas object\n if (env.worker) { // if runing in web worker use OffscreenCanvas\n if (typeof OffscreenCanvas === 'undefined') throw new Error('canvas error: attempted to run in web worker but OffscreenCanvas is not supported');\n c = new OffscreenCanvas(width, height);\n } else { // otherwise use DOM canvas\n if (typeof document === 'undefined') throw new Error('canvas error: attempted to run in browser but DOM is not defined');\n c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n }\n } else { // if not running in browser, there is no \"default\" canvas object, so we need monkey patch or fail\n // @ts-ignore // env.canvas is an external monkey-patch\n if (typeof env.Canvas !== 'undefined') c = new env.Canvas(width, height);\n else if (typeof globalThis.Canvas !== 'undefined') c = new globalThis.Canvas(width, height);\n // else throw new Error('canvas error: attempted to use canvas in nodejs without canvas support installed');\n }\n return c;\n}\n\n// helper function to copy canvas from input to output\nexport function copy(input: AnyCanvas, output?: AnyCanvas) {\n const outputCanvas = output || canvas(input.width, input.height);\n const ctx = outputCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctx.drawImage(input, 0, 0);\n return outputCanvas;\n}\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport async function process(input: Input, config: Config, getTensor: boolean = true): Promise<{ tensor: Tensor | null, canvas: AnyCanvas | null }> {\n if (!input) {\n // throw new Error('input is missing');\n if (config.debug) log('input error: input is missing');\n return { tensor: null, canvas: null }; // video may become temporarily unavailable due to onresize\n }\n // sanity checks since different browsers do not implement all dom elements\n if (\n !(input instanceof tf.Tensor)\n && !(typeof Image !== 'undefined' && input instanceof Image)\n && !(typeof env.Canvas !== 'undefined' && input instanceof env.Canvas)\n && !(typeof globalThis.Canvas !== 'undefined' && input instanceof globalThis.Canvas)\n && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n ) {\n throw new Error('input error: type is not recognized');\n }\n if (input instanceof tf.Tensor) { // if input is tensor use as-is without filters but correct shape as needed\n let tensor: Tensor | null = null;\n if ((input as Tensor)['isDisposedInternal']) throw new Error('input error: attempted to use tensor but it is disposed');\n if (!(input as Tensor)['shape']) throw new Error('input error: attempted to use tensor without a shape');\n if ((input as Tensor).shape.length === 3) { // [height, width, 3 || 4]\n if ((input as Tensor).shape[2] === 3) { // [height, width, 3] so add batch\n tensor = tf.expandDims(input, 0);\n } else if ((input as Tensor).shape[2] === 4) { // [height, width, 4] so strip alpha and add batch\n const rgb = tf.slice3d(input, [0, 0, 0], [-1, -1, 3]);\n tensor = tf.expandDims(rgb, 0);\n tf.dispose(rgb);\n }\n } else if ((input as Tensor).shape.length === 4) { // [1, width, height, 3 || 4]\n if ((input as Tensor).shape[3] === 3) { // [1, width, height, 3] just clone\n tensor = tf.clone(input);\n } else if ((input as Tensor).shape[3] === 4) { // [1, width, height, 4] so strip alpha\n tensor = tf.slice4d(input, [0, 0, 0, 0], [-1, -1, -1, 3]);\n }\n }\n // at the end shape must be [1, height, width, 3]\n if (tensor == null || tensor.shape.length !== 4 || tensor.shape[0] !== 1 || tensor.shape[3] !== 3) throw new Error(`input error: attempted to use tensor with unrecognized shape: ${input['shape']}`);\n if ((tensor as Tensor).dtype === 'int32') {\n const cast = tf.cast(tensor, 'float32');\n tf.dispose(tensor);\n tensor = cast;\n }\n return { tensor, canvas: (config.filter.return ? outCanvas : null) };\n } else {\n // check if resizing will be needed\n if (typeof input['readyState'] !== 'undefined' && input['readyState'] <= 2) {\n if (config.debug) log('input stream is not ready');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n if (!originalWidth || !originalHeight) {\n if (config.debug) log('cannot determine input dimensions');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = Math.trunc(targetWidth * originalHeight / originalWidth);\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = Math.trunc(targetHeight * originalWidth / originalHeight);\n }\n\n // create our canvas and resize it if needed\n if ((config.filter.width || 0) > 0) targetWidth = config.filter.width;\n else if ((config.filter.height || 0) > 0) targetWidth = originalWidth * ((config.filter.height || 0) / originalHeight);\n if ((config.filter.height || 0) > 0) targetHeight = config.filter.height;\n else if ((config.filter.width || 0) > 0) targetHeight = originalHeight * ((config.filter.width || 0) / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('input error: cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) inCanvas = canvas(targetWidth, targetHeight);\n\n // draw input to our canvas\n const inCtx = inCanvas.getContext('2d') as CanvasRenderingContext2D;\n if ((typeof ImageData !== 'undefined') && (input instanceof ImageData)) {\n inCtx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof inCtx.translate !== 'undefined') {\n inCtx.translate(originalWidth, 0);\n inCtx.scale(-1, 1);\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n inCtx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n if (!outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) outCanvas = canvas(inCanvas.width, inCanvas.height); // init output canvas\n\n // imagefx transforms using gl from input canvas to output canvas\n if (config.filter.enabled && env.webgl.supported) {\n if (!fx) fx = env.browser ? new fxImage.GLImageFilter() : null; // && (typeof document !== 'undefined')\n env.filter = !!fx;\n if (!fx || !fx.add) {\n if (config.debug) log('input process error: cannot initialize filters');\n env.webgl.supported = false;\n config.filter.enabled = false;\n copy(inCanvas, outCanvas); // filter failed to initialize\n // return { tensor: null, canvas: inCanvas };\n } else {\n fx.reset();\n if (config.filter.brightness !== 0) fx.add('brightness', config.filter.brightness);\n if (config.filter.contrast !== 0) fx.add('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.add('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.add('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.add('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.add('hue', config.filter.hue);\n if (config.filter.negative) fx.add('negative');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.vintage) fx.add('brownie');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.kodachrome) fx.add('kodachrome');\n if (config.filter.technicolor) fx.add('technicolor');\n if (config.filter.polaroid) fx.add('polaroid');\n if (config.filter.pixelate !== 0) fx.add('pixelate', config.filter.pixelate);\n if (fx.get() > 0) outCanvas = fx.apply(inCanvas);\n else outCanvas = fx.draw(inCanvas);\n }\n } else {\n copy(inCanvas, outCanvas); // if no filters applied, output canvas is input canvas\n if (fx) fx = null;\n env.filter = !!fx;\n }\n\n if (!getTensor) return { tensor: null, canvas: outCanvas }; // just canvas was requested\n if (!outCanvas) throw new Error('canvas error: cannot create output');\n\n // create tensor from image unless input was a tensor already\n let pixels;\n let depth = 3;\n if ((typeof ImageData !== 'undefined' && input instanceof ImageData) || (input['data'] && input['width'] && input['height'])) { // if input is imagedata, just use it\n if (env.browser && tf.browser) {\n pixels = tf.browser ? tf.browser.fromPixels(input) : null;\n } else {\n depth = input['data'].length / input['height'] / input['width'];\n // const arr = Uint8Array.from(input['data']);\n const arr = new Uint8Array(input['data']['buffer']);\n pixels = tf.tensor(arr, [input['height'], input['width'], depth], 'int32');\n }\n } else {\n if (!tmpCanvas || (outCanvas.width !== tmpCanvas.width) || (outCanvas.height !== tmpCanvas.height)) tmpCanvas = canvas(outCanvas.width, outCanvas.height); // init output canvas\n if (tf.browser && env.browser) {\n if (config.backend === 'webgl' || config.backend === 'humangl' || config.backend === 'webgpu') {\n pixels = tf.browser.fromPixels(outCanvas); // safe to reuse since both backend and context are gl based\n } else {\n tmpCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n pixels = tf.browser.fromPixels(tmpCanvas);\n }\n } else {\n const tempCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n const tempCtx = tempCanvas.getContext('2d') as CanvasRenderingContext2D;\n const tempData = tempCtx.getImageData(0, 0, targetWidth, targetHeight);\n depth = tempData.data.length / targetWidth / targetHeight;\n const arr = new Uint8Array(tempData.data.buffer);\n pixels = tf.tensor(arr, [targetWidth, targetHeight, depth]);\n }\n }\n if (depth === 4) { // rgba to rgb\n const rgb = tf.slice3d(pixels, [0, 0, 0], [-1, -1, 3]); // strip alpha channel\n tf.dispose(pixels);\n pixels = rgb;\n }\n if (!pixels) throw new Error('input error: cannot create tensor');\n const casted = tf.cast(pixels, 'float32');\n const tensor = config.filter.equalization ? await enhance.histogramEqualization(casted) : tf.expandDims(casted, 0);\n tf.dispose([pixels, casted]);\n return { tensor, canvas: (config.filter.return ? outCanvas : null) };\n }\n}\n\n/*\nconst checksum = async (input: Tensor): Promise => { // use tf sum or js based sum loop depending on which is faster\n const resizeFact = 48;\n const reduced: Tensor = tf.image.resizeBilinear(input, [Math.trunc((input.shape[1] || 1) / resizeFact), Math.trunc((input.shape[2] || 1) / resizeFact)]);\n const tfSum = async (): Promise => {\n const sumT = tf.sum(reduced);\n const sum0 = await sumT.data();\n tf.dispose(sumT);\n return sum0[0];\n };\n const jsSum = async (): Promise => {\n const reducedData = await reduced.data(); // raw image rgb array\n let sum0 = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum0 += reducedData[3 * i + 2]; // look only at green value of each pixel\n return sum0;\n };\n if (last.sumMethod === 0) {\n const t0 = now();\n await jsSum();\n const t1 = now();\n await tfSum();\n const t2 = now();\n last.sumMethod = t1 - t0 < t2 - t1 ? 1 : 2;\n }\n const res = last.sumMethod === 1 ? await jsSum() : await tfSum();\n tf.dispose(reduced);\n return res;\n};\n*/\n\nexport async function skip(config: Partial, input: Tensor) {\n let skipFrame = false;\n if (config.cacheSensitivity === 0 || !input.shape || input.shape.length !== 4 || input.shape[1] > 2048 || input.shape[2] > 2048) return skipFrame; // cache disabled or input is invalid or too large for cache analysis\n\n /*\n const checkSum = await checksum(input);\n const diff = 100 * (Math.max(checkSum, last.inputSum) / Math.min(checkSum, last.inputSum) - 1);\n last.inputSum = checkSum;\n // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n let skipFrame = diff < Math.max(config.cacheSensitivity, last.cacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n last.cacheDiff = diff > 10 * config.cacheSensitivity ? 0 : diff;\n skipFrame = skipFrame && (last.cacheDiff > 0); // if no cached diff value then force no skip\n */\n\n if (!last.inputTensor) {\n last.inputTensor = tf.clone(input);\n } else if (last.inputTensor.shape[1] !== input.shape[1] || last.inputTensor.shape[2] !== input.shape[2]) { // input resolution changed\n tf.dispose(last.inputTensor);\n last.inputTensor = tf.clone(input);\n } else {\n const t: Record = {};\n t.diff = tf.sub(input, last.inputTensor);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input.shape[1] || 1) / (input.shape[2] || 1) / 255 / 3; // squared difference relative to input resolution and averaged per channel\n tf.dispose([last.inputTensor, t.diff, t.squared, t.sum]);\n last.inputTensor = tf.clone(input);\n skipFrame = diffRelative <= (config.cacheSensitivity || 0);\n }\n return skipFrame;\n}\n\nexport async function compare(config: Partial, input1: Tensor, input2: Tensor): Promise {\n const t: Record = {};\n if (!input1 || !input2 || input1.shape.length !== 4 || input1.shape.length !== input2.shape.length) {\n if (!config.debug) log('invalid input tensor or tensor shapes do not match:', input1.shape, input2.shape);\n return 0;\n }\n if (input1.shape[0] !== 1 || input2.shape[0] !== 1 || input1.shape[3] !== 3 || input2.shape[3] !== 3) {\n if (!config.debug) log('input tensors must be of shape [1, height, width, 3]:', input1.shape, input2.shape);\n return 0;\n }\n t.input1 = tf.clone(input1);\n t.input2 = (input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2]) ? tf.image.resizeBilinear(input2, [input1.shape[1], input1.shape[2]]) : tf.clone(input2);\n t.diff = tf.sub(t.input1, t.input2);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input1.shape[1] || 1) / (input1.shape[2] || 1) / 255 / 3;\n tf.dispose([t.input1, t.input2, t.diff, t.squared, t.sum]);\n return diffRelative;\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\n\n/** Env class that holds detected capabilities */\nexport class Env {\n /** Running in Browser */\n browser: boolean;\n /** Running in NodeJS */\n node: boolean;\n /** Running in WebWorker thread */\n worker: boolean;\n /** Detected platform */\n platform: string = '';\n /** Detected agent */\n agent: string = '';\n /** List of supported backends */\n backends: string[] = [];\n /** Has any work been performed so far */\n initial: boolean;\n /** Are image filters supported? */\n filter: boolean | undefined;\n /** TFJS instance details */\n tfjs: {\n version: undefined | string,\n };\n /** Is offscreenCanvas supported? */\n offscreen: undefined | boolean;\n /** Are performance counter instant values or additive */\n perfadd: boolean = false;\n /** WASM detected capabilities */\n wasm: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n simd: undefined | boolean,\n multithread: undefined | boolean,\n } = {\n supported: undefined,\n backend: undefined,\n simd: undefined,\n multithread: undefined,\n };\n /** WebGL detected capabilities */\n webgl: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n version: undefined | string,\n renderer: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n version: undefined,\n renderer: undefined,\n };\n /** WebGPU detected capabilities */\n webgpu: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n adapter: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n adapter: undefined,\n };\n /** CPU info */\n cpu: {\n model: undefined | string,\n flags: string[],\n } = {\n model: undefined,\n flags: [],\n };\n /** List of supported kernels for current backend */\n kernels: string[] = [];\n /** MonkeyPatch for Canvas */\n Canvas: undefined;\n /** MonkeyPatch for Image */\n Image: undefined;\n /** MonkeyPatch for ImageData */\n ImageData: undefined;\n\n constructor() {\n this.browser = typeof navigator !== 'undefined';\n this.node = (typeof process !== 'undefined') && (typeof process.versions !== 'undefined') && (typeof process.versions.node !== 'undefined');\n this.tfjs = { version: tf.version['tfjs-core'] };\n this.offscreen = typeof OffscreenCanvas !== 'undefined';\n this.initial = true;\n // @ts-ignore WorkerGlobalScope evaluated in browser only\n this.worker = this.browser && this.offscreen ? (typeof WorkerGlobalScope !== 'undefined') : undefined;\n if (typeof navigator !== 'undefined') {\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw && raw[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n this.platform = (platformMatch && platformMatch[0]) ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n this.agent = navigator.userAgent.replace(raw[0], '');\n if (this.platform[1]) this.agent = this.agent.replace(raw[1], '');\n this.agent = this.agent.replace(/ /g, ' ');\n // chrome offscreencanvas gpu memory leak\n /*\n const isChrome = env.agent.match(/Chrome\\/.[0-9]/g);\n const verChrome = isChrome && isChrome[0] ? isChrome[0].split('/')[1] : 0;\n if (verChrome > 92 && verChrome < 96) {\n log('disabling offscreenCanvas due to browser error:', isChrome ? isChrome[0] : 'unknown');\n this.offscreen = false;\n }\n */\n }\n } else if (typeof process !== 'undefined') {\n this.platform = `${process.platform} ${process.arch}`;\n this.agent = `NodeJS ${process.version}`;\n }\n }\n\n /** update backend information */\n async updateBackend() {\n // analyze backends\n this.backends = Object.keys(tf.engine().registryFactory);\n this.wasm.supported = typeof WebAssembly !== 'undefined';\n this.wasm.backend = this.backends.includes('wasm');\n if (this.wasm.supported && this.wasm.backend && tf.getBackend() === 'wasm') {\n this.wasm.simd = tf.env().get('WASM_HAS_SIMD_SUPPORT');\n this.wasm.multithread = tf.env().get('WASM_HAS_MULTITHREAD_SUPPORT');\n }\n const c = image.canvas(100, 100);\n const ctx = c ? c.getContext('webgl2') : undefined; // causes too many gl contexts\n // const ctx = typeof tf.backend().getGPGPUContext !== undefined ? tf.backend().getGPGPUContext : null;\n this.webgl.supported = typeof ctx !== 'undefined';\n this.webgl.backend = this.backends.includes('webgl');\n if (this.webgl.supported && this.webgl.backend && (tf.getBackend() === 'webgl' || tf.getBackend() === 'humangl')) {\n // @ts-ignore getGPGPUContext only exists on WebGL backend\n const gl = tf.backend().gpgpu !== 'undefined' ? await tf.backend().getGPGPUContext().gl : null;\n if (gl) {\n this.webgl.version = gl.getParameter(gl.VERSION);\n this.webgl.renderer = gl.getParameter(gl.RENDERER);\n }\n }\n // @ts-ignore navigator.gpu is only defined when webgpu is available in browser\n this.webgpu.supported = this.browser && typeof navigator['gpu'] !== 'undefined';\n this.webgpu.backend = this.backends.includes('webgpu');\n try {\n // @ts-ignore navigator.gpu is only defined when webgpu is available in browser\n if (this.webgpu.supported) this.webgpu.adapter = (await navigator['gpu'].requestAdapter()).name;\n } catch {\n this.webgpu.supported = false;\n }\n try {\n this.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase());\n } catch { /**/ }\n }\n\n /** update cpu information */\n updateCPU() {\n const cpu = { model: '', flags: [] };\n if (this.node && this.platform.startsWith('linux')) {\n /*\n const fs = require('fs');\n try {\n const data = fs.readFileSync('/proc/cpuinfo').toString();\n for (const line of data.split('\\n')) {\n if (line.startsWith('model name')) cpu.model = line.match(/:(.*)/g)[0].replace(':', '').trim();\n if (line.startsWith('flags')) cpu.flags = line.match(/:(.*)/g)[0].replace(':', '').trim().split(' ').sort();\n }\n } catch { }\n */\n }\n if (!this['cpu']) Object.defineProperty(this, 'cpu', { value: cpu });\n else this['cpu'] = cpu;\n }\n}\n\nexport const env = new Env();\n", "/**\n * Loader and Validator for all models used by Human\n */\n\nimport { env } from './util/env';\nimport { log } from './util/util';\nimport * as gear from './gear/gear';\nimport * as ssrnetAge from './gear/ssrnet-age';\nimport * as ssrnetGender from './gear/ssrnet-gender';\nimport * as antispoof from './face/antispoof';\nimport * as blazeface from './face/blazeface';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as efficientpose from './body/efficientpose';\nimport * as emotion from './gear/emotion';\nimport * as mobilefacenet from './face/mobilefacenet';\nimport * as insightface from './face/insightface';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as iris from './face/iris';\nimport * as liveness from './face/liveness';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as posenet from './body/posenet';\nimport * as segmentation from './segmentation/segmentation';\nimport { modelStats, ModelInfo } from './tfjs/load';\nimport type { GraphModel } from './tfjs/types';\nimport type { Human } from './human';\n\n/** Instances of all possible TFJS Graph Models used by Human\n * - loaded as needed based on configuration\n * - initialized explictly with `human.load()` method\n * - initialized implicity on first call to `human.detect()`\n * - each model can be `null` if not loaded, instance of `GraphModel` if loaded or `Promise` if loading\n */\nexport class Models {\n ssrnetage: null | GraphModel | Promise = null;\n gear: null | GraphModel | Promise = null;\n blazeposedetect: null | GraphModel | Promise = null;\n blazepose: null | GraphModel | Promise = null;\n centernet: null | GraphModel | Promise = null;\n efficientpose: null | GraphModel | Promise = null;\n mobilefacenet: null | GraphModel | Promise = null;\n insightface: null | GraphModel | Promise = null;\n emotion: null | GraphModel | Promise = null;\n facedetect: null | GraphModel | Promise = null;\n faceiris: null | GraphModel | Promise = null;\n facemesh: null | GraphModel | Promise = null;\n faceres: null | GraphModel | Promise = null;\n ssrnetgender: null | GraphModel | Promise = null;\n handpose: null | GraphModel | Promise = null;\n handskeleton: null | GraphModel | Promise = null;\n handtrack: null | GraphModel | Promise = null;\n liveness: null | GraphModel | Promise = null;\n movenet: null | GraphModel | Promise = null;\n nanodet: null | GraphModel | Promise = null;\n posenet: null | GraphModel | Promise = null;\n segmentation: null | GraphModel | Promise = null;\n antispoof: null | GraphModel | Promise = null;\n}\n\nexport type ModelStats = {\n numLoadedModels: number,\n numEnabledModels: undefined,\n numDefinedModels: number,\n percentageLoaded: number,\n totalSizeFromManifest: number,\n totalSizeWeights: number,\n totalSizeLoading: number,\n totalSizeEnabled: undefined,\n modelStats: ModelInfo[],\n}\n\nexport const getModelStats = (instance: Human): ModelStats => {\n let totalSizeFromManifest = 0;\n let totalSizeWeights = 0;\n let totalSizeLoading = 0;\n for (const m of Object.values(modelStats)) {\n totalSizeFromManifest += m.sizeFromManifest;\n totalSizeWeights += m.sizeLoadedWeights;\n totalSizeLoading += m.sizeDesired;\n }\n const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0;\n return {\n numLoadedModels: Object.values(modelStats).length,\n numEnabledModels: undefined,\n numDefinedModels: Object.keys(instance.models).length,\n percentageLoaded,\n totalSizeFromManifest,\n totalSizeWeights,\n totalSizeLoading,\n totalSizeEnabled: undefined,\n modelStats: Object.values(modelStats),\n };\n};\n\nexport function reset(instance: Human): void {\n // if (instance.config.debug) log('resetting loaded models');\n for (const model of Object.keys(instance.models)) instance.models[model as keyof Models] = null;\n}\n\n/** Load method preloads all instance.configured models on-demand */\nexport async function load(instance: Human): Promise {\n if (env.initial) reset(instance);\n if (instance.config.hand.enabled) { // handpose model is a combo that must be loaded as a whole\n if (!instance.models.handpose && instance.config.hand.detector?.modelPath?.includes('handdetect')) {\n [instance.models.handpose, instance.models.handskeleton] = await handpose.load(instance.config);\n }\n if (!instance.models.handskeleton && instance.config.hand.landmarks && instance.config.hand.detector?.modelPath?.includes('handdetect')) {\n [instance.models.handpose, instance.models.handskeleton] = await handpose.load(instance.config);\n }\n }\n if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body?.modelPath?.includes('blazepose')) instance.models.blazepose = blazepose.loadPose(instance.config);\n // @ts-ignore optional model\n if (instance.config.body.enabled && !instance.models.blazeposedetect && instance.config.body['detector'] && instance.config.body['detector']['modelPath']) instance.models.blazeposedetect = blazepose.loadDetect(instance.config);\n if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body?.modelPath?.includes('efficientpose')) instance.models.efficientpose = efficientpose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.movenet && instance.config.body?.modelPath?.includes('movenet')) instance.models.movenet = movenet.load(instance.config);\n if (instance.config.body.enabled && !instance.models.posenet && instance.config.body?.modelPath?.includes('posenet')) instance.models.posenet = posenet.load(instance.config);\n if (instance.config.face.enabled && !instance.models.facedetect) instance.models.facedetect = blazeface.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.antispoof?.enabled && !instance.models.antispoof) instance.models.antispoof = antispoof.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.liveness?.enabled && !instance.models.liveness) instance.models.liveness = liveness.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.description?.enabled && !instance.models.faceres) instance.models.faceres = faceres.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.emotion?.enabled && !instance.models.emotion) instance.models.emotion = emotion.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.iris?.enabled && !instance.config.face.attention?.enabled && !instance.models.faceiris) instance.models.faceiris = iris.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.mesh?.enabled && !instance.models.facemesh) instance.models.facemesh = facemesh.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['gear']?.enabled && !instance.models.gear) instance.models.gear = gear.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetage) instance.models.ssrnetage = ssrnetAge.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetgender) instance.models.ssrnetgender = ssrnetGender.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['mobilefacenet']?.enabled && !instance.models.mobilefacenet) instance.models.mobilefacenet = mobilefacenet.load(instance.config);\n if (instance.config.face.enabled && instance.config.face['insightface']?.enabled && !instance.models.insightface) instance.models.insightface = insightface.load(instance.config);\n if (instance.config.hand.enabled && !instance.models.handtrack && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handtrack = handtrack.loadDetect(instance.config);\n if (instance.config.hand.enabled && instance.config.hand.landmarks && !instance.models.handskeleton && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handskeleton = handtrack.loadSkeleton(instance.config);\n if (instance.config.object.enabled && !instance.models.centernet && instance.config.object?.modelPath?.includes('centernet')) instance.models.centernet = centernet.load(instance.config);\n if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object?.modelPath?.includes('nanodet')) instance.models.nanodet = nanodet.load(instance.config);\n if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = segmentation.load(instance.config);\n\n // models are loaded in parallel asynchronously so lets wait until they are actually loaded\n for await (const model of Object.keys(instance.models)) {\n if (instance.models[model as keyof Models] && typeof instance.models[model as keyof Models] !== 'undefined') {\n instance.models[model as keyof Models] = await instance.models[model as keyof Models];\n }\n }\n}\n\nlet instance: Human;\ntype Missing = { name: string, url: string, missing: string[], ops: string[] }\n\nexport function validateModel(newInstance: Human | null, model: GraphModel | null, name: string): Missing | null {\n if (newInstance) instance = newInstance;\n if (!model) return null;\n if (!instance) log('instance not registred');\n if (!instance.config.validateModels) return null;\n const simpleOps = ['const', 'placeholder', 'noop', 'pad', 'squeeze', 'add', 'sub', 'mul', 'div'];\n const ignoreOps = ['biasadd', 'fusedbatchnormv3', 'matmul'];\n const ops: string[] = [];\n const missing: string[] = [];\n interface Op { name: string, category: string, op: string }\n // @ts-ignore // modelUrl is a private method\n const url = model.modelUrl;\n // @ts-ignore // executor is a private method\n const executor = model.executor;\n if (executor && executor.graph.nodes) {\n for (const kernel of Object.values(executor.graph.nodes)) {\n const op = (kernel as Op).op.toLowerCase();\n if (!ops.includes(op)) ops.push(op);\n }\n } else {\n if (!executor && instance.config.debug) log('model signature not determined:', name);\n }\n for (const op of ops) {\n if (!simpleOps.includes(op) // exclude simple ops\n && !ignoreOps.includes(op) // exclude specific ops\n && !instance.env.kernels.includes(op) // check actual kernel ops\n && !instance.env.kernels.includes(op.replace('_', '')) // check variation without _\n && !instance.env.kernels.includes(op.replace('native', '')) // check standard variation\n && !instance.env.kernels.includes(op.replace('v2', ''))) { // check non-versioned variation\n missing.push(op);\n }\n }\n if (instance.config.debug && missing.length > 0) log('model validation failed:', name, missing);\n return missing.length > 0 ? { name, missing, ops, url } : null;\n}\n\nexport function validate(newInstance: Human): Array<{ name: string, missing: string[] }> {\n instance = newInstance;\n const missing: Array = [];\n for (const defined of Object.keys(instance.models)) {\n const model: GraphModel | null = instance.models[defined as keyof Models] as GraphModel | null;\n if (!model) continue;\n const res = validateModel(instance, model, defined);\n if (res) missing.push(res);\n }\n return missing;\n}\n", "/**\n * GEAR [gender/emotion/age/race] model implementation\n *\n * Based on: [**GEAR Predictor**](https://github.com/Udolf15/GEAR-Predictor)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Gender, Race } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport { env } from '../util/env';\n\nexport type GearType = { age: number, gender: Gender, genderScore: number, race: Array<{ score: number, race: Race }> }\nlet model: GraphModel | null;\nconst last: Array = [];\nconst raceNames = ['white', 'black', 'asian', 'indian', 'other'];\nconst ageWeights = [15, 23, 28, 35.5, 45.5, 55.5, 65];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['gear']?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n const skipFrame = skipped < (config.face['gear']?.skipFrames || 0);\n const skipTime = (config.face['gear']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n // t.resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape[2], model?.inputs[0].shape[1]], false);\n const box = [[0.0, 0.10, 0.90, 0.90]]; // empyrical values for top, left, bottom, right\n t.resize = tf.image.cropAndResize(image, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const obj: GearType = { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n if (config.face['gear']?.enabled) [t.age, t.gender, t.race] = model.execute(t.resize, ['age_output', 'gender_output', 'race_output']) as Tensor[];\n const gender = await t.gender.data();\n obj.gender = gender[0] > gender[1] ? 'male' : 'female';\n obj.genderScore = Math.round(100 * (gender[0] > gender[1] ? gender[0] : gender[1])) / 100;\n const race = await t.race.data();\n for (let i = 0; i < race.length; i++) {\n if (race[i] > (config.face['gear']?.minConfidence || 0.2)) obj.race.push({ score: Math.round(100 * race[i]) / 100, race: raceNames[i] as Race });\n }\n obj.race.sort((a, b) => b.score - a.score);\n // {0: 'Below20', 1: '21-25', 2: '26-30', 3: '31-40',4: '41-50', 5: '51-60', 6: 'Above60'}\n const ageDistribution = Array.from(await t.age.data());\n const ageSorted = ageDistribution.map((a, i) => [ageWeights[i], a]).sort((a, b) => b[1] - a[1]);\n let age = ageSorted[0][0]; // pick best starting point\n for (let i = 1; i < ageSorted.length; i++) age += ageSorted[i][1] * (ageSorted[i][0] - age); // adjust with each other choice by weight\n obj.age = Math.round(10 * age) / 10;\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from './types';\n\nexport const constants: Record = {\n tf255: 255,\n tf1: 1,\n tf2: 2,\n tf05: 0.5,\n tf127: 127.5,\n rgb: [0.2989, 0.5870, 0.1140],\n};\n\nexport function init() {\n constants.tf255 = tf.scalar(255, 'float32');\n constants.tf1 = tf.scalar(1, 'float32');\n constants.tf2 = tf.scalar(2, 'float32');\n constants.tf05 = tf.scalar(0.5, 'float32');\n constants.tf127 = tf.scalar(127.5, 'float32');\n constants.rgb = tf.tensor1d([0.2989, 0.5870, 0.1140], 'float32'); // factors for red/green/blue colors when converting to grayscale\n}\n", "/**\n * Age model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\n\nlet model: GraphModel | null;\nconst last: Array<{ age: number }> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathAge);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise<{ age: number }> {\n if (!model) return { age: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs || !model.inputs[0] || !model.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.mul(t.resize, constants.tf255);\n const obj = { age: 0 };\n if (config.face['ssrnet'].enabled) t.age = model.execute(t.enhance) as Tensor;\n if (t.age) {\n const data = await t.age.data();\n obj.age = Math.trunc(10 * data[0]) / 10;\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Gender model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Gender } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array<{ gender: Gender, genderScore: number }> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config | any) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathGender);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx, count): Promise<{ gender: Gender, genderScore: number }> {\n if (!model) return { gender: 'unknown', genderScore: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.gender && (last[idx]?.genderScore > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.tidy(() => {\n const [red, green, blue] = tf.split(t.resize, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const normalize = tf.mul(tf.sub(grayscale, constants.tf05), 2); // range grayscale:-1..1\n return normalize;\n });\n const obj: { gender: Gender, genderScore: number } = { gender: 'unknown', genderScore: 0 };\n if (config.face['ssrnet'].enabled) t.gender = model.execute(t.enhance) as Tensor;\n const data = await t.gender.data();\n obj.gender = data[0] > data[1] ? 'female' : 'male'; // returns two values 0..1, bigger one is prediction\n obj.genderScore = data[0] > data[1] ? (Math.trunc(100 * data[0]) / 100) : (Math.trunc(100 * data[1]) / 100);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.antispoof?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return 0;\n const skipTime = (config.face.antispoof?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.antispoof?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nexport const meshAnnotations: Record = {\n silhouette: [\n 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n ],\n // lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291], // 11\n // lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291], // 10\n // lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308], // 11\n // lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], // 11\n lipsUpperOuter: [185, 40, 39, 37, 0, 267, 269, 270, 409],\n lipsLowerOuter: [61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [191, 80, 81, 82, 13, 312, 311, 310, 415],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n lipsLowerSemiOuter: [76, 77, 90, 180, 85, 16, 315, 404, 320, 307, 306],\n lipsUpperSemiOuter: [184, 74, 73, 72, 11, 302, 303, 304, 408],\n lipsLowerSemiInner: [62, 96, 89, 179, 86, 15, 316, 403, 319, 325, 292],\n lipsUpperSemiInner: [183, 42, 41, 38, 12, 268, 271, 272, 407],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173], // 7\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133], // 9\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190], // 7\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243], // 9\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189], // 7\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244], // 9\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245], // 9\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193], // 8\n rightEyebrowLower: [35, 124, 46, 53, 52, 65], // 6\n rightEyeIris: [473, 474, 475, 476, 477], // 5\n leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n leftEyeIris: [468, 469, 470, 471, 472],\n midwayBetweenEyes: [168],\n noseTip: [1],\n noseBottom: [2],\n noseRightCorner: [98],\n noseLeftCorner: [327],\n rightCheek: [205],\n leftCheek: [425],\n};\n\nexport const meshLandmarks: Record = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, meshAnnotations['midwayBetweenEyes'][0]],\n};\n\nexport const blazeFaceLandmarks: Record = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nexport const irisIndices: Array<{ key: string, indices: number[] }> = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] }, // 7 x 3d\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] }, // 7 x 3d\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] }, // 7 x 3d\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] }, // 7 x 3d\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] }, // 9 x 3d\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] }, // 9 x 3d\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] }, // 9 x 3d\n { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] }, // 8 x 3d\n { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] }, // 6 x 3d\n];\n\nexport const UV468: [number, number][] = [\n [0.499976992607117, 0.652534008026123],\n [0.500025987625122, 0.547487020492554],\n [0.499974012374878, 0.602371990680695],\n [0.482113003730774, 0.471979022026062],\n [0.500150978565216, 0.527155995368958],\n [0.499909996986389, 0.498252987861633],\n [0.499523013830185, 0.40106201171875],\n [0.289712011814117, 0.380764007568359],\n [0.499954998493195, 0.312398016452789],\n [0.499987006187439, 0.269918978214264],\n [0.500023007392883, 0.107050001621246],\n [0.500023007392883, 0.666234016418457],\n [0.5000159740448, 0.679224014282227],\n [0.500023007392883, 0.692348003387451],\n [0.499976992607117, 0.695277988910675],\n [0.499976992607117, 0.70593398809433],\n [0.499976992607117, 0.719385027885437],\n [0.499976992607117, 0.737019002437592],\n [0.499967992305756, 0.781370997428894],\n [0.499816000461578, 0.562981009483337],\n [0.473773002624512, 0.573909997940063],\n [0.104906998574734, 0.254140973091125],\n [0.365929991006851, 0.409575998783112],\n [0.338757991790771, 0.41302502155304],\n [0.311120003461838, 0.409460008144379],\n [0.274657994508743, 0.389131009578705],\n [0.393361985683441, 0.403706014156342],\n [0.345234006643295, 0.344011008739471],\n [0.370094001293182, 0.346076011657715],\n [0.319321990013123, 0.347265005111694],\n [0.297903001308441, 0.353591024875641],\n [0.24779200553894, 0.410809993743896],\n [0.396889001131058, 0.842755019664764],\n [0.280097991228104, 0.375599980354309],\n [0.106310002505779, 0.399955987930298],\n [0.2099249958992, 0.391353011131287],\n [0.355807989835739, 0.534406006336212],\n [0.471751004457474, 0.65040397644043],\n [0.474155008792877, 0.680191993713379],\n [0.439785003662109, 0.657229006290436],\n [0.414617002010345, 0.66654098033905],\n [0.450374007225037, 0.680860996246338],\n [0.428770989179611, 0.682690978050232],\n [0.374971002340317, 0.727805018424988],\n [0.486716985702515, 0.547628998756409],\n [0.485300987958908, 0.527395009994507],\n [0.257764995098114, 0.314490020275116],\n [0.401223003864288, 0.455172002315521],\n [0.429818987846375, 0.548614978790283],\n [0.421351999044418, 0.533740997314453],\n [0.276895999908447, 0.532056987285614],\n [0.483370006084442, 0.499586999416351],\n [0.33721199631691, 0.282882988452911],\n [0.296391993761063, 0.293242990970612],\n [0.169294998049736, 0.193813979625702],\n [0.447580009698868, 0.302609980106354],\n [0.392390012741089, 0.353887975215912],\n [0.354490011930466, 0.696784019470215],\n [0.067304998636246, 0.730105042457581],\n [0.442739009857178, 0.572826027870178],\n [0.457098007202148, 0.584792017936707],\n [0.381974011659622, 0.694710969924927],\n [0.392388999462128, 0.694203019142151],\n [0.277076005935669, 0.271932005882263],\n [0.422551989555359, 0.563233017921448],\n [0.385919004678726, 0.281364023685455],\n [0.383103013038635, 0.255840003490448],\n [0.331431001424789, 0.119714021682739],\n [0.229923993349075, 0.232002973556519],\n [0.364500999450684, 0.189113974571228],\n [0.229622006416321, 0.299540996551514],\n [0.173287004232407, 0.278747975826263],\n [0.472878992557526, 0.666198015213013],\n [0.446828007698059, 0.668527007102966],\n [0.422762006521225, 0.673889994621277],\n [0.445307999849319, 0.580065965652466],\n [0.388103008270264, 0.693961024284363],\n [0.403039008378983, 0.706539988517761],\n [0.403629004955292, 0.693953037261963],\n [0.460041999816895, 0.557139039039612],\n [0.431158006191254, 0.692366003990173],\n [0.452181994915009, 0.692366003990173],\n [0.475387006998062, 0.692366003990173],\n [0.465828001499176, 0.779190003871918],\n [0.472328990697861, 0.736225962638855],\n [0.473087012767792, 0.717857003211975],\n [0.473122000694275, 0.704625964164734],\n [0.473033010959625, 0.695277988910675],\n [0.427942007780075, 0.695277988910675],\n [0.426479011774063, 0.703539967536926],\n [0.423162013292313, 0.711845993995667],\n [0.4183090031147, 0.720062971115112],\n [0.390094995498657, 0.639572978019714],\n [0.013953999616206, 0.560034036636353],\n [0.499913990497589, 0.58014702796936],\n [0.413199990987778, 0.69539999961853],\n [0.409626007080078, 0.701822996139526],\n [0.468080013990402, 0.601534962654114],\n [0.422728985548019, 0.585985004901886],\n [0.463079988956451, 0.593783974647522],\n [0.37211999297142, 0.47341400384903],\n [0.334562003612518, 0.496073007583618],\n [0.411671012639999, 0.546965003013611],\n [0.242175996303558, 0.14767599105835],\n [0.290776997804642, 0.201445996761322],\n [0.327338010072708, 0.256527006626129],\n [0.399509996175766, 0.748921036720276],\n [0.441727995872498, 0.261676013469696],\n [0.429764986038208, 0.187834024429321],\n [0.412198007106781, 0.108901023864746],\n [0.288955003023148, 0.398952007293701],\n [0.218936994671822, 0.435410976409912],\n [0.41278201341629, 0.398970007896423],\n [0.257135003805161, 0.355440020561218],\n [0.427684992551804, 0.437960982322693],\n [0.448339998722076, 0.536936044692993],\n [0.178560003638268, 0.45755398273468],\n [0.247308000922203, 0.457193970680237],\n [0.286267012357712, 0.467674970626831],\n [0.332827985286713, 0.460712015628815],\n [0.368755996227264, 0.447206974029541],\n [0.398963987827301, 0.432654976844788],\n [0.476410001516342, 0.405806005001068],\n [0.189241006970406, 0.523923993110657],\n [0.228962004184723, 0.348950982093811],\n [0.490725994110107, 0.562400996685028],\n [0.404670000076294, 0.485132992267609],\n [0.019469000399113, 0.401564002037048],\n [0.426243007183075, 0.420431017875671],\n [0.396993011236191, 0.548797011375427],\n [0.266469985246658, 0.376977026462555],\n [0.439121007919312, 0.51895797252655],\n [0.032313998788595, 0.644356966018677],\n [0.419054001569748, 0.387154996395111],\n [0.462783008813858, 0.505746960639954],\n [0.238978996872902, 0.779744982719421],\n [0.198220998048782, 0.831938028335571],\n [0.107550002634525, 0.540755033493042],\n [0.183610007166862, 0.740257024765015],\n [0.134409993886948, 0.333683013916016],\n [0.385764002799988, 0.883153975009918],\n [0.490967005491257, 0.579378008842468],\n [0.382384985685349, 0.508572995662689],\n [0.174399003386497, 0.397670984268188],\n [0.318785011768341, 0.39623498916626],\n [0.343364000320435, 0.400596976280212],\n [0.396100014448166, 0.710216999053955],\n [0.187885001301765, 0.588537991046906],\n [0.430987000465393, 0.944064974784851],\n [0.318993002176285, 0.898285031318665],\n [0.266247987747192, 0.869701027870178],\n [0.500023007392883, 0.190576016902924],\n [0.499976992607117, 0.954452991485596],\n [0.366169989109039, 0.398822009563446],\n [0.393207013607025, 0.39553701877594],\n [0.410373002290726, 0.391080021858215],\n [0.194993004202843, 0.342101991176605],\n [0.388664990663528, 0.362284004688263],\n [0.365961998701096, 0.355970978736877],\n [0.343364000320435, 0.355356991291046],\n [0.318785011768341, 0.35834002494812],\n [0.301414996385574, 0.363156020641327],\n [0.058132998645306, 0.319076001644135],\n [0.301414996385574, 0.387449026107788],\n [0.499987989664078, 0.618434011936188],\n [0.415838003158569, 0.624195992946625],\n [0.445681989192963, 0.566076993942261],\n [0.465844005346298, 0.620640993118286],\n [0.49992299079895, 0.351523995399475],\n [0.288718998432159, 0.819945991039276],\n [0.335278987884521, 0.852819979190826],\n [0.440512001514435, 0.902418971061707],\n [0.128294005990028, 0.791940987110138],\n [0.408771991729736, 0.373893976211548],\n [0.455606997013092, 0.451801002025604],\n [0.499877005815506, 0.908990025520325],\n [0.375436991453171, 0.924192011356354],\n [0.11421000212431, 0.615022003650665],\n [0.448662012815475, 0.695277988910675],\n [0.4480200111866, 0.704632043838501],\n [0.447111994028091, 0.715808033943176],\n [0.444831997156143, 0.730794012546539],\n [0.430011987686157, 0.766808986663818],\n [0.406787008047104, 0.685672998428345],\n [0.400738000869751, 0.681069016456604],\n [0.392399996519089, 0.677703022956848],\n [0.367855995893478, 0.663918972015381],\n [0.247923001646996, 0.601333022117615],\n [0.452769994735718, 0.420849978923798],\n [0.43639200925827, 0.359887003898621],\n [0.416164010763168, 0.368713974952698],\n [0.413385987281799, 0.692366003990173],\n [0.228018000721931, 0.683571994304657],\n [0.468268007040024, 0.352671027183533],\n [0.411361992359161, 0.804327011108398],\n [0.499989002943039, 0.469825029373169],\n [0.479153990745544, 0.442654013633728],\n [0.499974012374878, 0.439637005329132],\n [0.432112008333206, 0.493588984012604],\n [0.499886006116867, 0.866917014122009],\n [0.49991300702095, 0.821729004383087],\n [0.456548988819122, 0.819200992584229],\n [0.344549000263214, 0.745438992977142],\n [0.37890899181366, 0.574010014533997],\n [0.374292999505997, 0.780184984207153],\n [0.319687992334366, 0.570737957954407],\n [0.357154995203018, 0.604269981384277],\n [0.295284003019333, 0.621580958366394],\n [0.447750002145767, 0.862477004528046],\n [0.410986006259918, 0.508723020553589],\n [0.31395098567009, 0.775308012962341],\n [0.354128003120422, 0.812552988529205],\n [0.324548006057739, 0.703992962837219],\n [0.189096003770828, 0.646299958229065],\n [0.279776990413666, 0.71465802192688],\n [0.1338230073452, 0.682700991630554],\n [0.336768001317978, 0.644733011722565],\n [0.429883986711502, 0.466521978378296],\n [0.455527991056442, 0.548622965812683],\n [0.437114000320435, 0.558896005153656],\n [0.467287987470627, 0.529924988746643],\n [0.414712011814117, 0.335219979286194],\n [0.37704598903656, 0.322777986526489],\n [0.344107985496521, 0.320150971412659],\n [0.312875986099243, 0.32233202457428],\n [0.283526003360748, 0.333190023899078],\n [0.241245999932289, 0.382785975933075],\n [0.102986000478268, 0.468762993812561],\n [0.267612010240555, 0.424560010433197],\n [0.297879010438919, 0.433175981044769],\n [0.333433985710144, 0.433878004550934],\n [0.366427004337311, 0.426115989685059],\n [0.396012008190155, 0.416696012020111],\n [0.420121014118195, 0.41022801399231],\n [0.007561000064015, 0.480777025222778],\n [0.432949006557465, 0.569517970085144],\n [0.458638995885849, 0.479089021682739],\n [0.473466008901596, 0.545744001865387],\n [0.476087987422943, 0.563830018043518],\n [0.468472003936768, 0.555056989192963],\n [0.433990985155106, 0.582361996173859],\n [0.483518004417419, 0.562983989715576],\n [0.482482999563217, 0.57784903049469],\n [0.42645001411438, 0.389798998832703],\n [0.438998997211456, 0.39649498462677],\n [0.450067013502121, 0.400434017181396],\n [0.289712011814117, 0.368252992630005],\n [0.276670008897781, 0.363372981548309],\n [0.517862021923065, 0.471948027610779],\n [0.710287988185883, 0.380764007568359],\n [0.526226997375488, 0.573909997940063],\n [0.895093023777008, 0.254140973091125],\n [0.634069979190826, 0.409575998783112],\n [0.661242008209229, 0.41302502155304],\n [0.688880026340485, 0.409460008144379],\n [0.725341975688934, 0.389131009578705],\n [0.606630027294159, 0.40370500087738],\n [0.654766023159027, 0.344011008739471],\n [0.629905998706818, 0.346076011657715],\n [0.680678009986877, 0.347265005111694],\n [0.702096998691559, 0.353591024875641],\n [0.75221198797226, 0.410804986953735],\n [0.602918028831482, 0.842862963676453],\n [0.719901978969574, 0.375599980354309],\n [0.893692970275879, 0.399959981441498],\n [0.790081977844238, 0.391354024410248],\n [0.643998026847839, 0.534487962722778],\n [0.528249025344849, 0.65040397644043],\n [0.525849997997284, 0.680191040039062],\n [0.560214996337891, 0.657229006290436],\n [0.585384011268616, 0.66654098033905],\n [0.549625992774963, 0.680860996246338],\n [0.57122802734375, 0.682691991329193],\n [0.624852001667023, 0.72809898853302],\n [0.513050019741058, 0.547281980514526],\n [0.51509702205658, 0.527251958847046],\n [0.742246985435486, 0.314507007598877],\n [0.598631024360657, 0.454979002475739],\n [0.570338010787964, 0.548575043678284],\n [0.578631997108459, 0.533622980117798],\n [0.723087012767792, 0.532054007053375],\n [0.516445994377136, 0.499638974666595],\n [0.662801027297974, 0.282917976379395],\n [0.70362401008606, 0.293271005153656],\n [0.830704987049103, 0.193813979625702],\n [0.552385985851288, 0.302568018436432],\n [0.607609987258911, 0.353887975215912],\n [0.645429015159607, 0.696707010269165],\n [0.932694971561432, 0.730105042457581],\n [0.557260990142822, 0.572826027870178],\n [0.542901992797852, 0.584792017936707],\n [0.6180260181427, 0.694710969924927],\n [0.607590973377228, 0.694203019142151],\n [0.722943007946014, 0.271963000297546],\n [0.577413976192474, 0.563166975975037],\n [0.614082992076874, 0.281386971473694],\n [0.616907000541687, 0.255886018276215],\n [0.668509006500244, 0.119913995265961],\n [0.770092010498047, 0.232020974159241],\n [0.635536015033722, 0.189248979091644],\n [0.77039098739624, 0.299556016921997],\n [0.826722025871277, 0.278755009174347],\n [0.527121007442474, 0.666198015213013],\n [0.553171992301941, 0.668527007102966],\n [0.577238023281097, 0.673889994621277],\n [0.554691970348358, 0.580065965652466],\n [0.611896991729736, 0.693961024284363],\n [0.59696102142334, 0.706539988517761],\n [0.596370995044708, 0.693953037261963],\n [0.539958000183105, 0.557139039039612],\n [0.568841993808746, 0.692366003990173],\n [0.547818005084991, 0.692366003990173],\n [0.52461302280426, 0.692366003990173],\n [0.534089982509613, 0.779141008853912],\n [0.527670979499817, 0.736225962638855],\n [0.526912987232208, 0.717857003211975],\n [0.526877999305725, 0.704625964164734],\n [0.526966989040375, 0.695277988910675],\n [0.572058022022247, 0.695277988910675],\n [0.573521018028259, 0.703539967536926],\n [0.57683801651001, 0.711845993995667],\n [0.581691026687622, 0.720062971115112],\n [0.609944999217987, 0.639909982681274],\n [0.986046016216278, 0.560034036636353],\n [0.5867999792099, 0.69539999961853],\n [0.590372025966644, 0.701822996139526],\n [0.531915009021759, 0.601536989212036],\n [0.577268004417419, 0.585934996604919],\n [0.536915004253387, 0.593786001205444],\n [0.627542972564697, 0.473352015018463],\n [0.665585994720459, 0.495950996875763],\n [0.588353991508484, 0.546862006187439],\n [0.757824003696442, 0.14767599105835],\n [0.709249973297119, 0.201507985591888],\n [0.672684013843536, 0.256581008434296],\n [0.600408971309662, 0.74900496006012],\n [0.55826598405838, 0.261672019958496],\n [0.570303976535797, 0.187870979309082],\n [0.588165998458862, 0.109044015407562],\n [0.711045026779175, 0.398952007293701],\n [0.781069993972778, 0.435405015945435],\n [0.587247014045715, 0.398931980133057],\n [0.742869973182678, 0.355445981025696],\n [0.572156012058258, 0.437651991844177],\n [0.55186802148819, 0.536570012569427],\n [0.821442008018494, 0.457556009292603],\n [0.752701997756958, 0.457181990146637],\n [0.71375697851181, 0.467626988887787],\n [0.66711300611496, 0.460672974586487],\n [0.631101012229919, 0.447153985500336],\n [0.6008620262146, 0.432473003864288],\n [0.523481011390686, 0.405627012252808],\n [0.810747981071472, 0.523926019668579],\n [0.771045982837677, 0.348959028720856],\n [0.509127020835876, 0.562718033790588],\n [0.595292985439301, 0.485023975372314],\n [0.980530977249146, 0.401564002037048],\n [0.573499977588654, 0.420000016689301],\n [0.602994978427887, 0.548687994480133],\n [0.733529984951019, 0.376977026462555],\n [0.560611009597778, 0.519016981124878],\n [0.967685997486115, 0.644356966018677],\n [0.580985009670258, 0.387160003185272],\n [0.537728011608124, 0.505385041236877],\n [0.760966002941132, 0.779752969741821],\n [0.801778972148895, 0.831938028335571],\n [0.892440974712372, 0.54076099395752],\n [0.816350996494293, 0.740260004997253],\n [0.865594983100891, 0.333687007427216],\n [0.614073991775513, 0.883246004581451],\n [0.508952975273132, 0.579437971115112],\n [0.617941975593567, 0.508316040039062],\n [0.825608015060425, 0.397674977779388],\n [0.681214988231659, 0.39623498916626],\n [0.656635999679565, 0.400596976280212],\n [0.603900015354156, 0.710216999053955],\n [0.81208598613739, 0.588539004325867],\n [0.56801301240921, 0.944564998149872],\n [0.681007981300354, 0.898285031318665],\n [0.733752012252808, 0.869701027870178],\n [0.633830010890961, 0.398822009563446],\n [0.606792986392975, 0.39553701877594],\n [0.589659988880157, 0.391062021255493],\n [0.805015981197357, 0.342108011245728],\n [0.611334979534149, 0.362284004688263],\n [0.634037971496582, 0.355970978736877],\n [0.656635999679565, 0.355356991291046],\n [0.681214988231659, 0.35834002494812],\n [0.698584973812103, 0.363156020641327],\n [0.941866993904114, 0.319076001644135],\n [0.698584973812103, 0.387449026107788],\n [0.584177017211914, 0.624107003211975],\n [0.554318010807037, 0.566076993942261],\n [0.534153997898102, 0.62064003944397],\n [0.711217999458313, 0.819975018501282],\n [0.664629995822906, 0.852871000766754],\n [0.559099972248077, 0.902631998062134],\n [0.871706008911133, 0.791940987110138],\n [0.591234028339386, 0.373893976211548],\n [0.544341027736664, 0.451583981513977],\n [0.624562978744507, 0.924192011356354],\n [0.88577002286911, 0.615028977394104],\n [0.551338016986847, 0.695277988910675],\n [0.551980018615723, 0.704632043838501],\n [0.552887976169586, 0.715808033943176],\n [0.555167973041534, 0.730794012546539],\n [0.569944024085999, 0.767035007476807],\n [0.593203008174896, 0.685675978660583],\n [0.599261999130249, 0.681069016456604],\n [0.607599973678589, 0.677703022956848],\n [0.631937980651855, 0.663500010967255],\n [0.752032995223999, 0.601315021514893],\n [0.547226011753082, 0.420395016670227],\n [0.563543975353241, 0.359827995300293],\n [0.583841025829315, 0.368713974952698],\n [0.586614012718201, 0.692366003990173],\n [0.771915018558502, 0.683578014373779],\n [0.531597018241882, 0.352482974529266],\n [0.588370978832245, 0.804440975189209],\n [0.52079701423645, 0.442565023899078],\n [0.567984998226166, 0.493479013442993],\n [0.543282985687256, 0.819254994392395],\n [0.655317008495331, 0.745514988899231],\n [0.621008992195129, 0.574018001556396],\n [0.625559985637665, 0.78031200170517],\n [0.680198013782501, 0.570719003677368],\n [0.64276397228241, 0.604337990283966],\n [0.704662978649139, 0.621529996395111],\n [0.552012026309967, 0.862591981887817],\n [0.589071989059448, 0.508637011051178],\n [0.685944974422455, 0.775357007980347],\n [0.645735025405884, 0.812640011310577],\n [0.675342977046967, 0.703978002071381],\n [0.810858011245728, 0.646304965019226],\n [0.72012197971344, 0.714666962623596],\n [0.866151988506317, 0.682704985141754],\n [0.663187026977539, 0.644596993923187],\n [0.570082008838654, 0.466325998306274],\n [0.544561982154846, 0.548375964164734],\n [0.562758982181549, 0.558784961700439],\n [0.531987011432648, 0.530140042304993],\n [0.585271000862122, 0.335177004337311],\n [0.622952997684479, 0.32277899980545],\n [0.655896008014679, 0.320163011550903],\n [0.687132000923157, 0.322345972061157],\n [0.716481983661652, 0.333200991153717],\n [0.758756995201111, 0.382786989212036],\n [0.897013008594513, 0.468769013881683],\n [0.732392013072968, 0.424547016620636],\n [0.70211398601532, 0.433162987232208],\n [0.66652500629425, 0.433866024017334],\n [0.633504986763, 0.426087975502014],\n [0.603875994682312, 0.416586995124817],\n [0.579657971858978, 0.409945011138916],\n [0.992439985275269, 0.480777025222778],\n [0.567192018032074, 0.569419980049133],\n [0.54136598110199, 0.478899002075195],\n [0.526564002037048, 0.546118021011353],\n [0.523913025856018, 0.563830018043518],\n [0.531529009342194, 0.555056989192963],\n [0.566035985946655, 0.582329034805298],\n [0.51631098985672, 0.563053965568542],\n [0.5174720287323, 0.577877044677734],\n [0.573594987392426, 0.389806985855103],\n [0.560697972774506, 0.395331978797913],\n [0.549755990505219, 0.399751007556915],\n [0.710287988185883, 0.368252992630005],\n [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468: Array = [\n 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68: Array = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n 8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n 45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n 23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n 39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n 35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n 48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n 66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33: Array = [\n /* eyes */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n /* brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n /* 4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n /* nose */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n /* chin */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n /* cont */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7: Array = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68: Array = [\n /* cont */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n /* nose */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n /* eyes */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n /* lip */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33: Array = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7: Array = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n\n// https://github.com/tensorflow/tfjs-models/blob/master/face-landmarks-detection/src/constants.ts\n// https://github.com/google/mediapipe/mediapipe/python/solutions/face_mesh_connections.py\n\ntype PairArray = Array<[number, number]>;\n\nfunction connectionsToIndices(connections: PairArray) {\n const indices = connections.map((connection) => connection[0]);\n indices.push(connections[connections.length - 1][1]);\n return indices;\n}\n\nexport const pairsLips: PairArray = [\n [61, 146], [146, 91], [91, 181], [181, 84], [84, 17], [17, 314], [314, 405], [405, 321], [321, 375], [375, 291], [61, 185], [185, 40], [40, 39], [39, 37], [37, 0], [0, 267], [267, 269], [269, 270], [270, 409], [409, 291],\n [78, 95], [95, 88], [88, 178], [178, 87], [87, 14], [14, 317], [317, 402], [402, 318], [318, 324], [324, 308], [78, 191], [191, 80], [80, 81], [81, 82], [82, 13], [13, 312], [312, 311], [311, 310], [310, 415], [415, 308],\n];\n\nexport const pairsLeftEye: PairArray = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]];\n\nexport const pairsLeftEyebrow: PairArray = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]];\n\nexport const pairsLeftIris: PairArray = [[474, 475], [475, 476], [476, 477], [477, 474]];\n\nexport const pairsRightEye: PairArray = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]];\n\nexport const pairsRightEyebrow: PairArray = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]];\n\nexport const pairsRightIris: PairArray = [[469, 470], [470, 471], [471, 472], [472, 469]];\n\nexport const pairsFaceContour: PairArray = [\n [10, 338], [338, 297], [297, 332], [332, 284], [284, 251], [251, 389],\n [389, 356], [356, 454], [454, 323], [323, 361], [361, 288], [288, 397],\n [397, 365], [365, 379], [379, 378], [378, 400], [400, 377], [377, 152],\n [152, 148], [148, 176], [176, 149], [149, 150], [150, 136], [136, 172],\n [172, 58], [58, 132], [132, 93], [93, 234], [234, 127], [127, 162],\n [162, 21], [21, 54], [54, 103], [103, 67], [67, 109], [109, 10],\n];\n\nexport const contourKeypoints = {\n lips: connectionsToIndices(pairsLips),\n leftEye: connectionsToIndices(pairsLeftEye),\n leftEyebrow: connectionsToIndices(pairsLeftEyebrow),\n leftIris: connectionsToIndices(pairsLeftIris),\n rightEye: connectionsToIndices(pairsRightEye),\n rightEyebrow: connectionsToIndices(pairsRightEyebrow),\n rightIris: connectionsToIndices(pairsRightIris),\n faceOval: connectionsToIndices(pairsFaceContour),\n};\n\nexport const pairsFaceMesh: PairArray = [\n [127, 34], [34, 139], [139, 127], [11, 0], [0, 37], [37, 11],\n [232, 231], [231, 120], [120, 232], [72, 37], [37, 39], [39, 72],\n [128, 121], [121, 47], [47, 128], [232, 121], [121, 128], [128, 232],\n [104, 69], [69, 67], [67, 104], [175, 171], [171, 148], [148, 175],\n [118, 50], [50, 101], [101, 118], [73, 39], [39, 40], [40, 73],\n [9, 151], [151, 108], [108, 9], [48, 115], [115, 131], [131, 48],\n [194, 204], [204, 211], [211, 194], [74, 40], [40, 185], [185, 74],\n [80, 42], [42, 183], [183, 80], [40, 92], [92, 186], [186, 40],\n [230, 229], [229, 118], [118, 230], [202, 212], [212, 214], [214, 202],\n [83, 18], [18, 17], [17, 83], [76, 61], [61, 146], [146, 76],\n [160, 29], [29, 30], [30, 160], [56, 157], [157, 173], [173, 56],\n [106, 204], [204, 194], [194, 106], [135, 214], [214, 192], [192, 135],\n [203, 165], [165, 98], [98, 203], [21, 71], [71, 68], [68, 21],\n [51, 45], [45, 4], [4, 51], [144, 24], [24, 23], [23, 144],\n [77, 146], [146, 91], [91, 77], [205, 50], [50, 187], [187, 205],\n [201, 200], [200, 18], [18, 201], [91, 106], [106, 182], [182, 91],\n [90, 91], [91, 181], [181, 90], [85, 84], [84, 17], [17, 85],\n [206, 203], [203, 36], [36, 206], [148, 171], [171, 140], [140, 148],\n [92, 40], [40, 39], [39, 92], [193, 189], [189, 244], [244, 193],\n [159, 158], [158, 28], [28, 159], [247, 246], [246, 161], [161, 247],\n [236, 3], [3, 196], [196, 236], [54, 68], [68, 104], [104, 54],\n [193, 168], [168, 8], [8, 193], [117, 228], [228, 31], [31, 117],\n [189, 193], [193, 55], [55, 189], [98, 97], [97, 99], [99, 98],\n [126, 47], [47, 100], [100, 126], [166, 79], [79, 218], [218, 166],\n [155, 154], [154, 26], [26, 155], [209, 49], [49, 131], [131, 209],\n [135, 136], [136, 150], [150, 135], [47, 126], [126, 217], [217, 47],\n [223, 52], [52, 53], [53, 223], [45, 51], [51, 134], [134, 45],\n [211, 170], [170, 140], [140, 211], [67, 69], [69, 108], [108, 67],\n [43, 106], [106, 91], [91, 43], [230, 119], [119, 120], [120, 230],\n [226, 130], [130, 247], [247, 226], [63, 53], [53, 52], [52, 63],\n [238, 20], [20, 242], [242, 238], [46, 70], [70, 156], [156, 46],\n [78, 62], [62, 96], [96, 78], [46, 53], [53, 63], [63, 46],\n [143, 34], [34, 227], [227, 143], [123, 117], [117, 111], [111, 123],\n [44, 125], [125, 19], [19, 44], [236, 134], [134, 51], [51, 236],\n [216, 206], [206, 205], [205, 216], [154, 153], [153, 22], [22, 154],\n [39, 37], [37, 167], [167, 39], [200, 201], [201, 208], [208, 200],\n [36, 142], [142, 100], [100, 36], [57, 212], [212, 202], [202, 57],\n [20, 60], [60, 99], [99, 20], [28, 158], [158, 157], [157, 28],\n [35, 226], [226, 113], [113, 35], [160, 159], [159, 27], [27, 160],\n [204, 202], [202, 210], [210, 204], [113, 225], [225, 46], [46, 113],\n [43, 202], [202, 204], [204, 43], [62, 76], [76, 77], [77, 62],\n [137, 123], [123, 116], [116, 137], [41, 38], [38, 72], [72, 41],\n [203, 129], [129, 142], [142, 203], [64, 98], [98, 240], [240, 64],\n [49, 102], [102, 64], [64, 49], [41, 73], [73, 74], [74, 41],\n [212, 216], [216, 207], [207, 212], [42, 74], [74, 184], [184, 42],\n [169, 170], [170, 211], [211, 169], [170, 149], [149, 176], [176, 170],\n [105, 66], [66, 69], [69, 105], [122, 6], [6, 168], [168, 122],\n [123, 147], [147, 187], [187, 123], [96, 77], [77, 90], [90, 96],\n [65, 55], [55, 107], [107, 65], [89, 90], [90, 180], [180, 89],\n [101, 100], [100, 120], [120, 101], [63, 105], [105, 104], [104, 63],\n [93, 137], [137, 227], [227, 93], [15, 86], [86, 85], [85, 15],\n [129, 102], [102, 49], [49, 129], [14, 87], [87, 86], [86, 14],\n [55, 8], [8, 9], [9, 55], [100, 47], [47, 121], [121, 100],\n [145, 23], [23, 22], [22, 145], [88, 89], [89, 179], [179, 88],\n [6, 122], [122, 196], [196, 6], [88, 95], [95, 96], [96, 88],\n [138, 172], [172, 136], [136, 138], [215, 58], [58, 172], [172, 215],\n [115, 48], [48, 219], [219, 115], [42, 80], [80, 81], [81, 42],\n [195, 3], [3, 51], [51, 195], [43, 146], [146, 61], [61, 43],\n [171, 175], [175, 199], [199, 171], [81, 82], [82, 38], [38, 81],\n [53, 46], [46, 225], [225, 53], [144, 163], [163, 110], [110, 144],\n [52, 65], [65, 66], [66, 52], [229, 228], [228, 117], [117, 229],\n [34, 127], [127, 234], [234, 34], [107, 108], [108, 69], [69, 107],\n [109, 108], [108, 151], [151, 109], [48, 64], [64, 235], [235, 48],\n [62, 78], [78, 191], [191, 62], [129, 209], [209, 126], [126, 129],\n [111, 35], [35, 143], [143, 111], [117, 123], [123, 50], [50, 117],\n [222, 65], [65, 52], [52, 222], [19, 125], [125, 141], [141, 19],\n [221, 55], [55, 65], [65, 221], [3, 195], [195, 197], [197, 3],\n [25, 7], [7, 33], [33, 25], [220, 237], [237, 44], [44, 220],\n [70, 71], [71, 139], [139, 70], [122, 193], [193, 245], [245, 122],\n [247, 130], [130, 33], [33, 247], [71, 21], [21, 162], [162, 71],\n [170, 169], [169, 150], [150, 170], [188, 174], [174, 196], [196, 188],\n [216, 186], [186, 92], [92, 216], [2, 97], [97, 167], [167, 2],\n [141, 125], [125, 241], [241, 141], [164, 167], [167, 37], [37, 164],\n [72, 38], [38, 12], [12, 72], [38, 82], [82, 13], [13, 38],\n [63, 68], [68, 71], [71, 63], [226, 35], [35, 111], [111, 226],\n [101, 50], [50, 205], [205, 101], [206, 92], [92, 165], [165, 206],\n [209, 198], [198, 217], [217, 209], [165, 167], [167, 97], [97, 165],\n [220, 115], [115, 218], [218, 220], [133, 112], [112, 243], [243, 133],\n [239, 238], [238, 241], [241, 239], [214, 135], [135, 169], [169, 214],\n [190, 173], [173, 133], [133, 190], [171, 208], [208, 32], [32, 171],\n [125, 44], [44, 237], [237, 125], [86, 87], [87, 178], [178, 86],\n [85, 86], [86, 179], [179, 85], [84, 85], [85, 180], [180, 84],\n [83, 84], [84, 181], [181, 83], [201, 83], [83, 182], [182, 201],\n [137, 93], [93, 132], [132, 137], [76, 62], [62, 183], [183, 76],\n [61, 76], [76, 184], [184, 61], [57, 61], [61, 185], [185, 57],\n [212, 57], [57, 186], [186, 212], [214, 207], [207, 187], [187, 214],\n [34, 143], [143, 156], [156, 34], [79, 239], [239, 237], [237, 79],\n [123, 137], [137, 177], [177, 123], [44, 1], [1, 4], [4, 44],\n [201, 194], [194, 32], [32, 201], [64, 102], [102, 129], [129, 64],\n [213, 215], [215, 138], [138, 213], [59, 166], [166, 219], [219, 59],\n [242, 99], [99, 97], [97, 242], [2, 94], [94, 141], [141, 2],\n [75, 59], [59, 235], [235, 75], [24, 110], [110, 228], [228, 24],\n [25, 130], [130, 226], [226, 25], [23, 24], [24, 229], [229, 23],\n [22, 23], [23, 230], [230, 22], [26, 22], [22, 231], [231, 26],\n [112, 26], [26, 232], [232, 112], [189, 190], [190, 243], [243, 189],\n [221, 56], [56, 190], [190, 221], [28, 56], [56, 221], [221, 28],\n [27, 28], [28, 222], [222, 27], [29, 27], [27, 223], [223, 29],\n [30, 29], [29, 224], [224, 30], [247, 30], [30, 225], [225, 247],\n [238, 79], [79, 20], [20, 238], [166, 59], [59, 75], [75, 166],\n [60, 75], [75, 240], [240, 60], [147, 177], [177, 215], [215, 147],\n [20, 79], [79, 166], [166, 20], [187, 147], [147, 213], [213, 187],\n [112, 233], [233, 244], [244, 112], [233, 128], [128, 245], [245, 233],\n [128, 114], [114, 188], [188, 128], [114, 217], [217, 174], [174, 114],\n [131, 115], [115, 220], [220, 131], [217, 198], [198, 236], [236, 217],\n [198, 131], [131, 134], [134, 198], [177, 132], [132, 58], [58, 177],\n [143, 35], [35, 124], [124, 143], [110, 163], [163, 7], [7, 110],\n [228, 110], [110, 25], [25, 228], [356, 389], [389, 368], [368, 356],\n [11, 302], [302, 267], [267, 11], [452, 350], [350, 349], [349, 452],\n [302, 303], [303, 269], [269, 302], [357, 343], [343, 277], [277, 357],\n [452, 453], [453, 357], [357, 452], [333, 332], [332, 297], [297, 333],\n [175, 152], [152, 377], [377, 175], [347, 348], [348, 330], [330, 347],\n [303, 304], [304, 270], [270, 303], [9, 336], [336, 337], [337, 9],\n [278, 279], [279, 360], [360, 278], [418, 262], [262, 431], [431, 418],\n [304, 408], [408, 409], [409, 304], [310, 415], [415, 407], [407, 310],\n [270, 409], [409, 410], [410, 270], [450, 348], [348, 347], [347, 450],\n [422, 430], [430, 434], [434, 422], [313, 314], [314, 17], [17, 313],\n [306, 307], [307, 375], [375, 306], [387, 388], [388, 260], [260, 387],\n [286, 414], [414, 398], [398, 286], [335, 406], [406, 418], [418, 335],\n [364, 367], [367, 416], [416, 364], [423, 358], [358, 327], [327, 423],\n [251, 284], [284, 298], [298, 251], [281, 5], [5, 4], [4, 281],\n [373, 374], [374, 253], [253, 373], [307, 320], [320, 321], [321, 307],\n [425, 427], [427, 411], [411, 425], [421, 313], [313, 18], [18, 421],\n [321, 405], [405, 406], [406, 321], [320, 404], [404, 405], [405, 320],\n [315, 16], [16, 17], [17, 315], [426, 425], [425, 266], [266, 426],\n [377, 400], [400, 369], [369, 377], [322, 391], [391, 269], [269, 322],\n [417, 465], [465, 464], [464, 417], [386, 257], [257, 258], [258, 386],\n [466, 260], [260, 388], [388, 466], [456, 399], [399, 419], [419, 456],\n [284, 332], [332, 333], [333, 284], [417, 285], [285, 8], [8, 417],\n [346, 340], [340, 261], [261, 346], [413, 441], [441, 285], [285, 413],\n [327, 460], [460, 328], [328, 327], [355, 371], [371, 329], [329, 355],\n [392, 439], [439, 438], [438, 392], [382, 341], [341, 256], [256, 382],\n [429, 420], [420, 360], [360, 429], [364, 394], [394, 379], [379, 364],\n [277, 343], [343, 437], [437, 277], [443, 444], [444, 283], [283, 443],\n [275, 440], [440, 363], [363, 275], [431, 262], [262, 369], [369, 431],\n [297, 338], [338, 337], [337, 297], [273, 375], [375, 321], [321, 273],\n [450, 451], [451, 349], [349, 450], [446, 342], [342, 467], [467, 446],\n [293, 334], [334, 282], [282, 293], [458, 461], [461, 462], [462, 458],\n [276, 353], [353, 383], [383, 276], [308, 324], [324, 325], [325, 308],\n [276, 300], [300, 293], [293, 276], [372, 345], [345, 447], [447, 372],\n [352, 345], [345, 340], [340, 352], [274, 1], [1, 19], [19, 274],\n [456, 248], [248, 281], [281, 456], [436, 427], [427, 425], [425, 436],\n [381, 256], [256, 252], [252, 381], [269, 391], [391, 393], [393, 269],\n [200, 199], [199, 428], [428, 200], [266, 330], [330, 329], [329, 266],\n [287, 273], [273, 422], [422, 287], [250, 462], [462, 328], [328, 250],\n [258, 286], [286, 384], [384, 258], [265, 353], [353, 342], [342, 265],\n [387, 259], [259, 257], [257, 387], [424, 431], [431, 430], [430, 424],\n [342, 353], [353, 276], [276, 342], [273, 335], [335, 424], [424, 273],\n [292, 325], [325, 307], [307, 292], [366, 447], [447, 345], [345, 366],\n [271, 303], [303, 302], [302, 271], [423, 266], [266, 371], [371, 423],\n [294, 455], [455, 460], [460, 294], [279, 278], [278, 294], [294, 279],\n [271, 272], [272, 304], [304, 271], [432, 434], [434, 427], [427, 432],\n [272, 407], [407, 408], [408, 272], [394, 430], [430, 431], [431, 394],\n [395, 369], [369, 400], [400, 395], [334, 333], [333, 299], [299, 334],\n [351, 417], [417, 168], [168, 351], [352, 280], [280, 411], [411, 352],\n [325, 319], [319, 320], [320, 325], [295, 296], [296, 336], [336, 295],\n [319, 403], [403, 404], [404, 319], [330, 348], [348, 349], [349, 330],\n [293, 298], [298, 333], [333, 293], [323, 454], [454, 447], [447, 323],\n [15, 16], [16, 315], [315, 15], [358, 429], [429, 279], [279, 358],\n [14, 15], [15, 316], [316, 14], [285, 336], [336, 9], [9, 285],\n [329, 349], [349, 350], [350, 329], [374, 380], [380, 252], [252, 374],\n [318, 402], [402, 403], [403, 318], [6, 197], [197, 419], [419, 6],\n [318, 319], [319, 325], [325, 318], [367, 364], [364, 365], [365, 367],\n [435, 367], [367, 397], [397, 435], [344, 438], [438, 439], [439, 344],\n [272, 271], [271, 311], [311, 272], [195, 5], [5, 281], [281, 195],\n [273, 287], [287, 291], [291, 273], [396, 428], [428, 199], [199, 396],\n [311, 271], [271, 268], [268, 311], [283, 444], [444, 445], [445, 283],\n [373, 254], [254, 339], [339, 373], [282, 334], [334, 296], [296, 282],\n [449, 347], [347, 346], [346, 449], [264, 447], [447, 454], [454, 264],\n [336, 296], [296, 299], [299, 336], [338, 10], [10, 151], [151, 338],\n [278, 439], [439, 455], [455, 278], [292, 407], [407, 415], [415, 292],\n [358, 371], [371, 355], [355, 358], [340, 345], [345, 372], [372, 340],\n [346, 347], [347, 280], [280, 346], [442, 443], [443, 282], [282, 442],\n [19, 94], [94, 370], [370, 19], [441, 442], [442, 295], [295, 441],\n [248, 419], [419, 197], [197, 248], [263, 255], [255, 359], [359, 263],\n [440, 275], [275, 274], [274, 440], [300, 383], [383, 368], [368, 300],\n [351, 412], [412, 465], [465, 351], [263, 467], [467, 466], [466, 263],\n [301, 368], [368, 389], [389, 301], [395, 378], [378, 379], [379, 395],\n [412, 351], [351, 419], [419, 412], [436, 426], [426, 322], [322, 436],\n [2, 164], [164, 393], [393, 2], [370, 462], [462, 461], [461, 370],\n [164, 0], [0, 267], [267, 164], [302, 11], [11, 12], [12, 302],\n [268, 12], [12, 13], [13, 268], [293, 300], [300, 301], [301, 293],\n [446, 261], [261, 340], [340, 446], [330, 266], [266, 425], [425, 330],\n [426, 423], [423, 391], [391, 426], [429, 355], [355, 437], [437, 429],\n [391, 327], [327, 326], [326, 391], [440, 457], [457, 438], [438, 440],\n [341, 382], [382, 362], [362, 341], [459, 457], [457, 461], [461, 459],\n [434, 430], [430, 394], [394, 434], [414, 463], [463, 362], [362, 414],\n [396, 369], [369, 262], [262, 396], [354, 461], [461, 457], [457, 354],\n [316, 403], [403, 402], [402, 316], [315, 404], [404, 403], [403, 315],\n [314, 405], [405, 404], [404, 314], [313, 406], [406, 405], [405, 313],\n [421, 418], [418, 406], [406, 421], [366, 401], [401, 361], [361, 366],\n [306, 408], [408, 407], [407, 306], [291, 409], [409, 408], [408, 291],\n [287, 410], [410, 409], [409, 287], [432, 436], [436, 410], [410, 432],\n [434, 416], [416, 411], [411, 434], [264, 368], [368, 383], [383, 264],\n [309, 438], [438, 457], [457, 309], [352, 376], [376, 401], [401, 352],\n [274, 275], [275, 4], [4, 274], [421, 428], [428, 262], [262, 421],\n [294, 327], [327, 358], [358, 294], [433, 416], [416, 367], [367, 433],\n [289, 455], [455, 439], [439, 289], [462, 370], [370, 326], [326, 462],\n [2, 326], [326, 370], [370, 2], [305, 460], [460, 455], [455, 305],\n [254, 449], [449, 448], [448, 254], [255, 261], [261, 446], [446, 255],\n [253, 450], [450, 449], [449, 253], [252, 451], [451, 450], [450, 252],\n [256, 452], [452, 451], [451, 256], [341, 453], [453, 452], [452, 341],\n [413, 464], [464, 463], [463, 413], [441, 413], [413, 414], [414, 441],\n [258, 442], [442, 441], [441, 258], [257, 443], [443, 442], [442, 257],\n [259, 444], [444, 443], [443, 259], [260, 445], [445, 444], [444, 260],\n [467, 342], [342, 445], [445, 467], [459, 458], [458, 250], [250, 459],\n [289, 392], [392, 290], [290, 289], [290, 328], [328, 460], [460, 290],\n [376, 433], [433, 435], [435, 376], [250, 290], [290, 392], [392, 250],\n [411, 416], [416, 433], [433, 411], [341, 463], [463, 464], [464, 341],\n [453, 464], [464, 465], [465, 453], [357, 465], [465, 412], [412, 357],\n [343, 412], [412, 399], [399, 343], [360, 363], [363, 440], [440, 360],\n [437, 399], [399, 456], [456, 437], [420, 456], [456, 363], [363, 420],\n [401, 435], [435, 288], [288, 401], [372, 383], [383, 353], [353, 372],\n [339, 255], [255, 249], [249, 339], [448, 261], [261, 255], [255, 448],\n [133, 243], [243, 190], [190, 133], [133, 155], [155, 112], [112, 133],\n [33, 246], [246, 247], [247, 33], [33, 130], [130, 25], [25, 33],\n [398, 384], [384, 286], [286, 398], [362, 398], [398, 414], [414, 362],\n [362, 463], [463, 341], [341, 362], [263, 359], [359, 467], [467, 263],\n [263, 249], [249, 255], [255, 263], [466, 467], [467, 260], [260, 466],\n [75, 60], [60, 166], [166, 75], [238, 239], [239, 79], [79, 238],\n [162, 127], [127, 139], [139, 162], [72, 11], [11, 37], [37, 72],\n [121, 232], [232, 120], [120, 121], [73, 72], [72, 39], [39, 73],\n [114, 128], [128, 47], [47, 114], [233, 232], [232, 128], [128, 233],\n [103, 104], [104, 67], [67, 103], [152, 175], [175, 148], [148, 152],\n [119, 118], [118, 101], [101, 119], [74, 73], [73, 40], [40, 74],\n [107, 9], [9, 108], [108, 107], [49, 48], [48, 131], [131, 49],\n [32, 194], [194, 211], [211, 32], [184, 74], [74, 185], [185, 184],\n [191, 80], [80, 183], [183, 191], [185, 40], [40, 186], [186, 185],\n [119, 230], [230, 118], [118, 119], [210, 202], [202, 214], [214, 210],\n [84, 83], [83, 17], [17, 84], [77, 76], [76, 146], [146, 77],\n [161, 160], [160, 30], [30, 161], [190, 56], [56, 173], [173, 190],\n [182, 106], [106, 194], [194, 182], [138, 135], [135, 192], [192, 138],\n [129, 203], [203, 98], [98, 129], [54, 21], [21, 68], [68, 54],\n [5, 51], [51, 4], [4, 5], [145, 144], [144, 23], [23, 145],\n [90, 77], [77, 91], [91, 90], [207, 205], [205, 187], [187, 207],\n [83, 201], [201, 18], [18, 83], [181, 91], [91, 182], [182, 181],\n [180, 90], [90, 181], [181, 180], [16, 85], [85, 17], [17, 16],\n [205, 206], [206, 36], [36, 205], [176, 148], [148, 140], [140, 176],\n [165, 92], [92, 39], [39, 165], [245, 193], [193, 244], [244, 245],\n [27, 159], [159, 28], [28, 27], [30, 247], [247, 161], [161, 30],\n [174, 236], [236, 196], [196, 174], [103, 54], [54, 104], [104, 103],\n [55, 193], [193, 8], [8, 55], [111, 117], [117, 31], [31, 111],\n [221, 189], [189, 55], [55, 221], [240, 98], [98, 99], [99, 240],\n [142, 126], [126, 100], [100, 142], [219, 166], [166, 218], [218, 219],\n [112, 155], [155, 26], [26, 112], [198, 209], [209, 131], [131, 198],\n [169, 135], [135, 150], [150, 169], [114, 47], [47, 217], [217, 114],\n [224, 223], [223, 53], [53, 224], [220, 45], [45, 134], [134, 220],\n [32, 211], [211, 140], [140, 32], [109, 67], [67, 108], [108, 109],\n [146, 43], [43, 91], [91, 146], [231, 230], [230, 120], [120, 231],\n [113, 226], [226, 247], [247, 113], [105, 63], [63, 52], [52, 105],\n [241, 238], [238, 242], [242, 241], [124, 46], [46, 156], [156, 124],\n [95, 78], [78, 96], [96, 95], [70, 46], [46, 63], [63, 70],\n [116, 143], [143, 227], [227, 116], [116, 123], [123, 111], [111, 116],\n [1, 44], [44, 19], [19, 1], [3, 236], [236, 51], [51, 3],\n [207, 216], [216, 205], [205, 207], [26, 154], [154, 22], [22, 26],\n [165, 39], [39, 167], [167, 165], [199, 200], [200, 208], [208, 199],\n [101, 36], [36, 100], [100, 101], [43, 57], [57, 202], [202, 43],\n [242, 20], [20, 99], [99, 242], [56, 28], [28, 157], [157, 56],\n [124, 35], [35, 113], [113, 124], [29, 160], [160, 27], [27, 29],\n [211, 204], [204, 210], [210, 211], [124, 113], [113, 46], [46, 124],\n [106, 43], [43, 204], [204, 106], [96, 62], [62, 77], [77, 96],\n [227, 137], [137, 116], [116, 227], [73, 41], [41, 72], [72, 73],\n [36, 203], [203, 142], [142, 36], [235, 64], [64, 240], [240, 235],\n [48, 49], [49, 64], [64, 48], [42, 41], [41, 74], [74, 42],\n [214, 212], [212, 207], [207, 214], [183, 42], [42, 184], [184, 183],\n [210, 169], [169, 211], [211, 210], [140, 170], [170, 176], [176, 140],\n [104, 105], [105, 69], [69, 104], [193, 122], [122, 168], [168, 193],\n [50, 123], [123, 187], [187, 50], [89, 96], [96, 90], [90, 89],\n [66, 65], [65, 107], [107, 66], [179, 89], [89, 180], [180, 179],\n [119, 101], [101, 120], [120, 119], [68, 63], [63, 104], [104, 68],\n [234, 93], [93, 227], [227, 234], [16, 15], [15, 85], [85, 16],\n [209, 129], [129, 49], [49, 209], [15, 14], [14, 86], [86, 15],\n [107, 55], [55, 9], [9, 107], [120, 100], [100, 121], [121, 120],\n [153, 145], [145, 22], [22, 153], [178, 88], [88, 179], [179, 178],\n [197, 6], [6, 196], [196, 197], [89, 88], [88, 96], [96, 89],\n [135, 138], [138, 136], [136, 135], [138, 215], [215, 172], [172, 138],\n [218, 115], [115, 219], [219, 218], [41, 42], [42, 81], [81, 41],\n [5, 195], [195, 51], [51, 5], [57, 43], [43, 61], [61, 57],\n [208, 171], [171, 199], [199, 208], [41, 81], [81, 38], [38, 41],\n [224, 53], [53, 225], [225, 224], [24, 144], [144, 110], [110, 24],\n [105, 52], [52, 66], [66, 105], [118, 229], [229, 117], [117, 118],\n [227, 34], [34, 234], [234, 227], [66, 107], [107, 69], [69, 66],\n [10, 109], [109, 151], [151, 10], [219, 48], [48, 235], [235, 219],\n [183, 62], [62, 191], [191, 183], [142, 129], [129, 126], [126, 142],\n [116, 111], [111, 143], [143, 116], [118, 117], [117, 50], [50, 118],\n [223, 222], [222, 52], [52, 223], [94, 19], [19, 141], [141, 94],\n [222, 221], [221, 65], [65, 222], [196, 3], [3, 197], [197, 196],\n [45, 220], [220, 44], [44, 45], [156, 70], [70, 139], [139, 156],\n [188, 122], [122, 245], [245, 188], [139, 71], [71, 162], [162, 139],\n [149, 170], [170, 150], [150, 149], [122, 188], [188, 196], [196, 122],\n [206, 216], [216, 92], [92, 206], [164, 2], [2, 167], [167, 164],\n [242, 141], [141, 241], [241, 242], [0, 164], [164, 37], [37, 0],\n [11, 72], [72, 12], [12, 11], [12, 38], [38, 13], [13, 12],\n [70, 63], [63, 71], [71, 70], [31, 226], [226, 111], [111, 31],\n [36, 101], [101, 205], [205, 36], [203, 206], [206, 165], [165, 203],\n [126, 209], [209, 217], [217, 126], [98, 165], [165, 97], [97, 98],\n [237, 220], [220, 218], [218, 237], [237, 239], [239, 241], [241, 237],\n [210, 214], [214, 169], [169, 210], [140, 171], [171, 32], [32, 140],\n [241, 125], [125, 237], [237, 241], [179, 86], [86, 178], [178, 179],\n [180, 85], [85, 179], [179, 180], [181, 84], [84, 180], [180, 181],\n [182, 83], [83, 181], [181, 182], [194, 201], [201, 182], [182, 194],\n [177, 137], [137, 132], [132, 177], [184, 76], [76, 183], [183, 184],\n [185, 61], [61, 184], [184, 185], [186, 57], [57, 185], [185, 186],\n [216, 212], [212, 186], [186, 216], [192, 214], [214, 187], [187, 192],\n [139, 34], [34, 156], [156, 139], [218, 79], [79, 237], [237, 218],\n [147, 123], [123, 177], [177, 147], [45, 44], [44, 4], [4, 45],\n [208, 201], [201, 32], [32, 208], [98, 64], [64, 129], [129, 98],\n [192, 213], [213, 138], [138, 192], [235, 59], [59, 219], [219, 235],\n [141, 242], [242, 97], [97, 141], [97, 2], [2, 141], [141, 97],\n [240, 75], [75, 235], [235, 240], [229, 24], [24, 228], [228, 229],\n [31, 25], [25, 226], [226, 31], [230, 23], [23, 229], [229, 230],\n [231, 22], [22, 230], [230, 231], [232, 26], [26, 231], [231, 232],\n [233, 112], [112, 232], [232, 233], [244, 189], [189, 243], [243, 244],\n [189, 221], [221, 190], [190, 189], [222, 28], [28, 221], [221, 222],\n [223, 27], [27, 222], [222, 223], [224, 29], [29, 223], [223, 224],\n [225, 30], [30, 224], [224, 225], [113, 247], [247, 225], [225, 113],\n [99, 60], [60, 240], [240, 99], [213, 147], [147, 215], [215, 213],\n [60, 20], [20, 166], [166, 60], [192, 187], [187, 213], [213, 192],\n [243, 112], [112, 244], [244, 243], [244, 233], [233, 245], [245, 244],\n [245, 128], [128, 188], [188, 245], [188, 114], [114, 174], [174, 188],\n [134, 131], [131, 220], [220, 134], [174, 217], [217, 236], [236, 174],\n [236, 198], [198, 134], [134, 236], [215, 177], [177, 58], [58, 215],\n [156, 143], [143, 124], [124, 156], [25, 110], [110, 7], [7, 25],\n [31, 228], [228, 25], [25, 31], [264, 356], [356, 368], [368, 264],\n [0, 11], [11, 267], [267, 0], [451, 452], [452, 349], [349, 451],\n [267, 302], [302, 269], [269, 267], [350, 357], [357, 277], [277, 350],\n [350, 452], [452, 357], [357, 350], [299, 333], [333, 297], [297, 299],\n [396, 175], [175, 377], [377, 396], [280, 347], [347, 330], [330, 280],\n [269, 303], [303, 270], [270, 269], [151, 9], [9, 337], [337, 151],\n [344, 278], [278, 360], [360, 344], [424, 418], [418, 431], [431, 424],\n [270, 304], [304, 409], [409, 270], [272, 310], [310, 407], [407, 272],\n [322, 270], [270, 410], [410, 322], [449, 450], [450, 347], [347, 449],\n [432, 422], [422, 434], [434, 432], [18, 313], [313, 17], [17, 18],\n [291, 306], [306, 375], [375, 291], [259, 387], [387, 260], [260, 259],\n [424, 335], [335, 418], [418, 424], [434, 364], [364, 416], [416, 434],\n [391, 423], [423, 327], [327, 391], [301, 251], [251, 298], [298, 301],\n [275, 281], [281, 4], [4, 275], [254, 373], [373, 253], [253, 254],\n [375, 307], [307, 321], [321, 375], [280, 425], [425, 411], [411, 280],\n [200, 421], [421, 18], [18, 200], [335, 321], [321, 406], [406, 335],\n [321, 320], [320, 405], [405, 321], [314, 315], [315, 17], [17, 314],\n [423, 426], [426, 266], [266, 423], [396, 377], [377, 369], [369, 396],\n [270, 322], [322, 269], [269, 270], [413, 417], [417, 464], [464, 413],\n [385, 386], [386, 258], [258, 385], [248, 456], [456, 419], [419, 248],\n [298, 284], [284, 333], [333, 298], [168, 417], [417, 8], [8, 168],\n [448, 346], [346, 261], [261, 448], [417, 413], [413, 285], [285, 417],\n [326, 327], [327, 328], [328, 326], [277, 355], [355, 329], [329, 277],\n [309, 392], [392, 438], [438, 309], [381, 382], [382, 256], [256, 381],\n [279, 429], [429, 360], [360, 279], [365, 364], [364, 379], [379, 365],\n [355, 277], [277, 437], [437, 355], [282, 443], [443, 283], [283, 282],\n [281, 275], [275, 363], [363, 281], [395, 431], [431, 369], [369, 395],\n [299, 297], [297, 337], [337, 299], [335, 273], [273, 321], [321, 335],\n [348, 450], [450, 349], [349, 348], [359, 446], [446, 467], [467, 359],\n [283, 293], [293, 282], [282, 283], [250, 458], [458, 462], [462, 250],\n [300, 276], [276, 383], [383, 300], [292, 308], [308, 325], [325, 292],\n [283, 276], [276, 293], [293, 283], [264, 372], [372, 447], [447, 264],\n [346, 352], [352, 340], [340, 346], [354, 274], [274, 19], [19, 354],\n [363, 456], [456, 281], [281, 363], [426, 436], [436, 425], [425, 426],\n [380, 381], [381, 252], [252, 380], [267, 269], [269, 393], [393, 267],\n [421, 200], [200, 428], [428, 421], [371, 266], [266, 329], [329, 371],\n [432, 287], [287, 422], [422, 432], [290, 250], [250, 328], [328, 290],\n [385, 258], [258, 384], [384, 385], [446, 265], [265, 342], [342, 446],\n [386, 387], [387, 257], [257, 386], [422, 424], [424, 430], [430, 422],\n [445, 342], [342, 276], [276, 445], [422, 273], [273, 424], [424, 422],\n [306, 292], [292, 307], [307, 306], [352, 366], [366, 345], [345, 352],\n [268, 271], [271, 302], [302, 268], [358, 423], [423, 371], [371, 358],\n [327, 294], [294, 460], [460, 327], [331, 279], [279, 294], [294, 331],\n [303, 271], [271, 304], [304, 303], [436, 432], [432, 427], [427, 436],\n [304, 272], [272, 408], [408, 304], [395, 394], [394, 431], [431, 395],\n [378, 395], [395, 400], [400, 378], [296, 334], [334, 299], [299, 296],\n [6, 351], [351, 168], [168, 6], [376, 352], [352, 411], [411, 376],\n [307, 325], [325, 320], [320, 307], [285, 295], [295, 336], [336, 285],\n [320, 319], [319, 404], [404, 320], [329, 330], [330, 349], [349, 329],\n [334, 293], [293, 333], [333, 334], [366, 323], [323, 447], [447, 366],\n [316, 15], [15, 315], [315, 316], [331, 358], [358, 279], [279, 331],\n [317, 14], [14, 316], [316, 317], [8, 285], [285, 9], [9, 8],\n [277, 329], [329, 350], [350, 277], [253, 374], [374, 252], [252, 253],\n [319, 318], [318, 403], [403, 319], [351, 6], [6, 419], [419, 351],\n [324, 318], [318, 325], [325, 324], [397, 367], [367, 365], [365, 397],\n [288, 435], [435, 397], [397, 288], [278, 344], [344, 439], [439, 278],\n [310, 272], [272, 311], [311, 310], [248, 195], [195, 281], [281, 248],\n [375, 273], [273, 291], [291, 375], [175, 396], [396, 199], [199, 175],\n [312, 311], [311, 268], [268, 312], [276, 283], [283, 445], [445, 276],\n [390, 373], [373, 339], [339, 390], [295, 282], [282, 296], [296, 295],\n [448, 449], [449, 346], [346, 448], [356, 264], [264, 454], [454, 356],\n [337, 336], [336, 299], [299, 337], [337, 338], [338, 151], [151, 337],\n [294, 278], [278, 455], [455, 294], [308, 292], [292, 415], [415, 308],\n [429, 358], [358, 355], [355, 429], [265, 340], [340, 372], [372, 265],\n [352, 346], [346, 280], [280, 352], [295, 442], [442, 282], [282, 295],\n [354, 19], [19, 370], [370, 354], [285, 441], [441, 295], [295, 285],\n [195, 248], [248, 197], [197, 195], [457, 440], [440, 274], [274, 457],\n [301, 300], [300, 368], [368, 301], [417, 351], [351, 465], [465, 417],\n [251, 301], [301, 389], [389, 251], [394, 395], [395, 379], [379, 394],\n [399, 412], [412, 419], [419, 399], [410, 436], [436, 322], [322, 410],\n [326, 2], [2, 393], [393, 326], [354, 370], [370, 461], [461, 354],\n [393, 164], [164, 267], [267, 393], [268, 302], [302, 12], [12, 268],\n [312, 268], [268, 13], [13, 312], [298, 293], [293, 301], [301, 298],\n [265, 446], [446, 340], [340, 265], [280, 330], [330, 425], [425, 280],\n [322, 426], [426, 391], [391, 322], [420, 429], [429, 437], [437, 420],\n [393, 391], [391, 326], [326, 393], [344, 440], [440, 438], [438, 344],\n [458, 459], [459, 461], [461, 458], [364, 434], [434, 394], [394, 364],\n [428, 396], [396, 262], [262, 428], [274, 354], [354, 457], [457, 274],\n [317, 316], [316, 402], [402, 317], [316, 315], [315, 403], [403, 316],\n [315, 314], [314, 404], [404, 315], [314, 313], [313, 405], [405, 314],\n [313, 421], [421, 406], [406, 313], [323, 366], [366, 361], [361, 323],\n [292, 306], [306, 407], [407, 292], [306, 291], [291, 408], [408, 306],\n [291, 287], [287, 409], [409, 291], [287, 432], [432, 410], [410, 287],\n [427, 434], [434, 411], [411, 427], [372, 264], [264, 383], [383, 372],\n [459, 309], [309, 457], [457, 459], [366, 352], [352, 401], [401, 366],\n [1, 274], [274, 4], [4, 1], [418, 421], [421, 262], [262, 418],\n [331, 294], [294, 358], [358, 331], [435, 433], [433, 367], [367, 435],\n [392, 289], [289, 439], [439, 392], [328, 462], [462, 326], [326, 328],\n [94, 2], [2, 370], [370, 94], [289, 305], [305, 455], [455, 289],\n [339, 254], [254, 448], [448, 339], [359, 255], [255, 446], [446, 359],\n [254, 253], [253, 449], [449, 254], [253, 252], [252, 450], [450, 253],\n [252, 256], [256, 451], [451, 252], [256, 341], [341, 452], [452, 256],\n [414, 413], [413, 463], [463, 414], [286, 441], [441, 414], [414, 286],\n [286, 258], [258, 441], [441, 286], [258, 257], [257, 442], [442, 258],\n [257, 259], [259, 443], [443, 257], [259, 260], [260, 444], [444, 259],\n [260, 467], [467, 445], [445, 260], [309, 459], [459, 250], [250, 309],\n [305, 289], [289, 290], [290, 305], [305, 290], [290, 460], [460, 305],\n [401, 376], [376, 435], [435, 401], [309, 250], [250, 392], [392, 309],\n [376, 411], [411, 433], [433, 376], [453, 341], [341, 464], [464, 453],\n [357, 453], [453, 465], [465, 357], [343, 357], [357, 412], [412, 343],\n [437, 343], [343, 399], [399, 437], [344, 360], [360, 440], [440, 344],\n [420, 437], [437, 456], [456, 420], [360, 420], [420, 363], [363, 360],\n [361, 401], [401, 288], [288, 361], [265, 372], [372, 353], [353, 265],\n [390, 339], [339, 249], [249, 390], [339, 448], [448, 255], [255, 339],\n];\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as coords from './facemeshcoords';\nimport { constants } from '../tfjs/constants';\nimport type { Box, Point } from '../result';\nimport { env } from '../util/env';\n\nexport const createBox = (startEndTensor) => ({ startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]), endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]) });\n\nexport const disposeBox = (t) => tf.dispose([t.startPoint, t.endPoint]);\n\nexport const getBoxSize = (box): [number, number] => [Math.abs(box.endPoint[0] - box.startPoint[0]), Math.abs(box.endPoint[1] - box.startPoint[1])];\n\nexport const getBoxCenter = (box): [number, number, number] => [box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2, 1];\n\nexport const clampBox = (box, input): Box => (box ? [\n Math.trunc(Math.max(0, box.startPoint[0])),\n Math.trunc(Math.max(0, box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), box.endPoint[0]) - Math.max(0, box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), box.endPoint[1]) - Math.max(0, box.startPoint[1])),\n] : [0, 0, 0, 0]);\n\nexport const getRawBox = (box, input): Box => (box ? [\n box.startPoint[0] / (input.shape[2] || 0),\n box.startPoint[1] / (input.shape[1] || 0),\n (box.endPoint[0] - box.startPoint[0]) / (input.shape[2] || 0),\n (box.endPoint[1] - box.startPoint[1]) / (input.shape[1] || 0),\n] : [0, 0, 0, 0]);\n\nexport const scaleBoxCoordinates = (box, factor) => {\n const startPoint: Point = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint: Point = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const cutAndResize = (box, image, cropSize) => {\n const h = image.shape[1];\n const w = image.shape[2];\n const cutBox = [box.startPoint[1] / h, box.startPoint[0] / w, box.endPoint[1] / h, box.endPoint[0] / w];\n const crop = tf.image.cropAndResize(image, [cutBox], [0], cropSize);\n const norm = tf.div(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n};\n\nexport const enlargeBox = (box, factor) => {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize: [number, number] = [factor * size[0] / 2, factor * size[1] / 2];\n return { startPoint: [center[0] - halfSize[0], center[1] - halfSize[1]] as Point, endPoint: [center[0] + halfSize[0], center[1] + halfSize[1]] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const squarifyBox = (box) => {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize = Math.max(...size) / 2;\n return { startPoint: [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)] as Point, endPoint: [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const calculateLandmarksBoundingBox = (landmarks) => {\n const x = landmarks.map((d) => d[0]);\n const y = landmarks.map((d) => d[1]);\n return { startPoint: [Math.min(...x), Math.min(...y)] as Point, endPoint: [Math.max(...x), Math.max(...y)] as Point, landmarks };\n};\n\nexport const fixedRotationMatrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n\nexport const normalizeRadians = (angle) => angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n\nexport const computeRotation = (point1, point2) => normalizeRadians(Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]));\n\nexport const radToDegrees = (rad) => rad * 180 / Math.PI;\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport const dot = (v1: number[], v2: number[]) => {\n let product = 0;\n for (let i = 0; i < v1.length; i++) product += v1[i] * v2[i];\n return product;\n};\n\nexport const getColumnFrom2DArr = (arr, columnIndex) => {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) column.push(arr[i][columnIndex]);\n return column;\n};\n\nexport const multiplyTransformMatrices = (mat1, mat2) => {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n return product;\n};\n\nexport const buildRotationMatrix = (rotation, center) => {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n};\n\nexport const invertTransformMatrix = (matrix) => {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [-dot(rotationComponent[0], translationComponent), -dot(rotationComponent[1], translationComponent)];\n return [rotationComponent[0].concat(invertedTranslation[0]), rotationComponent[1].concat(invertedTranslation[1]), [0, 0, 1]];\n};\n\nexport const rotatePoint = (homogeneousCoordinate, rotationMatrix) => [dot(homogeneousCoordinate, rotationMatrix[0]), dot(homogeneousCoordinate, rotationMatrix[1])];\n\nexport const xyDistanceBetweenPoints = (a, b) => Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n\nexport function generateAnchors(inputSize) {\n const spec = inputSize === 192\n ? { strides: [4], anchors: [1] } // facemesh-detector\n : { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] }; // blazeface\n const anchors: Array<[number, number]> = [];\n for (let i = 0; i < spec.strides.length; i++) {\n const stride = spec.strides[i];\n const gridRows = Math.floor((inputSize + stride - 1) / stride);\n const gridCols = Math.floor((inputSize + stride - 1) / stride);\n const anchorsNum = spec.anchors[i];\n for (let gridY = 0; gridY < gridRows; gridY++) {\n const anchorY = stride * (gridY + 0.5);\n for (let gridX = 0; gridX < gridCols; gridX++) {\n const anchorX = stride * (gridX + 0.5);\n for (let n = 0; n < anchorsNum; n++) anchors.push([anchorX, anchorY]);\n }\n }\n }\n return anchors;\n}\n\nexport function transformRawCoords(coordsRaw, box, angle, rotationMatrix, inputSize) {\n const boxSize = getBoxSize(box);\n const coordsScaled = coordsRaw.map((coord) => ([ // scaled around zero-point\n (boxSize[0] / inputSize) * (coord[0] - (inputSize / 2)),\n (boxSize[1] / inputSize) * (coord[1] - (inputSize / 2)),\n (coord[2] || 0),\n ]));\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n const coordsRotationMatrix = largeAngle ? buildRotationMatrix(angle, [0, 0]) : fixedRotationMatrix;\n const coordsRotated = largeAngle ? coordsScaled.map((coord) => ([...rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = largeAngle ? invertTransformMatrix(rotationMatrix) : fixedRotationMatrix;\n const boxCenter = getBoxCenter(box);\n const offsets = [dot(boxCenter, inverseRotationMatrix[0]), dot(boxCenter, inverseRotationMatrix[1])];\n return coordsRotated.map((coord) => ([\n Math.trunc(coord[0] + offsets[0]),\n Math.trunc(coord[1] + offsets[1]),\n Math.trunc(coord[2] || 0),\n ]));\n}\n\nexport function correctFaceRotation(rotate, box, input, inputSize) {\n const symmetryLine = (box.landmarks.length >= coords.meshLandmarks.count)\n ? coords.meshLandmarks.symmetryLine\n : coords.blazeFaceLandmarks.symmetryLine;\n let angle = 0; // default\n let rotationMatrix = fixedRotationMatrix; // default\n let face; // default\n\n if (rotate && env.kernels.includes('rotatewithoffset')) { // rotateWithOffset is not defined for tfjs-node\n angle = computeRotation(box.landmarks[symmetryLine[0]], box.landmarks[symmetryLine[1]]);\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n if (largeAngle) { // perform rotation only if angle is sufficiently high\n const center: Point = getBoxCenter(box);\n const centerRaw: Point = [center[0] / input.shape[2], center[1] / input.shape[1]];\n const rotated = tf.image.rotateWithOffset(input, angle, 0, centerRaw);\n rotationMatrix = buildRotationMatrix(-angle, center);\n face = cutAndResize(box, rotated, [inputSize, inputSize]);\n tf.dispose(rotated);\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n return [angle, rotationMatrix, face];\n}\n\nexport const findFaceCenter = (mesh) => {\n const x = mesh.map((m) => m[0]);\n const y = mesh.map((m) => m[1]);\n // weighted center\n /*\n const sum = (arr: number[]) => arr.reduce((prev, curr) => prev + curr, 0);\n return [sum(x) / mesh.length, sum(y) / mesh.length];\n */\n // absolute center\n return [Math.min(...x) + (Math.max(...x) - Math.min(...x)) / 2, Math.min(...y) + (Math.max(...y) - Math.min(...y)) / 2];\n};\n\nexport const calculateFaceBox = (mesh, previousBox) => {\n const center = findFaceCenter(mesh);\n const boxSize = getBoxSize(previousBox);\n const calculatedBox = {\n startPoint: [center[0] - boxSize[0] / 2, center[1] - boxSize[1] / 2] as Point,\n endPoint: [center[0] + boxSize[0] / 2, center[1] + boxSize[1] / 2] as Point,\n };\n return calculatedBox;\n};\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './facemeshutil';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport type { Point } from '../result';\n\nconst keypointsCount = 6;\nconst faceBoxScaleFactor = 1.4;\nlet model: GraphModel | null;\nlet anchors: Tensor | null = null;\nlet inputSize = 0;\nlet inputSizeT: Tensor | null = null;\n\ntype DetectBox = { startPoint: Point, endPoint: Point, landmarks: Array, confidence: number };\n\nexport const size = () => inputSize;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.detector?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n inputSizeT = tf.scalar(inputSize, 'int32') as Tensor;\n anchors = tf.tensor2d(util.generateAnchors(inputSize)) as Tensor;\n return model;\n}\n\nfunction decodeBoxes(boxOutputs: Tensor) {\n const t: Record = {};\n t.boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n t.centers = tf.add(t.boxStarts, anchors);\n t.boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n t.boxSizesNormalized = tf.div(t.boxSizes, inputSizeT);\n t.centersNormalized = tf.div(t.centers, inputSizeT);\n t.halfBoxSize = tf.div(t.boxSizesNormalized, constants.tf2);\n t.starts = tf.sub(t.centersNormalized, t.halfBoxSize);\n t.ends = tf.add(t.centersNormalized, t.halfBoxSize);\n t.startNormalized = tf.mul(t.starts, inputSizeT);\n t.endNormalized = tf.mul(t.ends, inputSizeT);\n const boxes = tf.concat2d([t.startNormalized, t.endNormalized], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n\nexport async function getBoxes(inputImage: Tensor, config: Config) {\n // sanity check on input\n if ((!inputImage) || (inputImage['isDisposedInternal']) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return [];\n const t: Record = {};\n t.resized = tf.image.resizeBilinear(inputImage, [inputSize, inputSize]);\n t.div = tf.div(t.resized, constants.tf127);\n t.normalized = tf.sub(t.div, constants.tf05);\n const res = model?.execute(t.normalized) as Tensor[];\n if (Array.isArray(res) && res.length > 2) { // pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n t.concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n t.concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n t.concat = tf.concat([t.concat512, t.concat384], 1);\n t.batch = tf.squeeze(t.concat, 0);\n } else if (Array.isArray(res)) { // new facemesh-detection tfhub model\n t.batch = tf.squeeze(res[0]);\n } else { // original blazeface tfhub model\n t.batch = tf.squeeze(res);\n }\n tf.dispose(res);\n t.boxes = decodeBoxes(t.batch);\n t.logits = tf.slice(t.batch, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.logits);\n t.scores = tf.squeeze(t.sigmoid);\n t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, (config.face.detector?.maxDetected || 0), (config.face.detector?.iouThreshold || 0), (config.face.detector?.minConfidence || 0));\n const nms = await t.nms.array() as number[];\n const boxes: Array = [];\n const scores = await t.scores.data();\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > (config.face.detector?.minConfidence || 0)) {\n const b: Record = {};\n b.bbox = tf.slice(t.boxes, [nms[i], 0], [1, -1]);\n b.slice = tf.slice(t.batch, [nms[i], keypointsCount - 1], [1, -1]);\n b.squeeze = tf.squeeze(b.slice);\n b.landmarks = tf.reshape(b.squeeze, [keypointsCount, -1]);\n const points = await b.bbox.data();\n const rawBox = {\n startPoint: [points[0], points[1]] as Point,\n endPoint: [points[2], points[3]] as Point,\n landmarks: (await b.landmarks.array()) as Point[],\n confidence,\n };\n const scaledBox = util.scaleBoxCoordinates(rawBox, [(inputImage.shape[2] || 0) / inputSize, (inputImage.shape[1] || 0) / inputSize]);\n const enlargedBox = util.enlargeBox(scaledBox, config.face['scale'] || faceBoxScaleFactor);\n const squaredBox = util.squarifyBox(enlargedBox);\n boxes.push(squaredBox);\n Object.keys(b).forEach((tensor) => tf.dispose(b[tensor]));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n", "/* eslint-disable no-multi-spaces */\n\nexport const kpt: Array = [\n 'nose', // 0\n 'leftEyeInside', // 1\n 'leftEye', // 2\n 'leftEyeOutside', // 3\n 'rightEyeInside', // 4\n 'rightEye', // 5\n 'rightEyeOutside', // 6\n 'leftEar', // 7\n 'rightEar', // 8\n 'leftMouth', // 9\n 'rightMouth', // 10\n 'leftShoulder', // 11\n 'rightShoulder', // 12\n 'leftElbow', // 13\n 'rightElbow', // 14\n 'leftWrist', // 15\n 'rightWrist', // 16\n 'leftPinky', // 17\n 'rightPinky', // 18\n 'leftIndex', // 19\n 'rightIndex', // 20\n 'leftThumb', // 21\n 'rightThumb', // 22\n 'leftHip', // 23\n 'rightHip', // 24\n 'leftKnee', // 25\n 'rightKnee', // 26\n 'leftAnkle', // 27\n 'rightAnkle', // 28\n 'leftHeel', // 29\n 'rightHeel', // 30\n 'leftFoot', // 31\n 'rightFoot', // 32\n 'bodyCenter', // 33\n 'bodyTop', // 34\n 'leftPalm', // 35 // z-coord not ok\n 'leftHand', // 36 // similar to wrist but z-coord not ok\n 'rightPalm', // 37 // z-coord not ok\n 'rightHand', // 38 // similar to wrist but z-coord not ok\n];\n\nexport const connected: Record = {\n shoulders: ['leftShoulder', 'rightShoulder'],\n hips: ['rightHip', 'leftHip'],\n mouth: ['leftMouth', 'rightMouth'],\n leftLegUpper: ['leftHip', 'leftKnee'],\n leftLegLower: ['leftKnee', 'leftAnkle'],\n leftFoot: ['leftAnkle', 'leftHeel', 'leftFoot'],\n leftTorso: ['leftShoulder', 'leftHip'],\n leftArmUpper: ['leftShoulder', 'leftElbow'],\n leftArmLower: ['leftElbow', 'leftWrist'],\n leftHand: ['leftWrist', 'leftPalm'],\n leftHandPinky: ['leftPalm', 'leftPinky'],\n leftHandIndex: ['leftPalm', 'leftIndex'],\n leftHandThumb: ['leftPalm', 'leftThumb'],\n leftEyeOutline: ['leftEyeInside', 'leftEyeOutside'],\n rightLegUpper: ['rightHip', 'rightKnee'],\n rightLegLower: ['rightKnee', 'rightAnkle'],\n rightFoot: ['rightAnkle', 'rightHeel', 'rightFoot'],\n rightTorso: ['rightShoulder', 'rightHip'],\n rightArmUpper: ['rightShoulder', 'rightElbow'],\n rightArmLower: ['rightElbow', 'rightWrist'],\n rightHand: ['rightWrist', 'rightPalm'],\n rightHandPinky: ['rightPalm', 'rightPinky'],\n rightHandIndex: ['rightPalm', 'rightIndex'],\n rightHandThumb: ['rightPalm', 'rightThumb'],\n rightEyeOutline: ['rightEyeInside', 'rightEyeOutside'],\n};\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../tfjs/types';\nimport type { Box } from '../result';\nimport type { Config } from '../config';\n\ninterface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nconst inputSize = 224;\nlet anchorTensor: { x, y };\nconst numLayers = 5;\nconst strides = [8, 16, 32, 32, 32];\n\nexport async function createAnchors() {\n const anchors: Array<{ x: number, y: number }> = [];\n let layerId = 0;\n while (layerId < numLayers) {\n let anchorCount = 0;\n let lastSameStrideLayer = layerId;\n while (lastSameStrideLayer < strides.length && strides[lastSameStrideLayer] === strides[layerId]) {\n anchorCount += 2;\n lastSameStrideLayer++;\n }\n const stride = strides[layerId];\n const featureMapHeight = Math.ceil(inputSize / stride);\n const featureMapWidth = Math.ceil(inputSize / stride);\n for (let y = 0; y < featureMapHeight; ++y) {\n for (let x = 0; x < featureMapWidth; ++x) {\n for (let anchorId = 0; anchorId < anchorCount; ++anchorId) {\n anchors.push({ x: (x + 0.5) / featureMapWidth, y: (y + 0.5) / featureMapHeight });\n }\n }\n }\n layerId = lastSameStrideLayer;\n }\n anchorTensor = { x: tf.tensor1d(anchors.map((a) => a.x)), y: tf.tensor1d(anchors.map((a) => a.y)) };\n}\n\nconst cropFactor = [5.0, 5.0];\nfunction decodeBoxes(boxesTensor, anchor): Tensor {\n return tf.tidy(() => {\n const split = tf.split(boxesTensor, 12, 1); // first 4 are box data [x,y,w,h] and 4 are keypoints data [x,y] for total of 12\n let xCenter = tf.squeeze(split[0]);\n let yCenter = tf.squeeze(split[1]);\n let width = tf.squeeze(split[2]);\n let height = tf.squeeze(split[3]);\n xCenter = tf.add(tf.div(xCenter, inputSize), anchor.x);\n yCenter = tf.add(tf.div(yCenter, inputSize), anchor.y);\n width = tf.mul(tf.div(width, inputSize), cropFactor[0]);\n height = tf.mul(tf.div(height, inputSize), cropFactor[1]);\n const xMin = tf.sub(xCenter, tf.div(width, 2));\n const yMin = tf.sub(yCenter, tf.div(height, 2));\n const boxes = tf.stack([xMin, yMin, width, height], 1);\n return boxes;\n });\n}\n\nexport async function decode(boxesTensor: Tensor, logitsTensor: Tensor, config: Config, outputSize: [number, number]): Promise {\n const t: Record = {};\n t.boxes = decodeBoxes(boxesTensor, anchorTensor);\n t.scores = tf.sigmoid(logitsTensor);\n t.argmax = tf.argMax(t.scores);\n const i = (await t.argmax.data())[0] as number;\n const scores = await t.scores.data();\n const detected: Array<{ box: Box, boxRaw: Box, score: number }> = [];\n const minScore = (config.body['detector'] && config.body['detector']['minConfidence']) ? config.body['detector']['minConfidence'] : 0;\n if (scores[i] >= minScore) {\n const boxes = await t.boxes.array();\n const boxRaw: Box = boxes[i];\n const box: Box = [boxRaw[0] * outputSize[0], boxRaw[1] * outputSize[1], boxRaw[2] * outputSize[0], boxRaw[3] * outputSize[1]];\n // console.log(box);\n detected.push({ box, boxRaw, score: scores[i] });\n }\n /*\n t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, 1, config.body.detector?.minConfidence || 0.1, config.body.detector?.iouThreshold || 0.1);\n const boxes = t.boxes.arraySync();\n const scores = t.scores.dataSync();\n const nms = t.nms.dataSync();\n const detected: Array = [];\n for (const i of Array.from(nms)) {\n const boxRaw: Box = boxes[i];\n const box: Box = [boxRaw[0] * outputSize[0], boxRaw[0] * outputSize[1], boxRaw[3] * outputSize[0], boxRaw[2] * outputSize[1]];\n detected.push({ box, boxRaw, score: scores[i] });\n }\n */\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return detected;\n}\n", "import type { Point, Box } from '../result';\n\nexport function calc(keypoints: Array, outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const box: Box = [min[0], min[1], max[0] - min[0], max[1] - min[1]];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function square(keypoints: Array, outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const center = [(min[0] + max[0]) / 2, (min[1] + max[1]) / 2]; // find center x and y coord of all fingers\n const dist = Math.max(center[0] - min[0], center[1] - min[1], -center[0] + max[0], -center[1] + max[1]); // largest distance from center in any direction\n const box: Box = [Math.trunc(center[0] - dist), Math.trunc(center[1] - dist), Math.trunc(2 * dist), Math.trunc(2 * dist)];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function scale(box: Box, scaleFact: number) {\n const dist = [box[2] * scaleFact, box[3] * scaleFact];\n const newBox: Box = [\n box[0] - (dist[0] - box[2]) / 2,\n box[1] - (dist[1] - box[3]) / 2,\n dist[0],\n dist[1],\n ];\n return newBox;\n}\n\nexport function crop(box: Box) { // [y1, x1, y2, x2] clamped to 0..1\n const yxBox: Box = [Math.max(0, box[1]), Math.max(0, box[0]), Math.min(1, box[3] + box[1]), Math.min(1, box[2] + box[0])];\n return yxBox;\n}\n", "/**\n * BlazePose model implementation\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { log, now } from '../util/util';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, Box, Point, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport * as coords from './blazeposecoords';\nimport * as detect from './blazeposedetector';\nimport * as box from '../util/box';\n\nconst env = { initial: true };\n// const models: [GraphModel | null, GraphModel | null] = [null, null];\nconst models: { detector: GraphModel | null, landmarks: GraphModel | null } = { detector: null, landmarks: null };\nconst inputSize: { detector: [number, number], landmarks: [number, number] } = { detector: [224, 224], landmarks: [256, 256] };\nlet skipped = Number.MAX_SAFE_INTEGER;\nconst outputNodes: { detector: string[], landmarks: string[] } = {\n landmarks: ['ld_3d', 'activation_segmentation', 'activation_heatmap', 'world_3d', 'output_poseflag'],\n detector: [],\n};\n\nlet cache: BodyResult | null = null;\nlet cropBox: Box | undefined;\nlet padding: [number, number][] = [[0, 0], [0, 0], [0, 0], [0, 0]];\nlet lastTime = 0;\n\nconst sigmoid = (x) => (1 - (1 / (1 + Math.exp(x))));\n\nexport async function loadDetect(config: Config): Promise {\n if (env.initial) models.detector = null;\n if (!models.detector && config.body['detector'] && config.body['detector']['modelPath'] || '') {\n models.detector = await loadModel(config.body['detector']['modelPath']);\n const inputs = Object.values(models.detector.modelSignature['inputs']);\n inputSize.detector[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize.detector[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug && models.detector) log('cached model:', models.detector['modelUrl']);\n await detect.createAnchors();\n return models.detector as GraphModel;\n}\n\nexport async function loadPose(config: Config): Promise {\n if (env.initial) models.landmarks = null;\n if (!models.landmarks) {\n models.landmarks = await loadModel(config.body.modelPath);\n const inputs = Object.values(models.landmarks.modelSignature['inputs']);\n inputSize.landmarks[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize.landmarks[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models.landmarks['modelUrl']);\n return models.landmarks;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models.detector) await loadDetect(config);\n if (!models.landmarks) await loadPose(config);\n return [models.detector, models.landmarks];\n}\n\nasync function prepareImage(input: Tensor, size: number): Promise {\n const t: Record = {};\n if (!input.shape || !input.shape[1] || !input.shape[2]) return input;\n let final: Tensor;\n if (cropBox) {\n t.cropped = tf.image.cropAndResize(input, [cropBox], [0], [input.shape[1], input.shape[2]]); // if we have cached box use it to crop input\n }\n if (input.shape[1] !== input.shape[2]) { // only pad if width different than height\n const height: [number, number] = [\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n ];\n const width: [number, number] = [\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n ];\n padding = [\n [0, 0], // dont touch batch\n height, // height before&after\n width, // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(t.cropped || input, padding); // use cropped box if it exists\n t.resize = tf.image.resizeBilinear(t.pad, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else if (input.shape[1] !== size) { // if input needs resizing\n t.resize = tf.image.resizeBilinear(t.cropped || input, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else { // if input is already in a correct resolution just normalize it\n final = tf.div(t.cropped || input, constants.tf255);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nfunction rescaleKeypoints(keypoints: Array, outputSize: [number, number]): Array {\n for (const kpt of keypoints) { // first rescale due to padding\n kpt.position = [\n Math.trunc(kpt.position[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0] - padding[2][0]),\n Math.trunc(kpt.position[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1] - padding[1][0]),\n kpt.position[2] as number,\n ];\n kpt.positionRaw = [kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1], 2 * (kpt.position[2] as number) / (outputSize[0] + outputSize[1])];\n }\n if (cropBox) { // second rescale due to cropping\n for (const kpt of keypoints) {\n kpt.positionRaw = [\n kpt.positionRaw[0] + cropBox[1], // correct offset due to crop\n kpt.positionRaw[1] + cropBox[0], // correct offset due to crop\n kpt.positionRaw[2] as number,\n ];\n kpt.position = [\n Math.trunc(kpt.positionRaw[0] * outputSize[0]),\n Math.trunc(kpt.positionRaw[1] * outputSize[1]),\n kpt.positionRaw[2] as number,\n ];\n }\n }\n return keypoints;\n}\n\nasync function fixKeypoints(keypoints: Array) {\n // palm z-coord is incorrect around near-zero so we approximate it\n const leftPalm = keypoints.find((k) => k.part === 'leftPalm') as BodyKeypoint;\n const leftWrist = keypoints.find((k) => k.part === 'leftWrist') as BodyKeypoint;\n const leftIndex = keypoints.find((k) => k.part === 'leftIndex') as BodyKeypoint;\n leftPalm.position[2] = ((leftWrist.position[2] || 0) + (leftIndex.position[2] || 0)) / 2;\n const rightPalm = keypoints.find((k) => k.part === 'rightPalm') as BodyKeypoint;\n const rightWrist = keypoints.find((k) => k.part === 'rightWrist') as BodyKeypoint;\n const rightIndex = keypoints.find((k) => k.part === 'rightIndex') as BodyKeypoint;\n rightPalm.position[2] = ((rightWrist.position[2] || 0) + (rightIndex.position[2] || 0)) / 2;\n}\n\nasync function detectLandmarks(input: Tensor, config: Config, outputSize: [number, number]): Promise {\n /**\n * t.ld: 39 keypoints [x,y,z,score,presence] normalized to input size\n * t.segmentation:\n * t.heatmap:\n * t.world: 39 keypoints [x,y,z] normalized to -1..1\n * t.poseflag: body score\n */\n const t: Record = {};\n [t.ld/* 1,195(39*5) */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117(39*3) */, t.poseflag/* 1,1 */] = models.landmarks?.execute(input, outputNodes.landmarks) as Tensor[]; // run model\n const poseScore = (await t.poseflag.data())[0];\n const points = await t.ld.data();\n const distances = await t.world.data();\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor])); // dont need tensors after this\n const keypointsRelative: Array = [];\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n const score = sigmoid(points[depth * i + 3]);\n const presence = sigmoid(points[depth * i + 4]);\n const adjScore = Math.trunc(100 * score * presence * poseScore) / 100;\n const positionRaw: Point = [points[depth * i + 0] / inputSize.landmarks[0], points[depth * i + 1] / inputSize.landmarks[1], points[depth * i + 2] + 0];\n const position: Point = [Math.trunc(outputSize[0] * positionRaw[0]), Math.trunc(outputSize[1] * positionRaw[1]), positionRaw[2] as number];\n const distance: Point = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0];\n keypointsRelative.push({ part: coords.kpt[i] as BodyLandmark, positionRaw, position, distance, score: adjScore });\n }\n if (poseScore < (config.body.minConfidence || 0)) return null;\n fixKeypoints(keypointsRelative);\n const keypoints: Array = rescaleKeypoints(keypointsRelative, outputSize); // keypoints were relative to input image which is padded\n const kpts = keypoints.map((k) => k.position);\n const boxes = box.calc(kpts, [outputSize[0], outputSize[1]]); // now find boxes based on rescaled keypoints\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body = { id: 0, score: Math.trunc(100 * poseScore) / 100, box: boxes.box, boxRaw: boxes.boxRaw, keypoints, annotations };\n return body;\n}\n\n/*\ninterface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nfunction rescaleBoxes(boxes: Array, outputSize: [number, number]): Array {\n for (const b of boxes) {\n b.box = [\n Math.trunc(b.box[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),\n Math.trunc(b.box[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),\n Math.trunc(b.box[2] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),\n Math.trunc(b.box[3] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),\n ];\n b.boxRaw = [b.box[0] / outputSize[0], b.box[1] / outputSize[1], b.box[2] / outputSize[0], b.box[3] / outputSize[1]];\n }\n return boxes;\n}\n\nasync function detectBoxes(input: Tensor, config: Config, outputSize: [number, number]) {\n const t: Record = {};\n t.res = models.detector?.execute(input, ['Identity']) as Tensor; //\n t.logitsRaw = tf.slice(t.res, [0, 0, 0], [1, -1, 1]);\n t.boxesRaw = tf.slice(t.res, [0, 0, 1], [1, -1, -1]);\n t.logits = tf.squeeze(t.logitsRaw);\n t.boxes = tf.squeeze(t.boxesRaw);\n const boxes = await detect.decode(t.boxes, t.logits, config, outputSize);\n rescaleBoxes(boxes, outputSize);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n*/\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const outputSize: [number, number] = [input.shape[2] || 0, input.shape[1] || 0];\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && cache !== null) {\n skipped++;\n } else {\n const t: Record = {};\n /*\n if (config.body['detector'] && config.body['detector']['enabled']) {\n t.detector = await prepareImage(input, 224);\n const boxes = await detectBoxes(t.detector, config, outputSize);\n }\n */\n t.landmarks = await prepareImage(input, 256); // padded and resized\n cache = await detectLandmarks(t.landmarks, config, outputSize);\n /*\n cropBox = [0, 0, 1, 1]; // reset crop coordinates\n if (cache?.boxRaw && config.skipAllowed) {\n const cx = (2.0 * cache.boxRaw[0] + cache.boxRaw[2]) / 2;\n const cy = (2.0 * cache.boxRaw[1] + cache.boxRaw[3]) / 2;\n let size = cache.boxRaw[2] > cache.boxRaw[3] ? cache.boxRaw[2] : cache.boxRaw[3];\n size = (size * 1.0) / 2; // enlarge and half it\n if (cx > 0.1 && cx < 0.9 && cy > 0.1 && cy < 0.9 && size > 0.1) { // only update if box is sane\n const y = 0; // cy - size;\n const x = cx - size;\n cropBox = [y, x, y + 1, x + 1]; // [y0,x0,y1,x1] used for cropping but width/height are not yet implemented so we only reposition image to center of body\n }\n }\n */\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n lastTime = now();\n skipped = 0;\n }\n return cache ? [cache] : [];\n}\n", "/**\n * CoCo Labels used by object detection implementations\n */\nexport const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "/**\n * CenterNet object detection model implementation\n *\n * Based on: [**NanoDet**](https://github.com/RangiLyu/nanodet)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet last: ObjectResult[] = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n // fakeOps(['floormod'], config);\n model = await loadModel(config.object.modelPath);\n const inputs = Object.values(model.modelSignature['inputs']);\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor | null, outputShape: [number, number], config: Config) {\n if (!res) return [];\n const t: Record = {};\n const results: Array = [];\n const detections = await res.array() as number[][][];\n t.squeeze = tf.squeeze(res);\n const arr = tf.split(t.squeeze, 6, 1) as Tensor[]; // x1, y1, x2, y2, score, class\n t.stack = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n t.boxes = tf.squeeze(t.stack);\n t.scores = tf.squeeze(arr[4]);\n t.classes = tf.squeeze(arr[5]);\n tf.dispose([res, ...arr]);\n t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, config.object.maxDetected, config.object.iouThreshold, (config.object.minConfidence || 0));\n const nms = await t.nms.data();\n let i = 0;\n for (const id of Array.from(nms)) {\n const score = Math.trunc(100 * detections[0][id][4]) / 100;\n const classVal = detections[0][id][5];\n const label = labels[classVal].label as ObjectType;\n const [x, y] = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n ];\n const boxRaw: Box = [\n x,\n y,\n detections[0][id][2] / inputSize - x,\n detections[0][id][3] / inputSize - y,\n ];\n const box: Box = [\n Math.trunc(boxRaw[0] * outputShape[0]),\n Math.trunc(boxRaw[1] * outputShape[1]),\n Math.trunc(boxRaw[2] * outputShape[0]),\n Math.trunc(boxRaw[3] * outputShape[1]),\n ];\n results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [input.shape[2] || 0, input.shape[1] || 0] as [number, number];\n const resize = tf.image.resizeBilinear(input, [inputSize, inputSize]);\n const objectT = config.object.enabled ? model?.execute(resize, ['tower_0/detections']) as Tensor : null;\n lastTime = now();\n tf.dispose(resize);\n\n const obj = await process(objectT, outputSize, config);\n last = obj;\n\n resolve(obj);\n });\n}\n", "export const kpt: Array = [\n 'head',\n 'neck',\n 'rightShoulder',\n 'rightElbow',\n 'rightWrist',\n 'chest',\n 'leftShoulder',\n 'leftElbow',\n 'leftWrist',\n 'bodyCenter',\n 'rightHip',\n 'rightKnee',\n 'rightAnkle',\n 'leftHip',\n 'leftKnee',\n 'leftAnkle',\n];\n\nexport const connected: Record = {\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "/**\n * EfficientPose model implementation\n *\n * Based on: [**EfficientPose**](https://github.com/daniegr/EfficientPose)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport * as coords from './efficientposecoords';\nimport { constants } from '../tfjs/constants';\nimport type { BodyResult, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet lastTime = 0;\nconst cache: BodyResult = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} as Record };\n\n// const keypoints: Array = [];\n// let box: Box = [0, 0, 0, 0];\n// let boxRaw: Box = [0, 0, 0, 0];\n// let score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// performs argmax and max functions on a 2d tensor\nasync function max2d(inputs, minScore): Promise<[number, number, number]> {\n const [width, height] = inputs.shape;\n const reshaped = tf.reshape(inputs, [height * width]); // combine all data\n const max = tf.max(reshaped, 0);\n const newScore: number = (await max.data())[0]; // get highest score\n if (newScore > minScore) { // skip coordinate calculation is score is too low\n const coordinates = tf.argMax(reshaped, 0);\n const mod = tf.mod(coordinates, width);\n const x = (await mod.data())[0];\n const div = tf.div(coordinates, width);\n const y: number = (await div.data())[0];\n tf.dispose([reshaped, max, coordinates, mod, div]);\n return [x, y, newScore];\n } else {\n tf.dispose([reshaped, max]);\n return [0, 0, newScore];\n }\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && Object.keys(cache.keypoints).length > 0) {\n skipped++;\n return [cache];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n if (!model?.inputs[0].shape) return null;\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const enhance = tf.mul(resize, constants.tf2);\n const norm = tf.sub(enhance, constants.tf1);\n return norm;\n });\n let resT;\n if (config.body.enabled) resT = model?.execute(tensor);\n lastTime = now();\n tf.dispose(tensor);\n\n if (resT) {\n cache.keypoints.length = 0;\n const squeeze = tf.squeeze(resT);\n tf.dispose(resT);\n // body parts are basically just a stack of 2d tensors\n const stack = tf.unstack(squeeze, 2);\n tf.dispose(squeeze);\n\n // process each unstacked tensor as a separate body part\n for (let id = 0; id < stack.length; id++) {\n // actual processing to get coordinates and score\n const [x, y, partScore] = await max2d(stack[id], config.body.minConfidence);\n if (partScore > (config.body?.minConfidence || 0)) {\n cache.keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw: [ // normalized to 0..1\n // @ts-ignore model is not undefined here\n x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],\n ],\n position: [ // normalized to input image size\n // @ts-ignore model is not undefined here\n Math.round(image.shape[2] * x / model.inputs[0].shape[2]), Math.round(image.shape[1] * y / model.inputs[0].shape[1]),\n ],\n });\n }\n }\n stack.forEach((s) => tf.dispose(s));\n }\n cache.score = cache.keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = cache.keypoints.map((a) => a.position[0]);\n const y = cache.keypoints.map((a) => a.position[1]);\n cache.box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = cache.keypoints.map((a) => a.positionRaw[0]);\n const yRaw = cache.keypoints.map((a) => a.positionRaw[1]);\n cache.boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = cache.keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = cache.keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n cache.annotations[name] = pt;\n }\n resolve([cache]);\n });\n}\n", "/**\n * Emotion model implementation\n *\n * [**Oarriaga**](https://github.com/oarriaga/face_classification)\n */\n\nimport type { Emotion } from '../result';\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model: GraphModel | null;\nconst last: Array> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.emotion?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise> {\n if (!model) return [];\n const skipFrame = skipped < (config.face.emotion?.skipFrames || 0);\n const skipTime = (config.face.emotion?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const obj: Array<{ score: number, emotion: Emotion }> = [];\n if (config.face.emotion?.enabled) {\n const t: Record = {};\n const inputSize = model?.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n t.resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n // const box = [[0.15, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const resize = tf.image.cropAndResize(image, box, [0], [inputSize, inputSize]);\n // [t.red, t.green, t.blue] = tf.split(t.resize, 3, 3);\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n // t.redNorm = tf.mul(t.red, rgb[0]);\n // t.greenNorm = tf.mul(t.green, rgb[1]);\n // t.blueNorm = tf.mul(t.blue, rgb[2]);\n // t.grayscale = tf.addN([t.redNorm, t.greenNorm, t.blueNorm]);\n t.channels = tf.mul(t.resize, constants.rgb);\n t.grayscale = tf.sum(t.channels, 3, true);\n t.grayscaleSub = tf.sub(t.grayscale, constants.tf05);\n t.grayscaleMul = tf.mul(t.grayscaleSub, constants.tf2);\n t.emotion = model?.execute(t.grayscaleMul) as Tensor; // result is already in range 0..1, no need for additional activation\n lastTime = now();\n const data = await t.emotion.data();\n for (let i = 0; i < data.length; i++) {\n if (data[i] > (config.face.emotion?.minConfidence || 0)) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] as Emotion });\n }\n obj.sort((a, b) => b.score - a.score);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * MobileFaceNet model implementation\n *\n * Based on: [**BecauseofAI MobileFace**](https://github.com/becauseofAI/MobileFace)\n *\n * Obsolete and replaced by `faceres` that performs age/gender/descriptor analysis\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['mobilefacenet'].modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n/*\n// convert to black&white to avoid colorization impact\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\nconst [red, green, blue] = tf.split(crop, 3, 3);\nconst redNorm = tf.mul(red, rgb[0]);\nconst greenNorm = tf.mul(green, rgb[1]);\nconst blueNorm = tf.mul(blue, rgb[2]);\nconst grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\nconst merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n\n// optional increase image contrast\n// or do it per-channel so mean is done on each channel\n// or do it based on histogram\nconst mean = merge.mean();\nconst factor = 5;\nconst contrast = merge.sub(mean).mul(factor).add(mean);\n*/\n\nexport async function predict(input: Tensor, config: Config, idx, count): Promise {\n if (!model) return [];\n const skipFrame = skipped < (config.face['mobilefacenet']?.skipFrames || 0);\n const skipTime = (config.face['mobilefacenet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n return new Promise(async (resolve) => {\n let data: Array = [];\n if (config.face['mobilefacenet']?.enabled && model?.inputs[0].shape) {\n const t: Record = {};\n t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model\n // do a tight crop of image and resize it to fit the model\n // const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n t.data = model?.execute(t.crop) as Tensor;\n /*\n // optional normalize outputs with l2 normalization\n const scaled = tf.tidy(() => {\n const l2 = res.norm('euclidean');\n const scale = res.div(l2);\n return scale;\n });\n\n // optional reduce feature vector complexity\n const reshape = tf.reshape(res, [128, 2]); // split 256 vectors into 128 x 2\n const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it\n */\n const output = await t.data.data();\n data = Array.from(output); // convert typed array to simple array\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = data;\n lastCount = count;\n lastTime = now();\n resolve(data);\n });\n}\n", "/**\n * InsightFace model implementation\n *\n * Based on: [**DeepInsight InsightFace**](https://github.com/deepinsight/insightface)\n *\n * Alternative face embedding detection\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['insightface'].modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(input: Tensor, config: Config, idx, count): Promise {\n if (!model) return [];\n const skipFrame = skipped < (config.face['insightface']?.skipFrames || 0);\n const skipTime = (config.face['insightface']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n return new Promise(async (resolve) => {\n let data: Array = [];\n if (config.face['insightface']?.enabled && model?.inputs[0].shape) {\n const t: Record = {};\n t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model\n // do a tight crop of image and resize it to fit the model\n // const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n t.data = model?.execute(t.crop) as Tensor;\n const output = await t.data.data();\n data = Array.from(output); // convert typed array to simple array\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = data;\n lastCount = count;\n lastTime = now();\n resolve(data);\n });\n}\n", "import * as coords from './facemeshcoords';\nimport * as util from './facemeshutil';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { Point } from '../result';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\n\nconst irisEnlarge = 2.3;\n\nconst leftOutline = coords.meshAnnotations['leftEyeLower0'];\nconst rightOutline = coords.meshAnnotations['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.iris?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n if (inputSize === -1) inputSize = 64;\n return model;\n}\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates and update the z coordinate to be an average of the original and the new.\nexport function replaceIrisCoords(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.irisIndices.length; i++) {\n const { key, indices } = coords.irisIndices[i];\n const originalIndices = coords.meshAnnotations[`${prefix}${key}`];\n if (!keys || keys.includes(key)) {\n for (let j = 0; j < indices.length; j++) {\n const index = indices[j];\n rawCoords[originalIndices[j]] = [\n newCoords[index][0],\n newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n\nexport const getLeftToRightEyeDepthDifference = (rawCoords) => {\n const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n return leftEyeZ - rightEyeZ;\n};\n\n// Returns a box describing a cropped region around the eye fit for passing to the iris model.\nexport const getEyeBox = (rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, meshSize, flip = false) => {\n const box = util.squarifyBox(util.enlargeBox(util.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), irisEnlarge));\n const boxSize = util.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / meshSize,\n box.startPoint[0] / meshSize, box.endPoint[1] / meshSize,\n box.endPoint[0] / meshSize,\n ]], [0], [inputSize, inputSize]);\n if (flip && env.kernels.includes('flipleftright')) {\n const flipped = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n tf.dispose(crop);\n crop = flipped;\n }\n return { box, boxSize, crop };\n};\n\n// Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\nexport const getEyeCoords = (eyeData, eyeBox, eyeBoxSize, flip = false) => {\n const eyeRawCoords: Array = [];\n for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n const x = eyeData[i * 3];\n const y = eyeData[i * 3 + 1];\n const z = eyeData[i * 3 + 2];\n eyeRawCoords.push([\n (flip ? (1 - (x / inputSize)) : (x / inputSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / inputSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n ]);\n }\n return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n};\n\n// The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\nexport const getAdjustedIrisCoords = (rawCoords, irisCoords, direction) => {\n const upperCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n return irisCoords.map((coord, i) => {\n let z = averageZ;\n if (i === 2) {\n z = upperCenterZ;\n } else if (i === 4) {\n z = lowerCenterZ;\n }\n return [coord[0], coord[1], z];\n });\n};\n\nexport async function augmentIris(rawCoords, face, config, meshSize) {\n if (!model) {\n if (config.debug) log('face mesh iris detection requested, but model is not loaded');\n return rawCoords;\n }\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], meshSize, true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1], meshSize, true);\n const combined = tf.concat([leftEyeCrop, rightEyeCrop]);\n tf.dispose(leftEyeCrop);\n tf.dispose(rightEyeCrop);\n const eyePredictions = model.execute(combined) as Tensor;\n tf.dispose(combined);\n const eyePredictionsData = await eyePredictions.data();\n tf.dispose(eyePredictions);\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize, false);\n const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceIrisCoords(rawCoords, leftEyeRawCoords, 'left', null);\n replaceIrisCoords(rawCoords, rightEyeRawCoords, 'right', null);\n // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged so we only update a single contour line above and below the eye.\n } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n replaceIrisCoords(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceIrisCoords(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n return newCoords;\n}\n", "// @tensorflow/tfjs-models/face-landmark-detection/src/constants.ts\n// https://github.com/google/mediapipe/mediapipe/python/solutions/face_mesh_connections.py\n\ntype PairArray = Array<[number, number]>;\n\nconst LIPS_CONNECTIONS: PairArray = [\n [61, 146], [146, 91], [91, 181], [181, 84], [84, 17], [17, 314], [314, 405], [405, 321], [321, 375], [375, 291], [61, 185], [185, 40], [40, 39], [39, 37], [37, 0], [0, 267], [267, 269], [269, 270], [270, 409], [409, 291],\n [78, 95], [95, 88], [88, 178], [178, 87], [87, 14], [14, 317], [317, 402], [402, 318], [318, 324], [324, 308], [78, 191], [191, 80], [80, 81], [81, 82], [82, 13], [13, 312], [312, 311], [311, 310], [310, 415], [415, 308],\n];\n\nconst LEFT_EYE_CONNECTIONS: PairArray = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]];\n\nconst LEFT_EYEBROW_CONNECTIONS: PairArray = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]];\n\nconst LEFT_IRIS_CONNECTIONS: PairArray = [[474, 475], [475, 476], [476, 477], [477, 474]];\n\nconst RIGHT_EYE_CONNECTIONS: PairArray = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]];\n\nconst RIGHT_EYEBROW_CONNECTIONS: PairArray = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]];\n\nconst RIGHT_IRIS_CONNECTIONS: PairArray = [[469, 470], [470, 471], [471, 472], [472, 469]];\n\nconst FACE_OVAL_CONNECTIONS: PairArray = [\n [10, 338], [338, 297], [297, 332], [332, 284], [284, 251], [251, 389], [389, 356], [356, 454], [454, 323], [323, 361], [361, 288], [288, 397], [397, 365], [365, 379], [379, 378], [378, 400], [400, 377], [377, 152],\n [152, 148], [148, 176], [176, 149], [149, 150], [150, 136], [136, 172], [172, 58], [58, 132], [132, 93], [93, 234], [234, 127], [127, 162], [162, 21], [21, 54], [54, 103], [103, 67], [67, 109], [109, 10],\n];\n\nexport const MEDIAPIPE_FACE_MESH_CONNECTED_KEYPOINTS_PAIRS: PairArray = [\n [127, 34], [34, 139], [139, 127], [11, 0], [0, 37], [37, 11], [232, 231], [231, 120], [120, 232], [72, 37], [37, 39], [39, 72], [128, 121], [121, 47], [47, 128], [232, 121], [121, 128], [128, 232],\n [104, 69], [69, 67], [67, 104], [175, 171], [171, 148], [148, 175], [118, 50], [50, 101], [101, 118], [73, 39], [39, 40], [40, 73], [9, 151], [151, 108], [108, 9], [48, 115], [115, 131], [131, 48],\n [194, 204], [204, 211], [211, 194], [74, 40], [40, 185], [185, 74], [80, 42], [42, 183], [183, 80], [40, 92], [92, 186], [186, 40], [230, 229], [229, 118], [118, 230], [202, 212], [212, 214], [214, 202],\n [83, 18], [18, 17], [17, 83], [76, 61], [61, 146], [146, 76], [160, 29], [29, 30], [30, 160], [56, 157], [157, 173], [173, 56], [106, 204], [204, 194], [194, 106], [135, 214], [214, 192], [192, 135],\n [203, 165], [165, 98], [98, 203], [21, 71], [71, 68], [68, 21], [51, 45], [45, 4], [4, 51], [144, 24], [24, 23], [23, 144], [77, 146], [146, 91], [91, 77], [205, 50], [50, 187], [187, 205],\n [201, 200], [200, 18], [18, 201], [91, 106], [106, 182], [182, 91], [90, 91], [91, 181], [181, 90], [85, 84], [84, 17], [17, 85], [206, 203], [203, 36], [36, 206], [148, 171], [171, 140], [140, 148],\n [92, 40], [40, 39], [39, 92], [193, 189], [189, 244], [244, 193], [159, 158], [158, 28], [28, 159], [247, 246], [246, 161], [161, 247], [236, 3], [3, 196], [196, 236], [54, 68], [68, 104], [104, 54],\n [193, 168], [168, 8], [8, 193], [117, 228], [228, 31], [31, 117], [189, 193], [193, 55], [55, 189], [98, 97], [97, 99], [99, 98], [126, 47], [47, 100], [100, 126], [166, 79], [79, 218], [218, 166],\n [155, 154], [154, 26], [26, 155], [209, 49], [49, 131], [131, 209], [135, 136], [136, 150], [150, 135], [47, 126], [126, 217], [217, 47], [223, 52], [52, 53], [53, 223], [45, 51], [51, 134], [134, 45],\n [211, 170], [170, 140], [140, 211], [67, 69], [69, 108], [108, 67], [43, 106], [106, 91], [91, 43], [230, 119], [119, 120], [120, 230], [226, 130], [130, 247], [247, 226], [63, 53], [53, 52], [52, 63],\n [238, 20], [20, 242], [242, 238], [46, 70], [70, 156], [156, 46], [78, 62], [62, 96], [96, 78], [46, 53], [53, 63], [63, 46], [143, 34], [34, 227], [227, 143], [123, 117], [117, 111], [111, 123],\n [44, 125], [125, 19], [19, 44], [236, 134], [134, 51], [51, 236], [216, 206], [206, 205], [205, 216], [154, 153], [153, 22], [22, 154], [39, 37], [37, 167], [167, 39], [200, 201], [201, 208], [208, 200],\n [36, 142], [142, 100], [100, 36], [57, 212], [212, 202], [202, 57], [20, 60], [60, 99], [99, 20], [28, 158], [158, 157], [157, 28], [35, 226], [226, 113], [113, 35], [160, 159], [159, 27], [27, 160],\n [204, 202], [202, 210], [210, 204], [113, 225], [225, 46], [46, 113], [43, 202], [202, 204], [204, 43], [62, 76], [76, 77], [77, 62], [137, 123], [123, 116], [116, 137], [41, 38], [38, 72], [72, 41],\n [203, 129], [129, 142], [142, 203], [64, 98], [98, 240], [240, 64], [49, 102], [102, 64], [64, 49], [41, 73], [73, 74], [74, 41], [212, 216], [216, 207], [207, 212], [42, 74], [74, 184], [184, 42],\n [169, 170], [170, 211], [211, 169], [170, 149], [149, 176], [176, 170], [105, 66], [66, 69], [69, 105], [122, 6], [6, 168], [168, 122], [123, 147], [147, 187], [187, 123], [96, 77], [77, 90], [90, 96],\n [65, 55], [55, 107], [107, 65], [89, 90], [90, 180], [180, 89], [101, 100], [100, 120], [120, 101], [63, 105], [105, 104], [104, 63], [93, 137], [137, 227], [227, 93], [15, 86], [86, 85], [85, 15],\n [129, 102], [102, 49], [49, 129], [14, 87], [87, 86], [86, 14], [55, 8], [8, 9], [9, 55], [100, 47], [47, 121], [121, 100], [145, 23], [23, 22], [22, 145], [88, 89], [89, 179], [179, 88],\n [6, 122], [122, 196], [196, 6], [88, 95], [95, 96], [96, 88], [138, 172], [172, 136], [136, 138], [215, 58], [58, 172], [172, 215], [115, 48], [48, 219], [219, 115], [42, 80], [80, 81], [81, 42],\n [195, 3], [3, 51], [51, 195], [43, 146], [146, 61], [61, 43], [171, 175], [175, 199], [199, 171], [81, 82], [82, 38], [38, 81], [53, 46], [46, 225], [225, 53], [144, 163], [163, 110], [110, 144],\n [52, 65], [65, 66], [66, 52], [229, 228], [228, 117], [117, 229], [34, 127], [127, 234], [234, 34], [107, 108], [108, 69], [69, 107], [109, 108], [108, 151], [151, 109], [48, 64], [64, 235], [235, 48],\n [62, 78], [78, 191], [191, 62], [129, 209], [209, 126], [126, 129], [111, 35], [35, 143], [143, 111], [117, 123], [123, 50], [50, 117], [222, 65], [65, 52], [52, 222], [19, 125], [125, 141], [141, 19],\n [221, 55], [55, 65], [65, 221], [3, 195], [195, 197], [197, 3], [25, 7], [7, 33], [33, 25], [220, 237], [237, 44], [44, 220], [70, 71], [71, 139], [139, 70], [122, 193], [193, 245], [245, 122],\n [247, 130], [130, 33], [33, 247], [71, 21], [21, 162], [162, 71], [170, 169], [169, 150], [150, 170], [188, 174], [174, 196], [196, 188], [216, 186], [186, 92], [92, 216], [2, 97], [97, 167], [167, 2],\n [141, 125], [125, 241], [241, 141], [164, 167], [167, 37], [37, 164], [72, 38], [38, 12], [12, 72], [38, 82], [82, 13], [13, 38], [63, 68], [68, 71], [71, 63], [226, 35], [35, 111], [111, 226],\n [101, 50], [50, 205], [205, 101], [206, 92], [92, 165], [165, 206], [209, 198], [198, 217], [217, 209], [165, 167], [167, 97], [97, 165], [220, 115], [115, 218], [218, 220], [133, 112], [112, 243], [243, 133],\n [239, 238], [238, 241], [241, 239], [214, 135], [135, 169], [169, 214], [190, 173], [173, 133], [133, 190], [171, 208], [208, 32], [32, 171], [125, 44], [44, 237], [237, 125], [86, 87], [87, 178], [178, 86],\n [85, 86], [86, 179], [179, 85], [84, 85], [85, 180], [180, 84], [83, 84], [84, 181], [181, 83], [201, 83], [83, 182], [182, 201], [137, 93], [93, 132], [132, 137], [76, 62], [62, 183], [183, 76],\n [61, 76], [76, 184], [184, 61], [57, 61], [61, 185], [185, 57], [212, 57], [57, 186], [186, 212], [214, 207], [207, 187], [187, 214], [34, 143], [143, 156], [156, 34], [79, 239], [239, 237], [237, 79],\n [123, 137], [137, 177], [177, 123], [44, 1], [1, 4], [4, 44], [201, 194], [194, 32], [32, 201], [64, 102], [102, 129], [129, 64], [213, 215], [215, 138], [138, 213], [59, 166], [166, 219], [219, 59],\n [242, 99], [99, 97], [97, 242], [2, 94], [94, 141], [141, 2], [75, 59], [59, 235], [235, 75], [24, 110], [110, 228], [228, 24], [25, 130], [130, 226], [226, 25], [23, 24], [24, 229], [229, 23],\n [22, 23], [23, 230], [230, 22], [26, 22], [22, 231], [231, 26], [112, 26], [26, 232], [232, 112], [189, 190], [190, 243], [243, 189], [221, 56], [56, 190], [190, 221], [28, 56], [56, 221], [221, 28],\n [27, 28], [28, 222], [222, 27], [29, 27], [27, 223], [223, 29], [30, 29], [29, 224], [224, 30], [247, 30], [30, 225], [225, 247], [238, 79], [79, 20], [20, 238], [166, 59], [59, 75], [75, 166],\n [60, 75], [75, 240], [240, 60], [147, 177], [177, 215], [215, 147], [20, 79], [79, 166], [166, 20], [187, 147], [147, 213], [213, 187], [112, 233], [233, 244], [244, 112], [233, 128], [128, 245], [245, 233],\n [128, 114], [114, 188], [188, 128], [114, 217], [217, 174], [174, 114], [131, 115], [115, 220], [220, 131], [217, 198], [198, 236], [236, 217], [198, 131], [131, 134], [134, 198], [177, 132], [132, 58], [58, 177],\n [143, 35], [35, 124], [124, 143], [110, 163], [163, 7], [7, 110], [228, 110], [110, 25], [25, 228], [356, 389], [389, 368], [368, 356], [11, 302], [302, 267], [267, 11], [452, 350], [350, 349], [349, 452],\n [302, 303], [303, 269], [269, 302], [357, 343], [343, 277], [277, 357], [452, 453], [453, 357], [357, 452], [333, 332], [332, 297], [297, 333], [175, 152], [152, 377], [377, 175], [347, 348], [348, 330], [330, 347],\n [303, 304], [304, 270], [270, 303], [9, 336], [336, 337], [337, 9], [278, 279], [279, 360], [360, 278], [418, 262], [262, 431], [431, 418], [304, 408], [408, 409], [409, 304], [310, 415], [415, 407], [407, 310],\n [270, 409], [409, 410], [410, 270], [450, 348], [348, 347], [347, 450], [422, 430], [430, 434], [434, 422], [313, 314], [314, 17], [17, 313], [306, 307], [307, 375], [375, 306], [387, 388], [388, 260], [260, 387],\n [286, 414], [414, 398], [398, 286], [335, 406], [406, 418], [418, 335], [364, 367], [367, 416], [416, 364], [423, 358], [358, 327], [327, 423], [251, 284], [284, 298], [298, 251], [281, 5], [5, 4], [4, 281],\n [373, 374], [374, 253], [253, 373], [307, 320], [320, 321], [321, 307], [425, 427], [427, 411], [411, 425], [421, 313], [313, 18], [18, 421], [321, 405], [405, 406], [406, 321], [320, 404], [404, 405], [405, 320],\n [315, 16], [16, 17], [17, 315], [426, 425], [425, 266], [266, 426], [377, 400], [400, 369], [369, 377], [322, 391], [391, 269], [269, 322], [417, 465], [465, 464], [464, 417], [386, 257], [257, 258], [258, 386],\n [466, 260], [260, 388], [388, 466], [456, 399], [399, 419], [419, 456], [284, 332], [332, 333], [333, 284], [417, 285], [285, 8], [8, 417], [346, 340], [340, 261], [261, 346], [413, 441], [441, 285], [285, 413],\n [327, 460], [460, 328], [328, 327], [355, 371], [371, 329], [329, 355], [392, 439], [439, 438], [438, 392], [382, 341], [341, 256], [256, 382], [429, 420], [420, 360], [360, 429], [364, 394], [394, 379], [379, 364],\n [277, 343], [343, 437], [437, 277], [443, 444], [444, 283], [283, 443], [275, 440], [440, 363], [363, 275], [431, 262], [262, 369], [369, 431], [297, 338], [338, 337], [337, 297], [273, 375], [375, 321], [321, 273],\n [450, 451], [451, 349], [349, 450], [446, 342], [342, 467], [467, 446], [293, 334], [334, 282], [282, 293], [458, 461], [461, 462], [462, 458], [276, 353], [353, 383], [383, 276], [308, 324], [324, 325], [325, 308],\n [276, 300], [300, 293], [293, 276], [372, 345], [345, 447], [447, 372], [352, 345], [345, 340], [340, 352], [274, 1], [1, 19], [19, 274], [456, 248], [248, 281], [281, 456], [436, 427], [427, 425], [425, 436],\n [381, 256], [256, 252], [252, 381], [269, 391], [391, 393], [393, 269], [200, 199], [199, 428], [428, 200], [266, 330], [330, 329], [329, 266], [287, 273], [273, 422], [422, 287], [250, 462], [462, 328], [328, 250],\n [258, 286], [286, 384], [384, 258], [265, 353], [353, 342], [342, 265], [387, 259], [259, 257], [257, 387], [424, 431], [431, 430], [430, 424], [342, 353], [353, 276], [276, 342], [273, 335], [335, 424], [424, 273],\n [292, 325], [325, 307], [307, 292], [366, 447], [447, 345], [345, 366], [271, 303], [303, 302], [302, 271], [423, 266], [266, 371], [371, 423], [294, 455], [455, 460], [460, 294], [279, 278], [278, 294], [294, 279],\n [271, 272], [272, 304], [304, 271], [432, 434], [434, 427], [427, 432], [272, 407], [407, 408], [408, 272], [394, 430], [430, 431], [431, 394], [395, 369], [369, 400], [400, 395], [334, 333], [333, 299], [299, 334],\n [351, 417], [417, 168], [168, 351], [352, 280], [280, 411], [411, 352], [325, 319], [319, 320], [320, 325], [295, 296], [296, 336], [336, 295], [319, 403], [403, 404], [404, 319], [330, 348], [348, 349], [349, 330],\n [293, 298], [298, 333], [333, 293], [323, 454], [454, 447], [447, 323], [15, 16], [16, 315], [315, 15], [358, 429], [429, 279], [279, 358], [14, 15], [15, 316], [316, 14], [285, 336], [336, 9], [9, 285],\n [329, 349], [349, 350], [350, 329], [374, 380], [380, 252], [252, 374], [318, 402], [402, 403], [403, 318], [6, 197], [197, 419], [419, 6], [318, 319], [319, 325], [325, 318], [367, 364], [364, 365], [365, 367],\n [435, 367], [367, 397], [397, 435], [344, 438], [438, 439], [439, 344], [272, 271], [271, 311], [311, 272], [195, 5], [5, 281], [281, 195], [273, 287], [287, 291], [291, 273], [396, 428], [428, 199], [199, 396],\n [311, 271], [271, 268], [268, 311], [283, 444], [444, 445], [445, 283], [373, 254], [254, 339], [339, 373], [282, 334], [334, 296], [296, 282], [449, 347], [347, 346], [346, 449], [264, 447], [447, 454], [454, 264],\n [336, 296], [296, 299], [299, 336], [338, 10], [10, 151], [151, 338], [278, 439], [439, 455], [455, 278], [292, 407], [407, 415], [415, 292], [358, 371], [371, 355], [355, 358], [340, 345], [345, 372], [372, 340],\n [346, 347], [347, 280], [280, 346], [442, 443], [443, 282], [282, 442], [19, 94], [94, 370], [370, 19], [441, 442], [442, 295], [295, 441], [248, 419], [419, 197], [197, 248], [263, 255], [255, 359], [359, 263],\n [440, 275], [275, 274], [274, 440], [300, 383], [383, 368], [368, 300], [351, 412], [412, 465], [465, 351], [263, 467], [467, 466], [466, 263], [301, 368], [368, 389], [389, 301], [395, 378], [378, 379], [379, 395],\n [412, 351], [351, 419], [419, 412], [436, 426], [426, 322], [322, 436], [2, 164], [164, 393], [393, 2], [370, 462], [462, 461], [461, 370], [164, 0], [0, 267], [267, 164], [302, 11], [11, 12], [12, 302],\n [268, 12], [12, 13], [13, 268], [293, 300], [300, 301], [301, 293], [446, 261], [261, 340], [340, 446], [330, 266], [266, 425], [425, 330], [426, 423], [423, 391], [391, 426], [429, 355], [355, 437], [437, 429],\n [391, 327], [327, 326], [326, 391], [440, 457], [457, 438], [438, 440], [341, 382], [382, 362], [362, 341], [459, 457], [457, 461], [461, 459], [434, 430], [430, 394], [394, 434], [414, 463], [463, 362], [362, 414],\n [396, 369], [369, 262], [262, 396], [354, 461], [461, 457], [457, 354], [316, 403], [403, 402], [402, 316], [315, 404], [404, 403], [403, 315], [314, 405], [405, 404], [404, 314], [313, 406], [406, 405], [405, 313],\n [421, 418], [418, 406], [406, 421], [366, 401], [401, 361], [361, 366], [306, 408], [408, 407], [407, 306], [291, 409], [409, 408], [408, 291], [287, 410], [410, 409], [409, 287], [432, 436], [436, 410], [410, 432],\n [434, 416], [416, 411], [411, 434], [264, 368], [368, 383], [383, 264], [309, 438], [438, 457], [457, 309], [352, 376], [376, 401], [401, 352], [274, 275], [275, 4], [4, 274], [421, 428], [428, 262], [262, 421],\n [294, 327], [327, 358], [358, 294], [433, 416], [416, 367], [367, 433], [289, 455], [455, 439], [439, 289], [462, 370], [370, 326], [326, 462], [2, 326], [326, 370], [370, 2], [305, 460], [460, 455], [455, 305],\n [254, 449], [449, 448], [448, 254], [255, 261], [261, 446], [446, 255], [253, 450], [450, 449], [449, 253], [252, 451], [451, 450], [450, 252], [256, 452], [452, 451], [451, 256], [341, 453], [453, 452], [452, 341],\n [413, 464], [464, 463], [463, 413], [441, 413], [413, 414], [414, 441], [258, 442], [442, 441], [441, 258], [257, 443], [443, 442], [442, 257], [259, 444], [444, 443], [443, 259], [260, 445], [445, 444], [444, 260],\n [467, 342], [342, 445], [445, 467], [459, 458], [458, 250], [250, 459], [289, 392], [392, 290], [290, 289], [290, 328], [328, 460], [460, 290], [376, 433], [433, 435], [435, 376], [250, 290], [290, 392], [392, 250],\n [411, 416], [416, 433], [433, 411], [341, 463], [463, 464], [464, 341], [453, 464], [464, 465], [465, 453], [357, 465], [465, 412], [412, 357], [343, 412], [412, 399], [399, 343], [360, 363], [363, 440], [440, 360],\n [437, 399], [399, 456], [456, 437], [420, 456], [456, 363], [363, 420], [401, 435], [435, 288], [288, 401], [372, 383], [383, 353], [353, 372], [339, 255], [255, 249], [249, 339], [448, 261], [261, 255], [255, 448],\n [133, 243], [243, 190], [190, 133], [133, 155], [155, 112], [112, 133], [33, 246], [246, 247], [247, 33], [33, 130], [130, 25], [25, 33], [398, 384], [384, 286], [286, 398], [362, 398], [398, 414], [414, 362],\n [362, 463], [463, 341], [341, 362], [263, 359], [359, 467], [467, 263], [263, 249], [249, 255], [255, 263], [466, 467], [467, 260], [260, 466], [75, 60], [60, 166], [166, 75], [238, 239], [239, 79], [79, 238],\n [162, 127], [127, 139], [139, 162], [72, 11], [11, 37], [37, 72], [121, 232], [232, 120], [120, 121], [73, 72], [72, 39], [39, 73], [114, 128], [128, 47], [47, 114], [233, 232], [232, 128], [128, 233],\n [103, 104], [104, 67], [67, 103], [152, 175], [175, 148], [148, 152], [119, 118], [118, 101], [101, 119], [74, 73], [73, 40], [40, 74], [107, 9], [9, 108], [108, 107], [49, 48], [48, 131], [131, 49],\n [32, 194], [194, 211], [211, 32], [184, 74], [74, 185], [185, 184], [191, 80], [80, 183], [183, 191], [185, 40], [40, 186], [186, 185], [119, 230], [230, 118], [118, 119], [210, 202], [202, 214], [214, 210],\n [84, 83], [83, 17], [17, 84], [77, 76], [76, 146], [146, 77], [161, 160], [160, 30], [30, 161], [190, 56], [56, 173], [173, 190], [182, 106], [106, 194], [194, 182], [138, 135], [135, 192], [192, 138],\n [129, 203], [203, 98], [98, 129], [54, 21], [21, 68], [68, 54], [5, 51], [51, 4], [4, 5], [145, 144], [144, 23], [23, 145], [90, 77], [77, 91], [91, 90], [207, 205], [205, 187], [187, 207],\n [83, 201], [201, 18], [18, 83], [181, 91], [91, 182], [182, 181], [180, 90], [90, 181], [181, 180], [16, 85], [85, 17], [17, 16], [205, 206], [206, 36], [36, 205], [176, 148], [148, 140], [140, 176],\n [165, 92], [92, 39], [39, 165], [245, 193], [193, 244], [244, 245], [27, 159], [159, 28], [28, 27], [30, 247], [247, 161], [161, 30], [174, 236], [236, 196], [196, 174], [103, 54], [54, 104], [104, 103],\n [55, 193], [193, 8], [8, 55], [111, 117], [117, 31], [31, 111], [221, 189], [189, 55], [55, 221], [240, 98], [98, 99], [99, 240], [142, 126], [126, 100], [100, 142], [219, 166], [166, 218], [218, 219],\n [112, 155], [155, 26], [26, 112], [198, 209], [209, 131], [131, 198], [169, 135], [135, 150], [150, 169], [114, 47], [47, 217], [217, 114], [224, 223], [223, 53], [53, 224], [220, 45], [45, 134], [134, 220],\n [32, 211], [211, 140], [140, 32], [109, 67], [67, 108], [108, 109], [146, 43], [43, 91], [91, 146], [231, 230], [230, 120], [120, 231], [113, 226], [226, 247], [247, 113], [105, 63], [63, 52], [52, 105],\n [241, 238], [238, 242], [242, 241], [124, 46], [46, 156], [156, 124], [95, 78], [78, 96], [96, 95], [70, 46], [46, 63], [63, 70], [116, 143], [143, 227], [227, 116], [116, 123], [123, 111], [111, 116],\n [1, 44], [44, 19], [19, 1], [3, 236], [236, 51], [51, 3], [207, 216], [216, 205], [205, 207], [26, 154], [154, 22], [22, 26], [165, 39], [39, 167], [167, 165], [199, 200], [200, 208], [208, 199],\n [101, 36], [36, 100], [100, 101], [43, 57], [57, 202], [202, 43], [242, 20], [20, 99], [99, 242], [56, 28], [28, 157], [157, 56], [124, 35], [35, 113], [113, 124], [29, 160], [160, 27], [27, 29],\n [211, 204], [204, 210], [210, 211], [124, 113], [113, 46], [46, 124], [106, 43], [43, 204], [204, 106], [96, 62], [62, 77], [77, 96], [227, 137], [137, 116], [116, 227], [73, 41], [41, 72], [72, 73],\n [36, 203], [203, 142], [142, 36], [235, 64], [64, 240], [240, 235], [48, 49], [49, 64], [64, 48], [42, 41], [41, 74], [74, 42], [214, 212], [212, 207], [207, 214], [183, 42], [42, 184], [184, 183],\n [210, 169], [169, 211], [211, 210], [140, 170], [170, 176], [176, 140], [104, 105], [105, 69], [69, 104], [193, 122], [122, 168], [168, 193], [50, 123], [123, 187], [187, 50], [89, 96], [96, 90], [90, 89],\n [66, 65], [65, 107], [107, 66], [179, 89], [89, 180], [180, 179], [119, 101], [101, 120], [120, 119], [68, 63], [63, 104], [104, 68], [234, 93], [93, 227], [227, 234], [16, 15], [15, 85], [85, 16],\n [209, 129], [129, 49], [49, 209], [15, 14], [14, 86], [86, 15], [107, 55], [55, 9], [9, 107], [120, 100], [100, 121], [121, 120], [153, 145], [145, 22], [22, 153], [178, 88], [88, 179], [179, 178],\n [197, 6], [6, 196], [196, 197], [89, 88], [88, 96], [96, 89], [135, 138], [138, 136], [136, 135], [138, 215], [215, 172], [172, 138], [218, 115], [115, 219], [219, 218], [41, 42], [42, 81], [81, 41],\n [5, 195], [195, 51], [51, 5], [57, 43], [43, 61], [61, 57], [208, 171], [171, 199], [199, 208], [41, 81], [81, 38], [38, 41], [224, 53], [53, 225], [225, 224], [24, 144], [144, 110], [110, 24],\n [105, 52], [52, 66], [66, 105], [118, 229], [229, 117], [117, 118], [227, 34], [34, 234], [234, 227], [66, 107], [107, 69], [69, 66], [10, 109], [109, 151], [151, 10], [219, 48], [48, 235], [235, 219],\n [183, 62], [62, 191], [191, 183], [142, 129], [129, 126], [126, 142], [116, 111], [111, 143], [143, 116], [118, 117], [117, 50], [50, 118], [223, 222], [222, 52], [52, 223], [94, 19], [19, 141], [141, 94],\n [222, 221], [221, 65], [65, 222], [196, 3], [3, 197], [197, 196], [45, 220], [220, 44], [44, 45], [156, 70], [70, 139], [139, 156], [188, 122], [122, 245], [245, 188], [139, 71], [71, 162], [162, 139],\n [149, 170], [170, 150], [150, 149], [122, 188], [188, 196], [196, 122], [206, 216], [216, 92], [92, 206], [164, 2], [2, 167], [167, 164], [242, 141], [141, 241], [241, 242], [0, 164], [164, 37], [37, 0],\n [11, 72], [72, 12], [12, 11], [12, 38], [38, 13], [13, 12], [70, 63], [63, 71], [71, 70], [31, 226], [226, 111], [111, 31], [36, 101], [101, 205], [205, 36], [203, 206], [206, 165], [165, 203],\n [126, 209], [209, 217], [217, 126], [98, 165], [165, 97], [97, 98], [237, 220], [220, 218], [218, 237], [237, 239], [239, 241], [241, 237], [210, 214], [214, 169], [169, 210], [140, 171], [171, 32], [32, 140],\n [241, 125], [125, 237], [237, 241], [179, 86], [86, 178], [178, 179], [180, 85], [85, 179], [179, 180], [181, 84], [84, 180], [180, 181], [182, 83], [83, 181], [181, 182], [194, 201], [201, 182], [182, 194],\n [177, 137], [137, 132], [132, 177], [184, 76], [76, 183], [183, 184], [185, 61], [61, 184], [184, 185], [186, 57], [57, 185], [185, 186], [216, 212], [212, 186], [186, 216], [192, 214], [214, 187], [187, 192],\n [139, 34], [34, 156], [156, 139], [218, 79], [79, 237], [237, 218], [147, 123], [123, 177], [177, 147], [45, 44], [44, 4], [4, 45], [208, 201], [201, 32], [32, 208], [98, 64], [64, 129], [129, 98],\n [192, 213], [213, 138], [138, 192], [235, 59], [59, 219], [219, 235], [141, 242], [242, 97], [97, 141], [97, 2], [2, 141], [141, 97], [240, 75], [75, 235], [235, 240], [229, 24], [24, 228], [228, 229],\n [31, 25], [25, 226], [226, 31], [230, 23], [23, 229], [229, 230], [231, 22], [22, 230], [230, 231], [232, 26], [26, 231], [231, 232], [233, 112], [112, 232], [232, 233], [244, 189], [189, 243], [243, 244],\n [189, 221], [221, 190], [190, 189], [222, 28], [28, 221], [221, 222], [223, 27], [27, 222], [222, 223], [224, 29], [29, 223], [223, 224], [225, 30], [30, 224], [224, 225], [113, 247], [247, 225], [225, 113],\n [99, 60], [60, 240], [240, 99], [213, 147], [147, 215], [215, 213], [60, 20], [20, 166], [166, 60], [192, 187], [187, 213], [213, 192], [243, 112], [112, 244], [244, 243], [244, 233], [233, 245], [245, 244],\n [245, 128], [128, 188], [188, 245], [188, 114], [114, 174], [174, 188], [134, 131], [131, 220], [220, 134], [174, 217], [217, 236], [236, 174], [236, 198], [198, 134], [134, 236], [215, 177], [177, 58], [58, 215],\n [156, 143], [143, 124], [124, 156], [25, 110], [110, 7], [7, 25], [31, 228], [228, 25], [25, 31], [264, 356], [356, 368], [368, 264], [0, 11], [11, 267], [267, 0], [451, 452], [452, 349], [349, 451],\n [267, 302], [302, 269], [269, 267], [350, 357], [357, 277], [277, 350], [350, 452], [452, 357], [357, 350], [299, 333], [333, 297], [297, 299], [396, 175], [175, 377], [377, 396], [280, 347], [347, 330], [330, 280],\n [269, 303], [303, 270], [270, 269], [151, 9], [9, 337], [337, 151], [344, 278], [278, 360], [360, 344], [424, 418], [418, 431], [431, 424], [270, 304], [304, 409], [409, 270], [272, 310], [310, 407], [407, 272],\n [322, 270], [270, 410], [410, 322], [449, 450], [450, 347], [347, 449], [432, 422], [422, 434], [434, 432], [18, 313], [313, 17], [17, 18], [291, 306], [306, 375], [375, 291], [259, 387], [387, 260], [260, 259],\n [424, 335], [335, 418], [418, 424], [434, 364], [364, 416], [416, 434], [391, 423], [423, 327], [327, 391], [301, 251], [251, 298], [298, 301], [275, 281], [281, 4], [4, 275], [254, 373], [373, 253], [253, 254],\n [375, 307], [307, 321], [321, 375], [280, 425], [425, 411], [411, 280], [200, 421], [421, 18], [18, 200], [335, 321], [321, 406], [406, 335], [321, 320], [320, 405], [405, 321], [314, 315], [315, 17], [17, 314],\n [423, 426], [426, 266], [266, 423], [396, 377], [377, 369], [369, 396], [270, 322], [322, 269], [269, 270], [413, 417], [417, 464], [464, 413], [385, 386], [386, 258], [258, 385], [248, 456], [456, 419], [419, 248],\n [298, 284], [284, 333], [333, 298], [168, 417], [417, 8], [8, 168], [448, 346], [346, 261], [261, 448], [417, 413], [413, 285], [285, 417], [326, 327], [327, 328], [328, 326], [277, 355], [355, 329], [329, 277],\n [309, 392], [392, 438], [438, 309], [381, 382], [382, 256], [256, 381], [279, 429], [429, 360], [360, 279], [365, 364], [364, 379], [379, 365], [355, 277], [277, 437], [437, 355], [282, 443], [443, 283], [283, 282],\n [281, 275], [275, 363], [363, 281], [395, 431], [431, 369], [369, 395], [299, 297], [297, 337], [337, 299], [335, 273], [273, 321], [321, 335], [348, 450], [450, 349], [349, 348], [359, 446], [446, 467], [467, 359],\n [283, 293], [293, 282], [282, 283], [250, 458], [458, 462], [462, 250], [300, 276], [276, 383], [383, 300], [292, 308], [308, 325], [325, 292], [283, 276], [276, 293], [293, 283], [264, 372], [372, 447], [447, 264],\n [346, 352], [352, 340], [340, 346], [354, 274], [274, 19], [19, 354], [363, 456], [456, 281], [281, 363], [426, 436], [436, 425], [425, 426], [380, 381], [381, 252], [252, 380], [267, 269], [269, 393], [393, 267],\n [421, 200], [200, 428], [428, 421], [371, 266], [266, 329], [329, 371], [432, 287], [287, 422], [422, 432], [290, 250], [250, 328], [328, 290], [385, 258], [258, 384], [384, 385], [446, 265], [265, 342], [342, 446],\n [386, 387], [387, 257], [257, 386], [422, 424], [424, 430], [430, 422], [445, 342], [342, 276], [276, 445], [422, 273], [273, 424], [424, 422], [306, 292], [292, 307], [307, 306], [352, 366], [366, 345], [345, 352],\n [268, 271], [271, 302], [302, 268], [358, 423], [423, 371], [371, 358], [327, 294], [294, 460], [460, 327], [331, 279], [279, 294], [294, 331], [303, 271], [271, 304], [304, 303], [436, 432], [432, 427], [427, 436],\n [304, 272], [272, 408], [408, 304], [395, 394], [394, 431], [431, 395], [378, 395], [395, 400], [400, 378], [296, 334], [334, 299], [299, 296], [6, 351], [351, 168], [168, 6], [376, 352], [352, 411], [411, 376],\n [307, 325], [325, 320], [320, 307], [285, 295], [295, 336], [336, 285], [320, 319], [319, 404], [404, 320], [329, 330], [330, 349], [349, 329], [334, 293], [293, 333], [333, 334], [366, 323], [323, 447], [447, 366],\n [316, 15], [15, 315], [315, 316], [331, 358], [358, 279], [279, 331], [317, 14], [14, 316], [316, 317], [8, 285], [285, 9], [9, 8], [277, 329], [329, 350], [350, 277], [253, 374], [374, 252], [252, 253],\n [319, 318], [318, 403], [403, 319], [351, 6], [6, 419], [419, 351], [324, 318], [318, 325], [325, 324], [397, 367], [367, 365], [365, 397], [288, 435], [435, 397], [397, 288], [278, 344], [344, 439], [439, 278],\n [310, 272], [272, 311], [311, 310], [248, 195], [195, 281], [281, 248], [375, 273], [273, 291], [291, 375], [175, 396], [396, 199], [199, 175], [312, 311], [311, 268], [268, 312], [276, 283], [283, 445], [445, 276],\n [390, 373], [373, 339], [339, 390], [295, 282], [282, 296], [296, 295], [448, 449], [449, 346], [346, 448], [356, 264], [264, 454], [454, 356], [337, 336], [336, 299], [299, 337], [337, 338], [338, 151], [151, 337],\n [294, 278], [278, 455], [455, 294], [308, 292], [292, 415], [415, 308], [429, 358], [358, 355], [355, 429], [265, 340], [340, 372], [372, 265], [352, 346], [346, 280], [280, 352], [295, 442], [442, 282], [282, 295],\n [354, 19], [19, 370], [370, 354], [285, 441], [441, 295], [295, 285], [195, 248], [248, 197], [197, 195], [457, 440], [440, 274], [274, 457], [301, 300], [300, 368], [368, 301], [417, 351], [351, 465], [465, 417],\n [251, 301], [301, 389], [389, 251], [394, 395], [395, 379], [379, 394], [399, 412], [412, 419], [419, 399], [410, 436], [436, 322], [322, 410], [326, 2], [2, 393], [393, 326], [354, 370], [370, 461], [461, 354],\n [393, 164], [164, 267], [267, 393], [268, 302], [302, 12], [12, 268], [312, 268], [268, 13], [13, 312], [298, 293], [293, 301], [301, 298], [265, 446], [446, 340], [340, 265], [280, 330], [330, 425], [425, 280],\n [322, 426], [426, 391], [391, 322], [420, 429], [429, 437], [437, 420], [393, 391], [391, 326], [326, 393], [344, 440], [440, 438], [438, 344], [458, 459], [459, 461], [461, 458], [364, 434], [434, 394], [394, 364],\n [428, 396], [396, 262], [262, 428], [274, 354], [354, 457], [457, 274], [317, 316], [316, 402], [402, 317], [316, 315], [315, 403], [403, 316], [315, 314], [314, 404], [404, 315], [314, 313], [313, 405], [405, 314],\n [313, 421], [421, 406], [406, 313], [323, 366], [366, 361], [361, 323], [292, 306], [306, 407], [407, 292], [306, 291], [291, 408], [408, 306], [291, 287], [287, 409], [409, 291], [287, 432], [432, 410], [410, 287],\n [427, 434], [434, 411], [411, 427], [372, 264], [264, 383], [383, 372], [459, 309], [309, 457], [457, 459], [366, 352], [352, 401], [401, 366], [1, 274], [274, 4], [4, 1], [418, 421], [421, 262], [262, 418],\n [331, 294], [294, 358], [358, 331], [435, 433], [433, 367], [367, 435], [392, 289], [289, 439], [439, 392], [328, 462], [462, 326], [326, 328], [94, 2], [2, 370], [370, 94], [289, 305], [305, 455], [455, 289],\n [339, 254], [254, 448], [448, 339], [359, 255], [255, 446], [446, 359], [254, 253], [253, 449], [449, 254], [253, 252], [252, 450], [450, 253], [252, 256], [256, 451], [451, 252], [256, 341], [341, 452], [452, 256],\n [414, 413], [413, 463], [463, 414], [286, 441], [441, 414], [414, 286], [286, 258], [258, 441], [441, 286], [258, 257], [257, 442], [442, 258], [257, 259], [259, 443], [443, 257], [259, 260], [260, 444], [444, 259],\n [260, 467], [467, 445], [445, 260], [309, 459], [459, 250], [250, 309], [305, 289], [289, 290], [290, 305], [305, 290], [290, 460], [460, 305], [401, 376], [376, 435], [435, 401], [309, 250], [250, 392], [392, 309],\n [376, 411], [411, 433], [433, 376], [453, 341], [341, 464], [464, 453], [357, 453], [453, 465], [465, 357], [343, 357], [357, 412], [412, 343], [437, 343], [343, 399], [399, 437], [344, 360], [360, 440], [440, 344],\n [420, 437], [437, 456], [456, 420], [360, 420], [420, 363], [363, 360], [361, 401], [401, 288], [288, 361], [265, 372], [372, 353], [353, 265], [390, 339], [339, 249], [249, 390], [339, 448], [448, 255], [255, 339],\n];\n\nfunction connectionsToIndices(connections: PairArray) {\n const indices = connections.map((connection) => connection[0]);\n indices.push(connections[connections.length - 1][1]);\n return indices;\n}\n\nexport const MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR = {\n lips: connectionsToIndices(LIPS_CONNECTIONS),\n leftEye: connectionsToIndices(LEFT_EYE_CONNECTIONS),\n leftEyebrow: connectionsToIndices(LEFT_EYEBROW_CONNECTIONS),\n leftIris: connectionsToIndices(LEFT_IRIS_CONNECTIONS),\n rightEye: connectionsToIndices(RIGHT_EYE_CONNECTIONS),\n rightEyebrow: connectionsToIndices(RIGHT_EYEBROW_CONNECTIONS),\n rightIris: connectionsToIndices(RIGHT_IRIS_CONNECTIONS),\n faceOval: connectionsToIndices(FACE_OVAL_CONNECTIONS),\n};\n\nconst indexLabelPairs: Array<[number, string]> = Object.entries(MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR)\n .map(([label, indices]) => indices.map((index) => [index, label] as [number, string]))\n .flat();\n\nexport const MEDIAPIPE_FACE_MESH_KEYPOINTS = new Map(indexLabelPairs);\n\ntype AssignAverage = number[];\nexport interface LandmarksRefinementConfig {\n indexesMapping: number[]; // Maps indexes of the given set of landmarks to indexes of the resulting set of landmarks. Should be non empty and contain the same amount of indexes as landmarks in the corresponding input\n zRefinement: 'none'|'copy'|AssignAverage; // Z refinement instructions.\n}\n\nexport const LANDMARKS_REFINEMENT_LIPS_CONFIG = [\n 61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291, // Lower outer.\n 185, 40, 39, 37, 0, 267, 269, 270, 409, // Upper outer(excluding corners).\n 78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308, // Lower inner.\n 191, 80, 81, 82, 13, 312, 311, 310, 415, // Upper inner(excluding corners).\n 76, 77, 90, 180, 85, 16, 315, 404, 320, 307, 306, // Lower semi - outer.\n 184, 74, 73, 72, 11, 302, 303, 304, 408, // Upper semi - outer(excluding corners).\n 62, 96, 89, 179, 86, 15, 316, 403, 319, 325, 292, // Lower semi - inner.\n 183, 42, 41, 38, 12, 268, 271, 272, 407, // Upper semi - inner(excluding corners).\n];\n\nexport const LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG = [\n 33, 7, 163, 144, 145, 153, 154, 155, 133, // Lower contour.\n 246, 161, 160, 159, 158, 157, 173, // upper contour (excluding corners).\n 130, 25, 110, 24, 23, 22, 26, 112, 243, // Halo x2 lower contour.\n 247, 30, 29, 27, 28, 56, 190, // Halo x2 upper contour (excluding corners).\n 226, 31, 228, 229, 230, 231, 232, 233, 244, // Halo x3 lower contour.\n 113, 225, 224, 223, 222, 221, 189, // Halo x3 upper contour (excluding corners).\n 35, 124, 46, 53, 52, 65, // Halo x4 upper contour (no lower because of mesh structure) or eyebrow inner contour.\n 143, 111, 117, 118, 119, 120, 121, 128, 245, // Halo x5 lower contour.\n 156, 70, 63, 105, 66, 107, 55, 193, // Halo x5 upper contour (excluding corners) or eyebrow outer contour.\n];\n\nexport const LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG = [\n 263, 249, 390, 373, 374, 380, 381, 382, 362, // Lower contour.\n 466, 388, 387, 386, 385, 384, 398, // Upper contour (excluding corners).\n 359, 255, 339, 254, 253, 252, 256, 341, 463, // Halo x2 lower contour.\n 467, 260, 259, 257, 258, 286, 414, // Halo x2 upper contour (excluding corners).\n 446, 261, 448, 449, 450, 451, 452, 453, 464, // Halo x3 lower contour.\n 342, 445, 444, 443, 442, 441, 413, // Halo x3 upper contour (excluding corners).\n 265, 353, 276, 283, 282, 295, // Halo x4 upper contour (no lower because of mesh structure) or/ eyebrow inner contour.\n 372, 340, 346, 347, 348, 349, 350, 357, 465, // Halo x5 lower contour.\n 383, 300, 293, 334, 296, 336, 285, 417, // Halo x5 upper contour (excluding corners) or eyebrow outer contour.\n];\n\nexport const LANDMARKS_REFINEMENT_LEFT_IRIS_CONFIG = [\n 468, // Center.\n 469, // Iris right edge.\n 470, // Iris top edge.\n 471, // Iris left edge.\n 472, // Iris bottom edge.\n];\n/*\nzRefinement: [\n 33, 7, 163, 144, 145, 153, 154, 155, 133, // Lower contour.\n 246, 161, 160, 159, 158, 157, 173, // Upper contour (excluding corners).\n];\n*/\n\nexport const LANDMARKS_REFINEMENT_RIGHT_IRIS_CONFIG = [\n 473, // Center.\n 474, // Iris right edge.\n 475, // Iris top edge.\n 476, // Iris left edge.\n 477, // Iris bottom edge.\n];\n/*\nzRefinement: [\n 263, 249, 390, 373, 374, 380, 381, 382, 362, // Lower contour.\n 466, 388, 387, 386, 385, 384, 398, // Upper contour (excluding corners).\n];\n*/\n", "import * as constants from './constants';\nimport type { Tensor } from '../tfjs/types';\n\nexport async function augment(rawCoords, results: Tensor[]) {\n const t: Record = { // all attention models produce 2d results so it needs to be later augmented with correct z-coords\n // mesh: results[0], // already have it in rawCoords // output_mesh_identity\n // flag: results[1], // already processed in parent // conv_faceflag\n lips: await results.filter((r) => r.size === 160)[0].data() as Float32Array, // 80 x 2d = 160 // output_lips\n irisL: await results.filter((r) => r.size === 10)[0].data() as Float32Array, // 5 x 2d = 10 // output_right_iris\n eyeL: await results.filter((r) => r.size === 142)[0].data() as Float32Array, // 71 x 2d = 142 // output_right_eye\n irisR: await results.filter((r) => r.size === 10)[1].data() as Float32Array, // 5 x 2d = 10 // output_left_iris\n eyeR: await results.filter((r) => r.size === 142)[1].data() as Float32Array, // 71 x 2d = 142// output_left_eye\n };\n\n // augment iris: adds additional 5 keypoints per eye\n const irisLDepth = constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.length; // get average z-coord for iris\n for (let i = 0; i < t.irisL.length / 2; i++) rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], irisLDepth]);\n const irisRDepth = constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.length; // get average z-coord for iris\n for (let i = 0; i < t.irisR.length / 2; i++) rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], irisRDepth]);\n\n // augment eyes: replaces eye keypoints based on heuristic mapping\n for (let i = 0; i < t.eyeL.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]] = [t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]][2]];\n for (let i = 0; i < t.eyeR.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]] = [t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]][2]];\n\n // augment lips: replaces eye keypoints based on heuristic mapping\n for (let i = 0; i < t.lips.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_LIPS_CONFIG[i]] = [t.lips[2 * i + 0], t.lips[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_LIPS_CONFIG[i]][2]];\n\n return rawCoords;\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n *\n * Based on:\n * - [**MediaPipe BlazeFace**](https://drive.google.com/file/d/1f39lSzU5Oq-j_OXgS67KfN5wNsoeAZ4V/view)\n * - Facial Spacial Geometry: [**MediaPipe FaceMesh**](https://drive.google.com/file/d/1VFC_wIpw4O7xBOiTgUldl79d9LA-LsnA/view)\n * - Eye Iris Details: [**MediaPipe Iris**](https://drive.google.com/file/d/1bsWbokp9AklH2ANjCfmjqEzzxO1CNbMu/view)\n */\n\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as util from './facemeshutil';\nimport * as coords from './facemeshcoords';\nimport * as iris from './iris';\nimport * as attention from './attention';\nimport { histogramEqualization } from '../image/enhance';\nimport { env } from '../util/env';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { FaceResult, FaceLandmark, Point } from '../result';\nimport type { Config } from '../config';\n\ntype DetectBox = { startPoint: Point, endPoint: Point, landmarks: Array, confidence: number };\n\nconst cache = {\n boxes: [] as DetectBox[],\n skipped: Number.MAX_SAFE_INTEGER,\n timestamp: 0,\n};\n\nlet model: GraphModel | null = null;\nlet inputSize = 0;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n // reset cached boxes\n const skipTime = (config.face.detector?.skipTime || 0) > (now() - cache.timestamp);\n const skipFrame = cache.skipped < (config.face.detector?.skipFrames || 0);\n if (!config.skipAllowed || !skipTime || !skipFrame || cache.boxes.length === 0) {\n cache.boxes = await blazeface.getBoxes(input, config); // get results from blazeface detector\n cache.timestamp = now();\n cache.skipped = 0;\n } else {\n cache.skipped++;\n }\n const faces: Array = [];\n const newCache: Array = [];\n let id = 0;\n for (let i = 0; i < cache.boxes.length; i++) {\n const box = cache.boxes[i];\n let angle = 0;\n let rotationMatrix;\n const face: FaceResult = { // init face result\n id: id++,\n mesh: [],\n meshRaw: [],\n box: [0, 0, 0, 0],\n boxRaw: [0, 0, 0, 0],\n score: 0,\n boxScore: 0,\n faceScore: 0,\n // contoursRaw: [],\n // contours: [],\n annotations: {} as Record,\n };\n\n // optional rotation correction based on detector data only if mesh is disabled otherwise perform it later when we have more accurate mesh data. if no rotation correction this function performs crop\n [angle, rotationMatrix, face.tensor] = util.correctFaceRotation(config.face.detector?.rotation, box, input, config.face.mesh?.enabled ? inputSize : blazeface.size());\n if (config?.filter?.equalization) {\n const equilized = await histogramEqualization(face.tensor as Tensor);\n tf.dispose(face.tensor);\n face.tensor = equilized;\n }\n face.boxScore = Math.round(100 * box.confidence) / 100;\n if (!config.face.mesh?.enabled) { // mesh not enabled, return resuts from detector only\n face.box = util.clampBox(box, input);\n face.boxRaw = util.getRawBox(box, input);\n face.score = face.boxScore;\n face.mesh = box.landmarks.map((pt) => [\n ((box.startPoint[0] + box.endPoint[0])) / 2 + ((box.endPoint[0] + box.startPoint[0]) * pt[0] / blazeface.size()),\n ((box.startPoint[1] + box.endPoint[1])) / 2 + ((box.endPoint[1] + box.startPoint[1]) * pt[1] / blazeface.size()),\n ]);\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.blazeFaceLandmarks)) {\n face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n }\n } else if (!model) { // mesh enabled, but not loaded\n if (config.debug) log('face mesh detection requested, but model is not loaded');\n } else { // mesh enabled\n if (config.face.attention?.enabled && !env.kernels.includes('atan2')) {\n tf.dispose(face.tensor);\n return faces;\n }\n const results = model.execute(face.tensor as Tensor) as Array;\n const confidenceT = results.find((t) => t.shape[t.shape.length - 1] === 1) as Tensor;\n const faceConfidence = await confidenceT.data();\n face.faceScore = Math.round(100 * faceConfidence[0]) / 100;\n\n if (face.faceScore < (config.face.detector?.minConfidence || 1)) { // low confidence in detected mesh\n box.confidence = face.faceScore; // reset confidence of cached box\n if (config.face.mesh?.keepInvalid) {\n face.box = util.clampBox(box, input);\n face.boxRaw = util.getRawBox(box, input);\n face.score = face.boxScore;\n face.mesh = box.landmarks.map((pt) => [\n ((box.startPoint[0] + box.endPoint[0])) / 2 + ((box.endPoint[0] + box.startPoint[0]) * pt[0] / blazeface.size()),\n ((box.startPoint[1] + box.endPoint[1])) / 2 + ((box.endPoint[1] + box.startPoint[1]) * pt[1] / blazeface.size()),\n ]);\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 1), pt[1] / (input.shape[1] || 1), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.blazeFaceLandmarks)) {\n face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n }\n }\n } else {\n const meshT = results.find((t) => t.shape[t.shape.length - 1] === 1404) as Tensor;\n const coordsReshaped = tf.reshape(meshT, [-1, 3]);\n let rawCoords = await coordsReshaped.array();\n tf.dispose(coordsReshaped);\n if (config.face.attention?.enabled) {\n rawCoords = await attention.augment(rawCoords, results); // augment iris results using attention model results\n } else if (config.face.iris?.enabled) {\n rawCoords = await iris.augmentIris(rawCoords, face.tensor, config, inputSize); // run iris model and augment results\n }\n face.mesh = util.transformRawCoords(rawCoords, box, angle, rotationMatrix, inputSize); // get processed mesh\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.meshAnnotations)) face.annotations[key] = coords.meshAnnotations[key].map((index) => face.mesh[index]); // add annotations\n face.score = face.faceScore;\n const calculatedBox = { ...util.calculateFaceBox(face.mesh, box), confidence: box.confidence, landmarks: box.landmarks };\n face.box = util.clampBox(calculatedBox, input);\n face.boxRaw = util.getRawBox(calculatedBox, input);\n /*\n const contoursT = results.find((t) => t.shape[t.shape.length - 1] === 266) as Tensor;\n const contoursData = contoursT && await contoursT.data(); // 133 x 2d points\n face.contoursRaw = [];\n for (let j = 0; j < contoursData.length / 2; j++) face.contoursRaw.push([contoursData[2 * j + 0] / inputSize, contoursData[2 * j + 1] / inputSize]);\n face.contours = face.contoursRaw.map((c) => [Math.trunc((input.shape[2] || 1) * c[0]), Math.trunc((input.shape[1] || 1) * c[1])]);\n */\n newCache.push(calculatedBox);\n }\n tf.dispose(results);\n }\n if (face.score > (config.face.detector?.minConfidence || 1)) faces.push(face);\n else tf.dispose(face.tensor);\n }\n cache.boxes = newCache; // reset cache\n return faces;\n}\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n // @ts-ignore private property\n if (config?.face?.attention?.enabled && model?.signature) {\n // @ts-ignore private property\n if (Object.keys(model?.signature?.outputs || {}).length < 6) model = null;\n }\n if (!model) {\n if (config.face.attention?.enabled) model = await loadModel(config.face.attention?.modelPath);\n else model = await loadModel(config.face.mesh?.modelPath);\n } else if (config.debug) {\n log('cached model:', model['modelUrl']);\n }\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n return model;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "/**\n * FaceRes model implementation\n *\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n *\n * Based on: [**HSE-FaceRes**](https://github.com/HSE-asavchenko/HSE_FaceRec_tf)\n */\n\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport type { Gender, Race } from '../result';\n\nexport type FaceRes = { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] };\n\nlet model: GraphModel | null;\nconst last: Array<{\n age: number,\n gender: Gender,\n genderScore: number,\n descriptor: number[],\n}> = [];\n\nlet lastTime = 0;\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.description?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport function enhance(input): Tensor {\n const tensor = (input.image || input.tensor || input) as Tensor; // input received from detector is already normalized to 0..1, input is also assumed to be straightened\n if (!model?.inputs[0].shape) return tensor; // model has no shape so no point continuing\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const norm = tf.mul(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n /*\n // do a tight crop of image and resize it to fit the model\n const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n const crop = (tensor.shape.length === 3)\n ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n */\n /*\n // convert to black&white to avoid colorization impact\n const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const [red, green, blue] = tf.split(crop, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n */\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, descriptor: [] };\n const skipFrame = skipped < (config.face.description?.skipFrames || 0);\n const skipTime = (config.face.description?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const obj = {\n age: 0,\n gender: 'unknown',\n genderScore: 0,\n descriptor: [],\n };\n\n if (config.face.description?.enabled) {\n const enhanced = enhance(image);\n const resT = model?.execute(enhanced) as Tensor[];\n lastTime = now();\n tf.dispose(enhanced);\n const genderT = await resT.find((t) => t.shape[1] === 1) as Tensor;\n const gender = await genderT.data();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > (config.face.description?.minConfidence || 0)) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const argmax = tf.argMax(resT.find((t) => t.shape[1] === 100), 1);\n const age = (await argmax.data())[0];\n tf.dispose(argmax);\n const ageT = resT.find((t) => t.shape[1] === 100) as Tensor;\n const all = await ageT.data();\n obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n const desc = resT.find((t) => t.shape[1] === 1024);\n // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n const descriptor = desc ? await desc.data() : [];\n obj.descriptor = Array.from(descriptor);\n resT.forEach((t) => tf.dispose(t));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Point } from '../result';\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]] as Point;\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]] as Point;\n const palmLandmarks = box.palmLandmarks.map((coord) => {\n const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n return scaledCoord;\n });\n return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]] as Point;\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [centers[0] - halfSize, centers[1] - halfSize] as Point;\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n const boxSize = [\n box.endPoint[0] - box.startPoint[0],\n box.endPoint[1] - box.startPoint[1],\n ];\n const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]] as Point;\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n", "/**\n * HandPose model implementation constants\n * See `handpose.ts` for entry point\n */\n\nexport const anchors = [\n { x: 0.015625, y: 0.015625 },\n { x: 0.015625, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n];\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport * as anchors from './handposeanchors';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Point } from '../result';\n\nexport class HandDetector {\n model: GraphModel;\n anchors: number[][];\n anchorsTensor: Tensor;\n inputSize: number;\n inputSizeTensor: Tensor;\n doubleInputSizeTensor: Tensor;\n\n constructor(model) {\n this.model = model;\n this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n this.anchorsTensor = tf.tensor2d(this.anchors);\n this.inputSize = (this.model && this.model.inputs && this.model.inputs[0].shape) ? this.model.inputs[0].shape[2] : 0;\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n const t: Record = {};\n t.boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n t.boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n t.div = tf.div(t.boxOffsets, this.inputSizeTensor);\n t.boxCenterPoints = tf.add(t.div, this.anchorsTensor);\n t.halfBoxSizes = tf.div(t.boxSizes, this.doubleInputSizeTensor);\n t.sub = tf.sub(t.boxCenterPoints, t.halfBoxSizes);\n t.startPoints = tf.mul(t.sub, this.inputSizeTensor);\n t.add = tf.add(t.boxCenterPoints, t.halfBoxSizes);\n t.endPoints = tf.mul(t.add, this.inputSizeTensor);\n const res = tf.concat2d([t.startPoints, t.endPoints], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n const t: Record = {};\n t.reshape = tf.reshape(rawPalmLandmarks, [-1, 7, 2]);\n t.div = tf.div(t.reshape, this.inputSizeTensor);\n t.landmarks = tf.add(t.div, this.anchors[index]);\n const res = tf.mul(t.landmarks, this.inputSizeTensor);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n async predict(input, config): Promise<{ startPoint: Point; endPoint: Point, palmLandmarks: Point[]; confidence: number }[]> {\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(input, [this.inputSize, this.inputSize]);\n t.div = tf.div(t.resize, constants.tf127);\n t.image = tf.sub(t.div, constants.tf1);\n t.batched = this.model.execute(t.image) as Tensor;\n t.predictions = tf.squeeze(t.batched);\n t.slice = tf.slice(t.predictions, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.slice);\n t.scores = tf.squeeze(t.sigmoid);\n const scores = await t.scores.data();\n t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);\n t.norm = this.normalizeBoxes(t.boxes);\n // box detection is flaky so we look for 3x boxes than we need results\n t.nms = tf.image.nonMaxSuppression(t.norm, t.scores, 3 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const nms = await t.nms.array() as Array;\n const hands: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number }> = [];\n for (const index of nms) {\n const p: Record = {};\n p.box = tf.slice(t.norm, [index, 0], [1, -1]);\n p.slice = tf.slice(t.predictions, [index, 5], [1, 14]);\n p.norm = this.normalizeLandmarks(p.slice, index);\n p.palmLandmarks = tf.reshape(p.norm, [-1, 2]);\n const box = await p.box.data();\n const startPoint = box.slice(0, 2) as unknown as Point;\n const endPoint = box.slice(2, 4) as unknown as Point;\n const palmLandmarks = await p.palmLandmarks.array();\n const hand = { startPoint, endPoint, palmLandmarks, confidence: scores[index] };\n const scaled = util.scaleBoxCoordinates(hand, [input.shape[2] / this.inputSize, input.shape[1] / this.inputSize]);\n hands.push(scaled);\n Object.keys(p).forEach((tensor) => tf.dispose(p[tensor]));\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return hands;\n }\n}\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport type * as detector from './handposedetector';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { now } from '../util/util';\nimport type { Point } from '../result';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\nlet lastTime = 0;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number } | null>;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;\n this.storedBoxes = [];\n this.skipped = Number.MAX_SAFE_INTEGER;\n this.detectedHands = 0;\n }\n\n // eslint-disable-next-line class-methods-use-this\n calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint };\n }\n\n getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n return util.enlargeBox(util.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = util.enlargeBox(util.squarifyBox(boundingBox), handBoxEnlargeFactor);\n boxAroundHand.palmLandmarks = [];\n for (let i = 0; i < palmLandmarkIds.length; i++) {\n boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n }\n return boxAroundHand;\n }\n\n transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n const boxSize = util.getBoxSize(box2);\n const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n const coordsScaled = rawCoords.map((coord) => [\n scaleFactor[0] * (coord[0] - this.inputSize / 2),\n scaleFactor[1] * (coord[1] - this.inputSize / 2),\n scaleFactor[2] * coord[2],\n ]);\n const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n const coordsRotated = coordsScaled.map((coord) => {\n const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n return [...rotated, coord[2]];\n });\n const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n const boxCenter = [...util.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n Math.trunc(coord[0] + originalBoxCenter[0]),\n Math.trunc(coord[1] + originalBoxCenter[1]),\n Math.trunc(coord[2]),\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames\n let boxes;\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = this.skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n boxes = await this.handDetector.predict(image, config);\n this.skipped = 0;\n }\n if (config.skipAllowed) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n this.detectedHands = 0;\n this.storedBoxes = [...boxes];\n // for (const possible of boxes) this.storedBoxes.push(possible);\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n const hands: Array<{ landmarks: Point[], confidence: number, boxConfidence: number, fingerConfidence: number, box: { topLeft: Point, bottomRight: Point } }> = [];\n\n // go through working set of boxes\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const currentBox = this.storedBoxes[i];\n if (!currentBox) continue;\n if (config.hand.landmarks) {\n const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n const palmCenter = util.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && env.kernels.includes('rotatewithoffset') ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n const croppedInput = util.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = tf.div(croppedInput, constants.tf255);\n tf.dispose(croppedInput);\n tf.dispose(rotatedImage);\n const [confidenceT, keypoints] = this.handPoseModel.execute(handImage) as Array;\n lastTime = now();\n tf.dispose(handImage);\n const confidence = (await confidenceT.data())[0];\n tf.dispose(confidenceT);\n if (confidence >= config.hand.minConfidence / 4) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = await keypointsReshaped.array();\n tf.dispose(keypoints);\n tf.dispose(keypointsReshaped);\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = { ...nextBoundingBox, confidence };\n const result = {\n landmarks: coords,\n confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n tf.dispose(keypoints);\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = util.enlargeBox(util.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: 0,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n landmarks: [],\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n if (hands.length > config.hand.maxDetected) hands.length = config.hand.maxDetected;\n return hands;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nexport const Finger = {\n thumb: 0,\n index: 1,\n middle: 2,\n ring: 3,\n pinky: 4,\n all: [0, 1, 2, 3, 4], // just for convenience\n nameMapping: { 0: 'thumb', 1: 'index', 2: 'middle', 3: 'ring', 4: 'pinky' },\n // Describes mapping of joints based on the 21 points returned by handpose.\n // [0] Palm\n // [1-4] Thumb\n // [5-8] Index\n // [9-12] Middle\n // [13-16] Ring\n // [17-20] Pinky\n pointsMapping: {\n 0: [[0, 1], [1, 2], [2, 3], [3, 4]],\n 1: [[0, 5], [5, 6], [6, 7], [7, 8]],\n 2: [[0, 9], [9, 10], [10, 11], [11, 12]],\n 3: [[0, 13], [13, 14], [14, 15], [15, 16]],\n 4: [[0, 17], [17, 18], [18, 19], [19, 20]],\n },\n getName: (value) => Finger.nameMapping[value],\n getPoints: (value) => Finger.pointsMapping[value],\n};\n\nexport const FingerCurl = {\n none: 0,\n half: 1,\n full: 2,\n nameMapping: { 0: 'none', 1: 'half', 2: 'full' },\n getName: (value) => FingerCurl.nameMapping[value],\n};\n\nexport const FingerDirection = {\n verticalUp: 0,\n verticalDown: 1,\n horizontalLeft: 2,\n horizontalRight: 3,\n diagonalUpRight: 4,\n diagonalUpLeft: 5,\n diagonalDownRight: 6,\n diagonalDownLeft: 7,\n nameMapping: { 0: 'verticalUp', 1: 'verticalDown', 2: 'horizontalLeft', 3: 'horizontalRight', 4: 'diagonalUpRight', 5: 'diagonalUpLeft', 6: 'diagonalDownRight', 7: 'diagonalDownLeft' },\n getName: (value) => FingerDirection.nameMapping[value],\n};\n\nexport class FingerGesture {\n name;\n curls;\n directions;\n weights;\n weightsRelative;\n\n constructor(name) {\n // name (should be unique)\n this.name = name;\n this.curls = {};\n this.directions = {};\n this.weights = [1.0, 1.0, 1.0, 1.0, 1.0];\n this.weightsRelative = [1.0, 1.0, 1.0, 1.0, 1.0];\n }\n\n curl(finger, curl, confidence) {\n if (typeof this.curls[finger] === 'undefined') this.curls[finger] = [];\n this.curls[finger].push([curl, confidence]);\n }\n\n direction(finger, position, confidence) {\n if (!this.directions[finger]) this.directions[finger] = [];\n this.directions[finger].push([position, confidence]);\n }\n\n weight(finger, weight) {\n this.weights[finger] = weight;\n // recalculate relative weights\n const total = this.weights.reduce((a, b) => a + b, 0);\n this.weightsRelative = this.weights.map((el) => el * 5 / total);\n }\n\n matchAgainst(detectedCurls, detectedDirections) {\n let confidence = 0.0;\n // look at the detected curl of each finger and compare with\n // the expected curl of this finger inside current gesture\n for (const fingerIdx in detectedCurls) {\n const detectedCurl = detectedCurls[fingerIdx];\n const expectedCurls = this.curls[fingerIdx];\n if (typeof expectedCurls === 'undefined') {\n // no curl description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible curl of this specific finger\n for (const [expectedCurl, score] of expectedCurls) {\n if (detectedCurl === expectedCurl) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n // same for detected direction of each finger\n for (const fingerIdx in detectedDirections) {\n const detectedDirection = detectedDirections[fingerIdx];\n const expectedDirections = this.directions[fingerIdx];\n if (typeof expectedDirections === 'undefined') {\n // no direction description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible direction of this specific finger\n for (const [expectedDirection, score] of expectedDirections) {\n if (detectedDirection === expectedDirection) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n return confidence / 10;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nimport { Finger, FingerCurl, FingerDirection, FingerGesture } from './fingerdef';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { thumb, index, middle, ring, pinky } = Finger;\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { none, half, full } = FingerCurl;\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { verticalUp, verticalDown, horizontalLeft, horizontalRight, diagonalUpRight, diagonalUpLeft, diagonalDownRight, diagonalDownLeft } = FingerDirection;\n\n// describe thumbs up gesture \uD83D\uDC4D\nconst ThumbsUp = new FingerGesture('thumbs up');\nThumbsUp.curl(thumb, none, 1.0);\nThumbsUp.direction(thumb, verticalUp, 1.0);\nThumbsUp.direction(thumb, diagonalUpLeft, 0.25);\nThumbsUp.direction(thumb, diagonalUpRight, 0.25);\nfor (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) {\n ThumbsUp.curl(finger, full, 1.0);\n ThumbsUp.direction(finger, horizontalLeft, 1.0);\n ThumbsUp.direction(finger, horizontalRight, 1.0);\n}\n\n// describe Victory gesture \u270C\uFE0F\nconst Victory = new FingerGesture('victory');\nVictory.curl(thumb, half, 0.5);\nVictory.curl(thumb, none, 0.5);\nVictory.direction(thumb, verticalUp, 1.0);\nVictory.direction(thumb, diagonalUpLeft, 1.0);\nVictory.curl(index, none, 1.0);\nVictory.direction(index, verticalUp, 0.75);\nVictory.direction(index, diagonalUpLeft, 1.0);\nVictory.curl(middle, none, 1.0);\nVictory.direction(middle, verticalUp, 1.0);\nVictory.direction(middle, diagonalUpLeft, 0.75);\nVictory.curl(ring, full, 1.0);\nVictory.direction(ring, verticalUp, 0.2);\nVictory.direction(ring, diagonalUpLeft, 1.0);\nVictory.direction(ring, horizontalLeft, 0.2);\nVictory.curl(pinky, full, 1.0);\nVictory.direction(pinky, verticalUp, 0.2);\nVictory.direction(pinky, diagonalUpLeft, 1.0);\nVictory.direction(pinky, horizontalLeft, 0.2);\nVictory.weight(index, 2);\nVictory.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst Point = new FingerGesture('point');\nPoint.curl(thumb, full, 1.0);\nPoint.curl(index, none, 0.5);\nPoint.curl(middle, full, 0.5);\nPoint.curl(ring, full, 0.5);\nPoint.curl(pinky, full, 0.5);\nPoint.weight(index, 2);\nPoint.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst MiddleFinger = new FingerGesture('middle finger');\nMiddleFinger.curl(thumb, none, 1.0);\nMiddleFinger.curl(index, full, 0.5);\nMiddleFinger.curl(middle, full, 0.5);\nMiddleFinger.curl(ring, full, 0.5);\nMiddleFinger.curl(pinky, full, 0.5);\nMiddleFinger.weight(index, 2);\nMiddleFinger.weight(middle, 2);\n\n// describe Open Palm gesture \u270C\uFE0F\nconst OpenPalm = new FingerGesture('open palm');\nOpenPalm.curl(thumb, none, 0.75);\nOpenPalm.curl(index, none, 0.75);\nOpenPalm.curl(middle, none, 0.75);\nOpenPalm.curl(ring, none, 0.75);\nOpenPalm.curl(pinky, none, 0.75);\n\nexport default [ThumbsUp, Victory, Point, MiddleFinger, OpenPalm];\n", "/**\n * FingerPose algorithm implementation constants\n *\n * Based on: [**FingerPose***](https://github.com/andypotato/fingerpose)\n */\n\nimport { Finger, FingerCurl, FingerDirection } from './fingerdef';\nimport Gestures from '../hand/fingergesture';\n\nconst minConfidence = 0.7;\nconst options = {\n // curl estimation\n HALF_CURL_START_LIMIT: 60.0,\n NO_CURL_START_LIMIT: 130.0,\n // direction estimation\n DISTANCE_VOTE_POWER: 1.1,\n SINGLE_ANGLE_VOTE_POWER: 0.9,\n TOTAL_ANGLE_VOTE_POWER: 1.6,\n};\n\nfunction calculateSlope(point1x, point1y, point2x, point2y) {\n const value = (point1y - point2y) / (point1x - point2x);\n let slope = Math.atan(value) * 180 / Math.PI;\n if (slope <= 0) slope = -slope;\n else if (slope > 0) slope = 180 - slope;\n return slope;\n}\n\n// point1, point2 are 2d or 3d point arrays (xy[z])\n// returns either a single scalar (2d) or array of two slopes (3d)\nfunction getSlopes(point1, point2) {\n if (!point1 || !point2) return [0, 0];\n const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);\n if (point1.length === 2) return slopeXY;\n const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]);\n return [slopeXY, slopeYZ];\n}\n\nfunction angleOrientationAt(angle, weightageAt = 1.0) {\n let isVertical = 0;\n let isDiagonal = 0;\n let isHorizontal = 0;\n if (angle >= 75.0 && angle <= 105.0) isVertical = 1 * weightageAt;\n else if (angle >= 25.0 && angle <= 155.0) isDiagonal = 1 * weightageAt;\n else isHorizontal = 1 * weightageAt;\n return [isVertical, isDiagonal, isHorizontal];\n}\n\nfunction estimateFingerCurl(startPoint, midPoint, endPoint) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const start_mid_z_dist = startPoint[2] - midPoint[2];\n const start_end_z_dist = startPoint[2] - endPoint[2];\n const mid_end_z_dist = midPoint[2] - endPoint[2];\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist);\n let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist);\n if (cos_in > 1.0) cos_in = 1.0;\n else if (cos_in < -1.0) cos_in = -1.0;\n let angleOfCurve = Math.acos(cos_in);\n angleOfCurve = (57.2958 * angleOfCurve) % 180;\n let fingerCurl;\n if (angleOfCurve > options.NO_CURL_START_LIMIT) fingerCurl = FingerCurl.none;\n else if (angleOfCurve > options.HALF_CURL_START_LIMIT) fingerCurl = FingerCurl.half;\n else fingerCurl = FingerCurl.full;\n return fingerCurl;\n}\n\nfunction estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n if (max_dist_x === Math.abs(start_end_x_dist)) {\n if (start_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else if (max_dist_x === Math.abs(start_mid_x_dist)) {\n if (start_mid_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else {\n if (mid_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n }\n return estimatedDirection;\n}\n\nfunction estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) {\n let estimatedDirection;\n if (max_dist_y === Math.abs(start_end_y_dist)) {\n if (start_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else if (max_dist_y === Math.abs(start_mid_y_dist)) {\n if (start_mid_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else {\n if (mid_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n }\n return estimatedDirection;\n}\n\nfunction estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n if (reqd_vertical_direction === FingerDirection.verticalUp) {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalUpLeft;\n else estimatedDirection = FingerDirection.diagonalUpRight;\n } else {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalDownLeft;\n else estimatedDirection = FingerDirection.diagonalDownRight;\n }\n return estimatedDirection;\n}\n\nfunction calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist));\n const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist));\n let voteVertical = 0.0;\n let voteDiagonal = 0.0;\n let voteHorizontal = 0.0;\n const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 0.00001);\n if (start_end_x_y_dist_ratio > 1.5) voteVertical += options.DISTANCE_VOTE_POWER;\n else if (start_end_x_y_dist_ratio > 0.66) voteDiagonal += options.DISTANCE_VOTE_POWER;\n else voteHorizontal += options.DISTANCE_VOTE_POWER;\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist);\n const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist);\n let calc_start_point_x = startPoint[0];\n let calc_start_point_y = startPoint[1];\n let calc_end_point_x = endPoint[0];\n let calc_end_point_y = endPoint[1];\n if (max_dist === start_mid_dist) {\n calc_end_point_x = endPoint[0];\n calc_end_point_y = endPoint[1];\n } else if (max_dist === mid_end_dist) {\n calc_start_point_x = midPoint[0];\n calc_start_point_y = midPoint[1];\n }\n const calcStartPoint = [calc_start_point_x, calc_start_point_y];\n const calcEndPoint = [calc_end_point_x, calc_end_point_y];\n const totalAngle = getSlopes(calcStartPoint, calcEndPoint);\n const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER);\n voteVertical += votes[0];\n voteDiagonal += votes[1];\n voteHorizontal += votes[2];\n for (const fingerSlope of fingerSlopes) {\n const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER);\n voteVertical += fingerVotes[0];\n voteDiagonal += fingerVotes[1];\n voteHorizontal += fingerVotes[2];\n }\n // in case of tie, highest preference goes to Vertical,\n // followed by horizontal and then diagonal\n let estimatedDirection;\n if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n } else {\n estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n }\n return estimatedDirection;\n}\n\nfunction estimate(landmarks) {\n // step 1: calculate slopes\n const slopesXY: Array = [];\n const slopesYZ: Array = [];\n const fingerCurls: Array = [];\n const fingerDirections: Array = [];\n if (!landmarks) return { curls: fingerCurls, directions: fingerDirections };\n\n // step 1: calculate slopes\n for (const finger of Finger.all) {\n const points = Finger.getPoints(finger);\n const slopeAtXY: Array = [];\n const slopeAtYZ: Array = [];\n for (const point of points) {\n const point1 = landmarks[point[0]];\n const point2 = landmarks[point[1]];\n // calculate single slope\n const slopes = getSlopes(point1, point2);\n const slopeXY = slopes[0];\n const slopeYZ = slopes[1];\n slopeAtXY.push(slopeXY);\n slopeAtYZ.push(slopeYZ);\n }\n slopesXY.push(slopeAtXY);\n slopesYZ.push(slopeAtYZ);\n }\n\n // step 2: calculate orientations\n for (const finger of Finger.all) {\n // start finger predictions from palm - except for thumb\n const pointIndexAt = (finger === Finger.thumb) ? 1 : 0;\n const fingerPointsAt = Finger.getPoints(finger);\n const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]];\n const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]];\n const endPoint = landmarks[fingerPointsAt[3][1]];\n // check if finger is curled\n const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint);\n const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt));\n fingerCurls[finger] = fingerCurled;\n fingerDirections[finger] = fingerPosition;\n }\n return { curls: fingerCurls, directions: fingerDirections };\n}\n\nexport function analyze(keypoints) { // get estimations of curl / direction for each finger\n if (!keypoints || keypoints.length === 0) return null;\n const estimatorRes = estimate(keypoints);\n const landmarks = {};\n for (const fingerIdx of Finger.all) {\n landmarks[Finger.getName(fingerIdx)] = {\n curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]),\n direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]),\n };\n }\n return landmarks;\n}\n\nexport function match(keypoints) { // compare gesture description to each known gesture\n const poses: Array<{ name: string, confidence: number }> = [];\n if (!keypoints || keypoints.length === 0) return poses;\n const estimatorRes = estimate(keypoints);\n for (const gesture of Gestures) {\n const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);\n if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence });\n }\n return poses;\n}\n", "/**\n * HandPose model implementation\n *\n * Based on: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n */\n\nimport { log } from '../util/util';\nimport * as handdetector from './handposedetector';\nimport * as handpipeline from './handposepipeline';\nimport * as fingerPose from './fingerpose';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, Box, Point } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palm: [0],\n};\n\nlet handDetectorModel: GraphModel | null;\nlet handPoseModel: GraphModel | null;\nlet handPipeline: handpipeline.HandPipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array = [];\n for (let i = 0; i < predictions.length; i++) {\n const annotations = {};\n if (predictions[i].landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n const keypoints = predictions[i].landmarks as unknown as Array;\n let box: Box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: Box = [0, 0, 0, 0];\n if (keypoints && keypoints.length > 0) { // if we have landmarks, calculate box based on landmarks\n for (const pt of keypoints) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)];\n } else { // otherwise use box from prediction\n box = predictions[i].box ? [\n Math.trunc(Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.max(0, predictions[i].box.topLeft[1])),\n Math.trunc(Math.min((input.shape[2] || 0), predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.min((input.shape[1] || 0), predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])),\n ] : [0, 0, 0, 0];\n boxRaw = [\n (predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n ];\n }\n const landmarks = fingerPose.analyze(keypoints);\n hands.push({\n id: i,\n score: Math.round(100 * predictions[i].confidence) / 100,\n boxScore: Math.round(100 * predictions[i].boxConfidence) / 100,\n fingerScore: Math.round(100 * predictions[i].fingerConfidence) / 100,\n label: 'hand',\n box,\n boxRaw,\n keypoints,\n annotations: annotations as HandResult['annotations'],\n landmarks: landmarks as HandResult['landmarks'],\n });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (env.initial) {\n handDetectorModel = null;\n handPoseModel = null;\n }\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? loadModel(config.hand.detector?.modelPath) : null,\n config.hand.landmarks ? loadModel(config.hand.skeleton?.modelPath) : null,\n ]);\n } else {\n if (config.debug) log('cached model:', handDetectorModel['modelUrl']);\n if (config.debug) log('cached model:', handPoseModel['modelUrl']);\n }\n const handDetector = new handdetector.HandDetector(handDetectorModel);\n handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "/** TFJS custom backend registration */\n\nimport type { Human } from '../human';\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\nimport * as models from '../models';\nimport type { AnyCanvas } from '../exports';\n// import { env } from '../env';\n\nexport const config = {\n name: 'humangl',\n priority: 999,\n canvas: null,\n gl: null,\n extensions: [],\n webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: false,\n desynchronized: true,\n },\n};\n\nfunction extensions(): void {\n /*\n https://www.khronos.org/registry/webgl/extensions/\n https://webglreport.com/?v=2\n */\n const gl = config.gl;\n if (!gl) return;\n config.extensions = gl.getSupportedExtensions() as string[];\n // gl.getExtension('KHR_parallel_shader_compile');\n}\n\n/**\n * Registers custom WebGL2 backend to be used by Human library\n *\n * @returns void\n */\nexport async function register(instance: Human): Promise {\n // force backend reload if gl context is not valid\n if (instance.config.backend !== 'humangl') return;\n if ((config.name in tf.engine().registry) && (!config.gl || !config.gl.getParameter(config.gl.VERSION))) {\n log('error: humangl backend invalid context');\n models.reset(instance);\n /*\n log('resetting humangl backend');\n await tf.removeBackend(config.name);\n await register(instance); // re-register\n */\n }\n if (!tf.findBackend(config.name)) {\n try {\n config.canvas = await image.canvas(100, 100);\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas?.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;\n const glv2 = config.gl.getParameter(config.gl.VERSION).includes('2.0');\n if (!glv2) {\n log('override: using fallback webgl backend as webgl 2.0 is not detected');\n instance.config.backend = 'webgl';\n return;\n }\n if (config.canvas) {\n config.canvas.addEventListener('webglcontextlost', async (e) => {\n log('error: humangl:', e.type);\n log('possible browser memory leak using webgl or conflict with multiple backend registrations');\n instance.emit('error');\n throw new Error('backend error: webgl context lost');\n // log('resetting humangl backend');\n // env.initial = true;\n // models.reset(instance);\n // await tf.removeBackend(config.name);\n // await register(instance); // re-register\n });\n config.canvas.addEventListener('webglcontextrestored', (e) => {\n log('error: humangl context restored:', e);\n });\n config.canvas.addEventListener('webglcontextcreationerror', (e) => {\n log('error: humangl context create:', e);\n });\n }\n } catch (err) {\n log('error: cannot get WebGL context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('error: cannot register WebGL backend:', err);\n return;\n }\n try {\n const kernels = tf.getKernelsForBackend('webgl');\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = { ...kernelConfig, backendName: config.name };\n tf.registerKernel(newKernelConfig);\n });\n } catch (err) {\n log('error: cannot update WebGL backend registration:', err);\n return;\n }\n const current = tf.backend().getGPGPUContext ? tf.backend().getGPGPUContext().gl : null;\n if (current) {\n log(`humangl webgl version:${current.getParameter(current.VERSION)} renderer:${current.getParameter(current.RENDERER)}`);\n } else {\n log('error: no current gl context:', current, config.gl);\n return;\n }\n try {\n if (tf.env().flagRegistry['WEBGL_VERSION']) tf.env().set('WEBGL_VERSION', 2);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n extensions();\n log('backend registered:', config.name);\n }\n}\n", "/** TFJS backend initialization and customization */\n\nimport type { Human } from '../human';\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as humangl from './humangl';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as constants from './constants';\n\nfunction registerCustomOps() {\n if (!env.kernels.includes('mod')) {\n const kernelMod = {\n kernelName: 'Mod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.sub(op.inputs.a, tf.mul(tf.div(op.inputs.a, op.inputs.b), op.inputs.b))),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('mod');\n }\n if (!env.kernels.includes('floormod')) {\n const kernelMod = {\n kernelName: 'FloorMod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.floorDiv(op.inputs.a / op.inputs.b) * op.inputs.b + tf.mod(op.inputs.a, op.inputs.b)),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('floormod');\n }\n}\n\nexport async function check(instance: Human, force = false) {\n instance.state = 'backend';\n if (force || env.initial || (instance.config.backend && (instance.config.backend.length > 0) && (tf.getBackend() !== instance.config.backend))) {\n const timeStamp = now();\n\n if (instance.config.backend && instance.config.backend.length > 0) {\n // detect web worker\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && instance.config.debug) {\n if (instance.config.debug) log('running inside web worker');\n }\n\n // force browser vs node backend\n if (env.browser && instance.config.backend === 'tensorflow') {\n if (instance.config.debug) log('override: backend set to tensorflow while running in browser');\n instance.config.backend = 'humangl';\n }\n if (env.node && (instance.config.backend === 'webgl' || instance.config.backend === 'humangl')) {\n if (instance.config.debug) log(`override: backend set to ${instance.config.backend} while running in nodejs`);\n instance.config.backend = 'tensorflow';\n }\n\n // handle webgpu\n if (env.browser && instance.config.backend === 'webgpu') {\n if (typeof navigator === 'undefined' || typeof navigator['gpu'] === 'undefined') {\n log('override: backend set to webgpu but browser does not support webgpu');\n instance.config.backend = 'humangl';\n } else {\n const adapter = await navigator['gpu'].requestAdapter();\n if (instance.config.debug) log('enumerated webgpu adapter:', adapter);\n if (!adapter) {\n log('override: backend set to webgpu but browser reports no available gpu');\n instance.config.backend = 'humangl';\n } else {\n // @ts-ignore requestAdapterInfo is not in tslib\n // eslint-disable-next-line no-undef\n const adapterInfo = 'requestAdapterInfo' in adapter ? await (adapter as GPUAdapter).requestAdapterInfo() : undefined;\n // if (adapter.features) adapter.features.forEach((feature) => log('webgpu features:', feature));\n log('webgpu adapter info:', adapterInfo);\n }\n }\n }\n\n // check available backends\n if (instance.config.backend === 'humangl') await humangl.register(instance);\n const available = Object.keys(tf.engine().registryFactory);\n if (instance.config.debug) log('available backends:', available);\n\n if (!available.includes(instance.config.backend)) {\n log(`error: backend ${instance.config.backend} not found in registry`);\n instance.config.backend = env.node ? 'tensorflow' : 'webgl';\n if (instance.config.debug) log(`override: setting backend ${instance.config.backend}`);\n }\n\n if (instance.config.debug) log('setting backend:', instance.config.backend);\n\n // customize wasm\n if (instance.config.backend === 'wasm') {\n if (tf.env().flagRegistry['CANVAS2D_WILL_READ_FREQUENTLY']) tf.env().set('CANVAS2D_WILL_READ_FREQUENTLY', true);\n if (instance.config.debug) log('wasm path:', instance.config.wasmPath);\n if (typeof tf?.setWasmPaths !== 'undefined') await tf.setWasmPaths(instance.config.wasmPath, instance.config.wasmPlatformFetch);\n else throw new Error('backend error: attempting to use wasm backend but wasm path is not set');\n const simd = await tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (instance.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (instance.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n try {\n await tf.setBackend(instance.config.backend);\n await tf.ready();\n constants.init();\n } catch (err) {\n log('error: cannot set backend:', instance.config.backend, err);\n return false;\n }\n }\n\n // customize humangl\n if (tf.getBackend() === 'humangl') {\n if (tf.env().flagRegistry['CHECK_COMPUTATION_FOR_ERRORS']) tf.env().set('CHECK_COMPUTATION_FOR_ERRORS', false);\n if (tf.env().flagRegistry['WEBGL_CPU_FORWARD']) tf.env().set('WEBGL_CPU_FORWARD', true);\n if (tf.env().flagRegistry['WEBGL_USE_SHAPES_UNIFORMS']) tf.env().set('WEBGL_USE_SHAPES_UNIFORMS', true);\n if (tf.env().flagRegistry['CPU_HANDOFF_SIZE_THRESHOLD']) tf.env().set('CPU_HANDOFF_SIZE_THRESHOLD', 256);\n if (tf.env().flagRegistry['WEBGL_EXP_CONV']) tf.env().set('WEBGL_EXP_CONV', true); // \n if (tf.env().flagRegistry['USE_SETTIMEOUTCUSTOM']) tf.env().set('USE_SETTIMEOUTCUSTOM', true); // \n // if (tf.env().flagRegistry['WEBGL_PACK_DEPTHWISECONV']) tf.env().set('WEBGL_PACK_DEPTHWISECONV', false);\n // if (if (tf.env().flagRegistry['WEBGL_FORCE_F16_TEXTURES']) && !instance.config.object.enabled) tf.env().set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (typeof instance.config['deallocate'] !== 'undefined' && instance.config['deallocate']) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n tf.env().set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n if (tf.backend().getGPGPUContext) {\n const gl = await tf.backend().getGPGPUContext().gl;\n if (instance.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n }\n\n // customize webgpu\n if (tf.getBackend() === 'webgpu') {\n // if (tf.env().flagRegistry['WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD']) tf.env().set('WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD', 512);\n // if (tf.env().flagRegistry['WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE']) tf.env().set('WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE', 0);\n // if (tf.env().flagRegistry['WEBGPU_CPU_FORWARD']) tf.env().set('WEBGPU_CPU_FORWARD', true);\n }\n\n // wait for ready\n tf.enableProdMode();\n await tf.ready();\n\n instance.performance.initBackend = Math.trunc(now() - timeStamp);\n instance.config.backend = tf.getBackend();\n\n await env.updateBackend(); // update env on backend init\n registerCustomOps();\n // await env.updateBackend(); // update env on backend init\n }\n return true;\n}\n\n// register fake missing tfjs ops\nexport function fakeOps(kernelNames: Array, config) {\n // if (config.debug) log('registerKernel:', kernelNames);\n for (const kernelName of kernelNames) {\n const kernelConfig = {\n kernelName,\n backendName: config.backend,\n kernelFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // setupFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // disposeFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n };\n tf.registerKernel(kernelConfig);\n }\n env.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase()); // re-scan registered ops\n}\n", "/**\n * HandTrack model implementation\n *\n * Based on:\n * - Hand Detection & Skeleton: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n * - Hand Tracking: [**HandTracking**](https://github.com/victordibia/handtracking)\n */\n\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, HandType, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as fingerPose from './fingerpose';\nimport { fakeOps } from '../tfjs/backend';\nimport { constants } from '../tfjs/constants';\n\nconst models: [GraphModel | null, GraphModel | null] = [null, null];\nconst modelOutputNodes = ['StatefulPartitionedCall/Postprocessor/Slice', 'StatefulPartitionedCall/Postprocessor/ExpandDims_1'];\n\nconst inputSize = [[0, 0], [0, 0]];\n\nconst classes = ['hand', 'fist', 'pinch', 'point', 'face', 'tip', 'pinchtip'];\nconst faceIndex = 4;\n\nconst boxExpandFact = 1.6;\nconst maxDetectorResolution = 512;\nconst detectorExpandFact = 1.4;\n\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastTime = 0;\nlet outputSize: [number, number] = [0, 0];\n\ntype HandDetectResult = {\n id: number,\n score: number,\n box: Box,\n boxRaw: Box,\n label: HandType,\n}\n\nconst cache: {\n boxes: Array,\n hands: Array;\n} = {\n boxes: [],\n hands: [],\n};\n\nconst fingerMap = {\n /*\n thumb: [0, 1, 2, 3, 4],\n index: [0, 5, 6, 7, 8],\n middle: [0, 9, 10, 11, 12],\n ring: [0, 13, 14, 15, 16],\n pinky: [0, 17, 18, 19, 20],\n palm: [0],\n */\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n base: [0],\n palm: [0, 17, 13, 9, 5, 1, 0],\n};\n\nexport async function loadDetect(config: Config): Promise {\n // HandTrack Model: Original: TFJS Port: \n if (env.initial) models[0] = null;\n if (!models[0]) {\n // handtrack model has some kernel ops defined in model but those are never referenced and non-existent in tfjs\n // ideally need to prune the model itself\n fakeOps(['tensorlistreserve', 'enter', 'tensorlistfromtensor', 'merge', 'loopcond', 'switch', 'exit', 'tensorliststack', 'nextiteration', 'tensorlistsetitem', 'tensorlistgetitem', 'reciprocal', 'shape', 'split', 'where'], config);\n models[0] = await loadModel(config.hand.detector?.modelPath);\n const inputs = Object.values(models[0].modelSignature['inputs']);\n inputSize[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[0]['modelUrl']);\n return models[0];\n}\n\nexport async function loadSkeleton(config: Config): Promise {\n if (env.initial) models[1] = null;\n if (!models[1]) {\n models[1] = await loadModel(config.hand.skeleton?.modelPath);\n const inputs = Object.values(models[1].modelSignature['inputs']);\n inputSize[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[1]['modelUrl']);\n return models[1];\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models[0]) await loadDetect(config);\n if (!models[1]) await loadSkeleton(config);\n return models;\n}\n\nasync function detectHands(input: Tensor, config: Config): Promise {\n const hands: HandDetectResult[] = [];\n if (!input || !models[0]) return hands;\n const t: Record = {};\n const ratio = (input.shape[2] || 1) / (input.shape[1] || 1);\n const height = Math.min(Math.round((input.shape[1] || 0) / 8) * 8, maxDetectorResolution); // use dynamic input size but cap at 512\n const width = Math.round(height * ratio / 8) * 8;\n t.resize = tf.image.resizeBilinear(input, [height, width]); // todo: resize with padding\n t.cast = tf.cast(t.resize, 'int32');\n [t.rawScores, t.rawBoxes] = await models[0].executeAsync(t.cast, modelOutputNodes) as Tensor[];\n t.boxes = tf.squeeze(t.rawBoxes, [0, 2]);\n t.scores = tf.squeeze(t.rawScores, [0]);\n const classScores: Array = tf.unstack(t.scores, 1); // unstack scores based on classes\n tf.dispose(classScores[faceIndex]);\n classScores.splice(faceIndex, 1); // remove faces\n t.filtered = tf.stack(classScores, 1); // restack\n tf.dispose(classScores);\n // t.filtered = t.scores;\n t.max = tf.max(t.filtered, 1); // max overall score\n t.argmax = tf.argMax(t.filtered, 1); // class index of max overall score\n let id = 0;\n t.nms = tf.image.nonMaxSuppression(t.boxes, t.max, (config.hand.maxDetected || 0) + 1, config.hand.iouThreshold || 0, config.hand.minConfidence || 1);\n const nms = await t.nms.data();\n const scores = await t.max.data();\n const classNum = await t.argmax.data();\n for (const nmsIndex of Array.from(nms)) { // generates results for each class\n const boxSlice = tf.slice(t.boxes, nmsIndex, 1);\n const boxYX = await boxSlice.data();\n tf.dispose(boxSlice);\n const boxData: Box = [boxYX[1], boxYX[0], boxYX[3] - boxYX[1], boxYX[2] - boxYX[0]]; // yx box reshaped to standard box\n const boxRaw: Box = box.scale(boxData, detectorExpandFact);\n const boxFull: Box = [Math.trunc(boxData[0] * outputSize[0]), Math.trunc(boxData[1] * outputSize[1]), Math.trunc(boxData[2] * outputSize[0]), Math.trunc(boxData[3] * outputSize[1])];\n const score = scores[nmsIndex];\n const label = classes[classNum[nmsIndex]] as HandType;\n const hand: HandDetectResult = { id: id++, score, box: boxFull, boxRaw, label };\n hands.push(hand);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n hands.sort((a, b) => b.score - a.score);\n if (hands.length > (config.hand.maxDetected || 1)) hands.length = (config.hand.maxDetected || 1);\n return hands;\n}\n\nasync function detectFingers(input: Tensor, h: HandDetectResult, config: Config): Promise {\n const hand: HandResult = { // initial values inherited from hand detect\n id: h.id,\n score: Math.round(100 * h.score) / 100,\n boxScore: Math.round(100 * h.score) / 100,\n fingerScore: 0,\n box: h.box,\n boxRaw: h.boxRaw,\n label: h.label,\n keypoints: [],\n landmarks: {} as HandResult['landmarks'],\n annotations: {} as HandResult['annotations'],\n };\n if (input && models[1] && config.hand.landmarks && h.score > (config.hand.minConfidence || 0)) {\n const t: Record = {};\n const boxCrop = [h.boxRaw[1], h.boxRaw[0], h.boxRaw[3] + h.boxRaw[1], h.boxRaw[2] + h.boxRaw[0]] as Box;\n t.crop = tf.image.cropAndResize(input, [boxCrop], [0], [inputSize[1][0], inputSize[1][1]], 'bilinear');\n t.div = tf.div(t.crop, constants.tf255);\n [t.score, t.keypoints] = models[1].execute(t.div, ['Identity_1', 'Identity']) as Tensor[];\n const rawScore = (await t.score.data())[0];\n const score = (100 - Math.trunc(100 / (1 + Math.exp(rawScore)))) / 100; // reverse sigmoid value\n if (score >= (config.hand.minConfidence || 0)) {\n hand.fingerScore = score;\n t.reshaped = tf.reshape(t.keypoints, [-1, 3]);\n const coordsData: Point[] = await t.reshaped.array() as Point[];\n const coordsRaw: Point[] = coordsData.map((kpt) => [kpt[0] / inputSize[1][1], kpt[1] / inputSize[1][0], (kpt[2] || 0)]);\n const coordsNorm: Point[] = coordsRaw.map((kpt) => [kpt[0] * h.boxRaw[2], kpt[1] * h.boxRaw[3], (kpt[2] || 0)]);\n hand.keypoints = (coordsNorm).map((kpt) => [outputSize[0] * (kpt[0] + h.boxRaw[0]), outputSize[1] * (kpt[1] + h.boxRaw[1]), (kpt[2] || 0)]);\n hand.landmarks = fingerPose.analyze(hand.keypoints) as HandResult['landmarks']; // calculate finger gestures\n for (const key of Object.keys(fingerMap)) { // map keypoints to per-finger annotations\n hand.annotations[key] = fingerMap[key].map((index: number) => (hand.landmarks && hand.keypoints[index] ? hand.keypoints[index] : null));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n return hand;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!models[0] || !models[1] || !models[0]?.inputs[0].shape || !models[1]?.inputs[0].shape) return []; // something is wrong with the model\n outputSize = [input.shape[2] || 0, input.shape[1] || 0];\n skipped++; // increment skip frames\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.hands; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const skipTimeExtended = 3 * (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrameExtended = skipped < 3 * (config.hand.skipFrames || 0);\n if (config.skipAllowed && cache.hands.length === config.hand.maxDetected) { // we have all detected hands so we're definitely skipping\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else if (config.skipAllowed && skipTimeExtended && skipFrameExtended && cache.hands.length > 0) { // we have some cached results: maybe not enough but anyhow continue for bit longer\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else { // finally rerun detector\n cache.boxes = await detectHands(input, config);\n lastTime = now();\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n skipped = 0;\n }\n\n const oldCache = [...cache.boxes];\n cache.boxes.length = 0; // reset cache\n if (config.cacheSensitivity > 0) {\n for (let i = 0; i < cache.hands.length; i++) {\n const boxKpt = box.square(cache.hands[i].keypoints, outputSize);\n if (boxKpt.box[2] / (input.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input.shape[1] || 1) > 0.05 && cache.hands[i].fingerScore && cache.hands[i].fingerScore > (config.hand.minConfidence || 0)) {\n const boxScale = box.scale(boxKpt.box, boxExpandFact);\n const boxScaleRaw = box.scale(boxKpt.boxRaw, boxExpandFact);\n // const boxCrop = box.crop(boxScaleRaw);\n cache.boxes.push({ ...oldCache[i], box: boxScale, boxRaw: boxScaleRaw });\n }\n }\n }\n for (let i = 0; i < cache.hands.length; i++) { // replace detected boxes with calculated boxes in final output\n const bbox = box.calc(cache.hands[i].keypoints, outputSize);\n cache.hands[i].box = bbox.box;\n cache.hands[i].boxRaw = bbox.boxRaw;\n }\n resolve(cache.hands);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.liveness?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return 0;\n const skipTime = (config.face.liveness?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.liveness?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "export const kpt: Array = [ // used to create part labels\n 'nose',\n 'leftEye',\n 'rightEye',\n 'leftEar',\n 'rightEar',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n];\n\nexport const horizontal: Array = [ // used to fix left vs right\n ['leftEye', 'rightEye'],\n ['leftEar', 'rightEar'],\n ['leftShoulder', 'rightShoulder'],\n ['leftElbow', 'rightElbow'],\n ['leftWrist', 'rightWrist'],\n ['leftHip', 'rightHip'],\n ['leftKnee', 'rightKnee'],\n ['leftAnkle', 'rightAnkle'],\n];\n\nexport const vertical: Array = [ // used to remove unlikely keypoint positions\n ['leftKnee', 'leftShoulder'],\n ['rightKnee', 'rightShoulder'],\n ['leftAnkle', 'leftKnee'],\n ['rightAnkle', 'rightKnee'],\n];\n\nexport const relative: Array = [ // used to match relative body parts\n [['leftHip', 'rightHip'], ['leftShoulder', 'rightShoulder']],\n [['leftElbow', 'rightElbow'], ['leftShoulder', 'rightShoulder']],\n];\n\nexport const connected: Record = { // used to create body outline in annotations\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "import type { BodyKeypoint, BodyResult } from '../result';\nimport * as box from '../util/box';\nimport * as coords from './movenetcoords';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../tfjs/types';\n\nconst maxJitter = 0.005; // default allowed jitter is within 0.5%\n\nconst cache: {\n keypoints: Array,\n padding: [number, number][];\n} = {\n keypoints: [],\n padding: [[0, 0], [0, 0], [0, 0], [0, 0]],\n};\n\nexport function bodyParts(body: BodyResult) { // model sometimes mixes up left vs right keypoints so we fix them\n for (const pair of coords.horizontal) { // fix body parts left vs right\n const left = body.keypoints.findIndex((kp) => kp.part === pair[0]);\n const right = body.keypoints.findIndex((kp) => kp.part === pair[1]);\n if (body.keypoints[left] && body.keypoints[right]) {\n if (body.keypoints[left].position[0] < body.keypoints[right].position[0]) {\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n }\n for (const pair of coords.vertical) { // remove body parts with improbable vertical position\n const lower = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const higher = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n if (body.keypoints[lower] && body.keypoints[higher]) {\n if (body.keypoints[lower].position[1] < body.keypoints[higher].position[1]) {\n body.keypoints.splice(lower, 1);\n }\n }\n }\n for (const [pair, compare] of coords.relative) { // rearrange body parts according to their relative position\n const left = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const right = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n const leftTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[0]));\n const rightTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[1]));\n if (!body.keypoints[leftTo] || !body.keypoints[rightTo]) continue; // only if we have both compare points\n const distanceLeft = body.keypoints[left] ? [\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[left].position[0]),\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[left].position[0]),\n ] : [0, 0];\n const distanceRight = body.keypoints[right] ? [\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[right].position[0]),\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[right].position[0]),\n ] : [0, 0];\n if (distanceLeft[0] > distanceLeft[1] || distanceRight[0] > distanceRight[1]) { // should flip keypoints\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n}\n\nexport function jitter(keypoints: Array): Array {\n for (let i = 0; i < keypoints.length; i++) {\n if (keypoints[i] && cache.keypoints[i]) {\n const diff = [Math.abs(keypoints[i].positionRaw[0] - cache.keypoints[i].positionRaw[0]), Math.abs(keypoints[i].positionRaw[1] - cache.keypoints[i].positionRaw[1])];\n if (diff[0] < maxJitter && diff[1] < maxJitter) {\n keypoints[i] = cache.keypoints[i]; // below jitter so replace keypoint\n } else {\n cache.keypoints[i] = keypoints[i]; // above jitter so update cache\n }\n } else {\n cache.keypoints[i] = keypoints[i]; // cache for keypoint doesnt exist so create it here\n }\n }\n return keypoints;\n}\n\nexport function padInput(input: Tensor, inputSize: number): Tensor {\n const t: Record = {};\n if (!input.shape || !input.shape[1] || !input.shape[2]) return input;\n cache.padding = [\n [0, 0], // dont touch batch\n [input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0], // height before&after\n [input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0], // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(input, cache.padding);\n t.resize = tf.image.resizeBilinear(t.pad, [inputSize, inputSize]);\n const final = tf.cast(t.resize, 'int32');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nexport function rescaleBody(body: BodyResult, outputSize: [number, number]): BodyResult {\n body.keypoints = body.keypoints.filter((kpt) => kpt && kpt.position); // filter invalid keypoints\n for (const kpt of body.keypoints) {\n kpt.position = [\n kpt.position[0] * (outputSize[0] + cache.padding[2][0] + cache.padding[2][1]) / outputSize[0] - cache.padding[2][0],\n kpt.position[1] * (outputSize[1] + cache.padding[1][0] + cache.padding[1][1]) / outputSize[1] - cache.padding[1][0],\n ];\n kpt.positionRaw = [\n kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1],\n ];\n }\n const rescaledBoxes = box.calc(body.keypoints.map((pt) => pt.position), outputSize);\n body.box = rescaledBoxes.box;\n body.boxRaw = rescaledBoxes.boxRaw;\n return body;\n}\n", "/**\n * MoveNet model implementation\n *\n * Based on: [**MoveNet**](https://blog.tensorflow.org/2021/05/next-generation-pose-detection-with-movenet-and-tensorflowjs.html)\n */\n\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as coords from './movenetcoords';\nimport * as fix from './movenetfix';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, BodyAnnotation, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { fakeOps } from '../tfjs/backend';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n// const boxExpandFact = 1.5; // increase to 150%\n\nconst cache: {\n boxes: Array, // unused\n bodies: Array;\n last: number,\n} = {\n boxes: [],\n bodies: [],\n last: 0,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n fakeOps(['size'], config);\n model = await loadModel(config.body.modelPath);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n if (inputSize < 64) inputSize = 256;\n return model;\n}\n\nasync function parseSinglePose(res, config, image) {\n const kpt = res[0][0];\n const keypoints: Array = [];\n let score = 0;\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[id][1], kpt[id][0]];\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw,\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * positionRaw[0]),\n Math.round((image.shape[1] || 0) * positionRaw[1]),\n ],\n });\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const bodies: Array = [];\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n const annotations: Record = {};\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id: 0, score, box: newBox.box, boxRaw: newBox.boxRaw, keypoints, annotations };\n fix.bodyParts(body);\n bodies.push(body);\n return bodies;\n}\n\nasync function parseMultiPose(res, config, image) {\n const bodies: Array = [];\n for (let id = 0; id < res[0].length; id++) {\n const kpt = res[0][id];\n const totalScore = Math.round(100 * kpt[51 + 4]) / 100;\n if (totalScore > config.body.minConfidence) {\n const keypoints: Array = [];\n for (let i = 0; i < 17; i++) {\n const score = kpt[3 * i + 2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[3 * i + 1], kpt[3 * i + 0]];\n keypoints.push({\n part: coords.kpt[i] as BodyLandmark,\n score: Math.round(100 * score) / 100,\n positionRaw,\n position: [Math.round((image.shape[2] || 0) * positionRaw[0]), Math.round((image.shape[1] || 0) * positionRaw[1])],\n });\n }\n }\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n // movenet-multipose has built-in box details\n // const boxRaw: Box = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]];\n // const box: Box = [Math.trunc(boxRaw[0] * (image.shape[2] || 0)), Math.trunc(boxRaw[1] * (image.shape[1] || 0)), Math.trunc(boxRaw[2] * (image.shape[2] || 0)), Math.trunc(boxRaw[3] * (image.shape[1] || 0))];\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id, score: totalScore, box: newBox.box, boxRaw: newBox.boxRaw, keypoints: [...keypoints], annotations };\n fix.bodyParts(body);\n bodies.push(body);\n }\n }\n bodies.sort((a, b) => b.score - a.score);\n if (bodies.length > config.body.maxDetected) bodies.length = config.body.maxDetected;\n return bodies;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!model || !model?.inputs[0].shape) return []; // something is wrong with the model\n if (!config.skipAllowed) cache.boxes.length = 0; // allowed to use cache or not\n skipped++; // increment skip frames\n const skipTime = (config.body.skipTime || 0) > (now() - cache.last);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.bodies; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const t: Record = {};\n skipped = 0;\n // run detection on squared input and cached boxes\n /*\n cache.bodies = []; // reset bodies result\n if (cache.boxes.length >= (config.body.maxDetected || 0)) { // if we have enough cached boxes run detection using cache\n for (let i = 0; i < cache.boxes.length; i++) { // run detection based on cached boxes\n t.crop = tf.image.cropAndResize(input, [cache.boxes[i]], [0], [inputSize, inputSize], 'bilinear');\n t.cast = tf.cast(t.crop, 'int32');\n // t.input = prepareImage(input);\n t.res = model?.execute(t.cast) as Tensor;\n const res = await t.res.array();\n const newBodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, cache.boxes[i]) : await parseMultiPose(res, config, input, cache.boxes[i]);\n cache.bodies = cache.bodies.concat(newBodies);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n }\n if (cache.bodies.length !== config.body.maxDetected) { // did not find enough bodies based on cached boxes so run detection on full frame\n t.input = prepareImage(input);\n t.res = model?.execute(t.input) as Tensor;\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, [0, 0, 1, 1]) : await parseMultiPose(res, config, input, [0, 0, 1, 1]);\n for (const body of cache.bodies) rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n cache.boxes.length = 0; // reset cache\n for (let i = 0; i < cache.bodies.length; i++) {\n if (cache.bodies[i].keypoints.length > (coords.kpt.length / 2)) { // only update cache if we detected at least half keypoints\n const scaledBox = box.scale(cache.bodies[i].boxRaw, boxExpandFact);\n const cropBox = box.crop(scaledBox);\n cache.boxes.push(cropBox);\n }\n }\n */\n\n // run detection on squared input and no cached boxes\n t.input = fix.padInput(input, inputSize);\n t.res = model?.execute(t.input) as Tensor;\n cache.last = now();\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17)\n ? await parseSinglePose(res, config, input)\n : await parseMultiPose(res, config, input);\n for (const body of cache.bodies) {\n fix.rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n fix.jitter(body.keypoints);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n\n resolve(cache.bodies);\n });\n}\n", "/**\n * NanoDet object detection model implementation\n *\n * Based on: [**MB3-CenterNet**](https://github.com/610265158/mobilenetv3_centernet)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel;\nlet last: Array = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet inputSize = 0;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) {\n model = await loadModel(config.object.modelPath);\n const inputs = Object.values(model.modelSignature['inputs']);\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor[], outputShape: [number, number], config: Config) {\n let id = 0;\n let results: Array = [];\n for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n // find scores, boxes, classes\n const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) === labels.length)));\n const scores = await scoresT.array(); // optionally use exponential scores or just as-is\n const featuresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) < labels.length)));\n const boxesMaxT = 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 boxIdxT = boxesMaxT.argMax(2); // what we need is indexes of features with highest scores, not values itself\n const boxIdx = await boxIdxT.array(); // what we need is indexes of features with highest scores, not values itself\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > (config.object.minConfidence || 0) && j !== 61) {\n const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n const boxOffset = boxIdx[i].map((a: number) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n const [x, y] = [\n cx - (scaleBox / strideSize * boxOffset[0]),\n cy - (scaleBox / strideSize * boxOffset[1]),\n ];\n const [w, h] = [\n cx + (scaleBox / strideSize * boxOffset[2]) - x,\n cy + (scaleBox / strideSize * boxOffset[3]) - y,\n ];\n let boxRaw: Box = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))) as Box; // fix out-of-bounds coords\n const box = [ // results normalized to input image pixels\n boxRaw[0] * outputShape[0],\n boxRaw[1] * outputShape[1],\n boxRaw[2] * outputShape[0],\n boxRaw[3] * outputShape[1],\n ];\n const result = {\n id: id++,\n // strideSize,\n score: Math.round(100 * score) / 100,\n class: j + 1,\n label: labels[j].label as ObjectType,\n // center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n // centerRaw: [cx, cy],\n box: box.map((a) => Math.trunc(a)) as Box,\n boxRaw,\n };\n results.push(result);\n }\n }\n }\n tf.dispose([scoresT, featuresT, boxesMaxT, boxIdxT]);\n }\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 = tf.image.nonMaxSuppression(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = await nms.data();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((_val, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n if (!env.kernels.includes('mod') || !env.kernels.includes('sparsetodense')) return last;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2] || 0, image.shape[1] || 0];\n const resizeT = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n const normT = tf.div(resizeT, constants.tf255);\n const transposeT = tf.transpose(normT, [0, 3, 1, 2]);\n\n let objectT;\n if (config.object.enabled) objectT = model.execute(transposeT);\n lastTime = now();\n\n const obj = await process(objectT as Tensor[], outputSize as [number, number], config);\n last = obj;\n tf.dispose([resizeT, normT, transposeT, ...objectT]);\n resolve(obj);\n });\n}\n", "/**\n * PoseNet body detection model implementation constants\n * See `posenet.ts` for entry point\n */\n\nimport type { Point, BodyResult, BodyAnnotation, BodyLandmark } from '../result';\n\nexport const partNames = [\n 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n result[jointName] = i;\n return result;\n}, {});\n\nconst connectedPartNames = [\n ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n ['rightKnee', 'rightAnkle'],\n];\n\nexport function eitherPointDoesntMeetConfidence(a: number, b: number, minConfidence: number) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence: number) {\n return connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints): [number, number, number, number] {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]): Array {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i): BodyResult => ({\n id: i,\n score: pose.score,\n boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score: score as number,\n part: part as BodyLandmark,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)] as Point,\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] as Point,\n })),\n annotations: {} as Record,\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: Array; // don't touch\n numberOfElements: number;\n getElementValue: unknown; // function call\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n // @ts-ignore getter is of unknown type\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + count),\n };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n const { heatmapY, heatmapX, id: keypoint } = part;\n const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n return {\n x: part.heatmapX * outputStride + x,\n y: part.heatmapY * outputStride + y,\n };\n}\n\nexport function fillArray(element, size) {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = element;\n }\n return result;\n}\n\nexport function clamp(a, min, max) {\n if (a < min) return min;\n if (a > max) return max;\n return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n const dy = y2 - y1;\n const dx = x2 - x1;\n return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "/**\n * PoseNet body detection model implementation\n *\n * Based on: [**PoseNet**](https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5)\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyResult, BodyLandmark, Box } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as utils from './posenetutils';\n\nlet model: GraphModel;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n const getDisplacement = (point) => ({\n y: displacements.get(point.y, point.x, edgeId),\n x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n });\n const getStridedIndexNearPoint = (point, height, width) => ({\n y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n });\n\n const [height, width] = scores.shape;\n // Nearest neighbor interpolation for the source->target displacements.\n const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n const displacement = getDisplacement(sourceKeypointIndices);\n const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n let targetKeypoint = displacedPoint;\n for (let i = 0; i < offsetRefineStep; i++) {\n const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n targetKeypoint = utils.addVectors(\n { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n { x: offsetPoint.x, y: offsetPoint.y },\n );\n }\n const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n return { position: targetKeypoint, part: utils.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = utils.poseChain.map(([parentJoinName, childJoinName]) => ([utils.partIds[parentJoinName], utils.partIds[childJoinName]]));\n const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n const numParts = scores.shape[2]; // [21,21,17]\n const numEdges = edgesFwd.length;\n const keypoints = new Array(numParts);\n // Start a new detection instance at the position of the root.\n const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n keypoints[root.part.id] = {\n score: root.score,\n part: utils.partNames[root.part.id] as BodyLandmark,\n position: rootPoint,\n };\n // Decode the part positions upwards in the tree, following the backward displacements.\n for (let edge = numEdges - 1; edge >= 0; --edge) {\n const sourceId = edgesFwd[edge];\n const targetId = edgesBwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n }\n }\n // Decode the part positions downwards in the tree, following the forward displacements.\n for (let edge = 0; edge < numEdges; ++edge) {\n const sourceId = edgesBwd[edge];\n const targetId = edgesFwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n }\n }\n return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n const [height, width] = scores.shape;\n let localMaximum = true;\n const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n localMaximum = false;\n break;\n }\n }\n if (!localMaximum) break;\n }\n return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n const [height, width, numKeypoints] = scores.shape;\n const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n const score = scores.get(heatmapY, heatmapX, keypointId);\n // Only consider parts with score greater or equal to threshold as root candidates.\n if (score < minConfidence) continue;\n // Only consider keypoints whose score is maximum in a local window.\n if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n }\n }\n }\n return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n return poses.some(({ keypoints }) => {\n const correspondingKeypoint = keypoints[keypointId]?.position;\n if (!correspondingKeypoint) return false;\n return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n if (!withinRadius(existingPoses, position, keypointId)) result += score;\n return result;\n }, 0.0);\n return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n const poses: Array<{ keypoints, box: Box, score: number }> = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n // @ts-ignore this one is tree walk\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n // @ts-ignore this one is tree walk\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n /** posenet is mostly obsolete\n * caching is not implemented\n */\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = tf.sub(tf.div(tf.cast(resized, 'float32'), 127.5), 1.0);\n const results: Array = model.execute(normalized, poseNetOutputs) as Array;\n const results3d = results.map((y) => tf.squeeze(y, [0]));\n results3d[1] = tf.sigmoid(results3d[1]); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor: Tensor) => tensor.buffer()));\n for (const t of res) tf.dispose(t);\n\n const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n if (!model.inputs[0].shape) return [];\n const scaled = utils.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as BodyResult[];\n return scaled;\n}\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "/**\n * Image segmentation for body detection model\n *\n * Based on:\n * - [**MediaPipe Meet**](https://drive.google.com/file/d/1lnP1bRi9CSqQQXUHa13159vLELYDgDu0/preview)\n * - [**MediaPipe Selfie**](https://drive.google.com/file/d/1dCfozqknMa068vVsO2j_1FgZkW_e3VWv/preview)\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport * as image from '../image/image';\nimport { constants } from '../tfjs/constants';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport type { Input, AnyCanvas } from '../exports';\n\nlet model: GraphModel;\nlet busy = false;\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.segmentation.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function process(input: Input, background: Input | undefined, config: Config)\n: Promise<{ data: Array | Tensor, canvas: AnyCanvas | null, alpha: AnyCanvas | null }> {\n if (busy) return { data: [], canvas: null, alpha: null };\n busy = true;\n if (!model) await load(config);\n const inputImage = await image.process(input, config);\n const width = inputImage.tensor?.shape[2] || 0;\n const height = inputImage.tensor?.shape[1] || 0;\n if (!inputImage.tensor) return { data: [], canvas: null, alpha: null };\n const t: Record = {};\n\n t.resize = tf.image.resizeBilinear(inputImage.tensor, [model.inputs[0].shape ? model.inputs[0].shape[1] : 0, model.inputs[0].shape ? model.inputs[0].shape[2] : 0], false);\n tf.dispose(inputImage.tensor);\n t.norm = tf.div(t.resize, constants.tf255);\n t.res = model.execute(t.norm) as Tensor;\n\n t.squeeze = tf.squeeze(t.res, 0); // meet.shape:[1,256,256,1], selfie.shape:[1,144,256,2]\n if (t.squeeze.shape[2] === 2) {\n t.softmax = tf.softmax(t.squeeze); // model meet has two channels for fg and bg\n [t.bg, t.fg] = tf.unstack(t.softmax, 2);\n t.expand = tf.expandDims(t.fg, 2);\n t.pad = tf.expandDims(t.expand, 0);\n t.crop = tf.image.cropAndResize(t.pad, [[0, 0, 0.5, 0.5]], [0], [width, height]);\n // running sofmax before unstack creates 2x2 matrix so we only take upper-left quadrant\n // otherwise run softmax after unstack and use standard resize\n // resizeOutput = tf.image.resizeBilinear(expand, [input.tensor?.shape[1], input.tensor?.shape[2]]);\n t.data = tf.squeeze(t.crop, 0);\n } else {\n t.data = tf.image.resizeBilinear(t.squeeze, [height, width]); // model selfie has a single channel that we can use directly\n }\n const data = Array.from(await t.data.data()) as number[];\n\n if (env.node && !env.Canvas && (typeof ImageData === 'undefined')) {\n if (config.debug) log('canvas support missing');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return { data, canvas: null, alpha: null }; // running in nodejs so return alpha array as-is\n }\n\n const alphaCanvas = image.canvas(width, height);\n // @ts-ignore browser is not defined in tfjs-node\n if (tf.browser) await tf.browser.toPixels(t.data, alphaCanvas);\n const alphaCtx = alphaCanvas.getContext('2d') as CanvasRenderingContext2D;\n if (config.segmentation.blur && config.segmentation.blur > 0) alphaCtx.filter = `blur(${config.segmentation.blur}px)`; // use css filter for bluring, can be done with gaussian blur manually instead\n const alphaData = alphaCtx.getImageData(0, 0, width, height);\n\n const compositeCanvas = image.canvas(width, height);\n const compositeCtx = compositeCanvas.getContext('2d') as CanvasRenderingContext2D;\n if (inputImage.canvas) compositeCtx.drawImage(inputImage.canvas, 0, 0);\n compositeCtx.globalCompositeOperation = 'darken'; // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation // best options are: darken, color-burn, multiply\n if (config.segmentation.blur && config.segmentation.blur > 0) compositeCtx.filter = `blur(${config.segmentation.blur}px)`; // use css filter for bluring, can be done with gaussian blur manually instead\n compositeCtx.drawImage(alphaCanvas, 0, 0);\n compositeCtx.globalCompositeOperation = 'source-over'; // reset composite operation\n compositeCtx.filter = 'none'; // reset css filter\n const compositeData = compositeCtx.getImageData(0, 0, width, height);\n for (let i = 0; i < width * height; i++) compositeData.data[4 * i + 3] = alphaData.data[4 * i + 0]; // copy original alpha value to new composite canvas\n compositeCtx.putImageData(compositeData, 0, 0);\n\n let mergedCanvas: AnyCanvas | null = null;\n if (background && compositeCanvas) { // draw background with segmentation as overlay if background is present\n mergedCanvas = image.canvas(width, height);\n const bgImage = await image.process(background, config);\n tf.dispose(bgImage.tensor);\n const ctxMerge = mergedCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctxMerge.drawImage(bgImage.canvas as HTMLCanvasElement, 0, 0, mergedCanvas.width, mergedCanvas.height);\n ctxMerge.drawImage(compositeCanvas, 0, 0);\n }\n\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n busy = false;\n // return { data, canvas: mergedCanvas || compositeCanvas, alpha: alphaCanvas };\n return { data, canvas: compositeCanvas, alpha: alphaCanvas };\n}\n", "import { log, join } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { GraphModel } from './types';\nimport type { Config } from '../config';\nimport * as modelsDefs from '../../models/models.json';\nimport { validateModel } from '../models';\n\nconst options = {\n cacheModels: true,\n cacheSupported: true,\n verbose: true,\n debug: false,\n modelBasePath: '',\n};\n\nexport type ModelInfo = {\n name: string,\n inCache: boolean,\n sizeDesired: number,\n sizeFromManifest: number,\n sizeLoadedWeights: number,\n}\n\nexport const modelStats: Record = {};\n\nasync function httpHandler(url, init?): Promise {\n if (options.debug) log('load model fetch:', url, init);\n return fetch(url, init);\n}\n\nexport function setModelLoadOptions(config: Config) {\n options.cacheModels = config.cacheModels;\n options.verbose = config.debug;\n options.modelBasePath = config.modelBasePath;\n}\n\nexport async function loadModel(modelPath: string | undefined): Promise {\n let modelUrl = join(options.modelBasePath, modelPath || '');\n if (!modelUrl.toLowerCase().endsWith('.json')) modelUrl += '.json';\n const modelPathSegments = modelUrl.includes('/') ? modelUrl.split('/') : modelUrl.split('\\\\');\n const shortModelName = modelPathSegments[modelPathSegments.length - 1].replace('.json', '');\n const cachedModelName = 'indexeddb://' + shortModelName; // generate short model name for cache\n modelStats[shortModelName] = {\n name: shortModelName,\n sizeFromManifest: 0,\n sizeLoadedWeights: 0,\n sizeDesired: modelsDefs[shortModelName],\n inCache: false,\n };\n options.cacheSupported = (typeof window !== 'undefined') && (typeof window.localStorage !== 'undefined') && (typeof window.indexedDB !== 'undefined'); // check if running in browser and if indexedb is available\n let cachedModels = {};\n try {\n cachedModels = (options.cacheSupported && options.cacheModels) ? await tf.io.listModels() : {}; // list all models already in cache // this fails for webview although localStorage is defined\n } catch {\n options.cacheSupported = false;\n }\n modelStats[shortModelName].inCache = (options.cacheSupported && options.cacheModels) && Object.keys(cachedModels).includes(cachedModelName); // is model found in cache\n const tfLoadOptions = typeof fetch === 'undefined' ? {} : { fetchFunc: (url, init?) => httpHandler(url, init) };\n const model: GraphModel = new tf.GraphModel(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions) as unknown as GraphModel; // create model prototype and decide if load from cache or from original modelurl\n let loaded = false;\n try {\n // @ts-ignore private function\n model.findIOHandler(); // decide how to actually load a model\n if (options.debug) log('model load handler:', model['handler']);\n // @ts-ignore private property\n const artifacts = await model.handler.load(); // load manifest\n modelStats[shortModelName].sizeFromManifest = artifacts?.weightData?.byteLength || 0;\n model.loadSync(artifacts); // load weights\n // @ts-ignore private property\n modelStats[shortModelName].sizeLoadedWeights = model?.artifacts?.weightData?.byteLength || 0;\n if (options.verbose) log('load model:', model['modelUrl'], { bytes: modelStats[shortModelName].sizeLoadedWeights }, options);\n loaded = true;\n } catch (err) {\n log('error loading model:', modelUrl, err);\n }\n if (loaded && options.cacheModels && options.cacheSupported && !modelStats[shortModelName].inCache) { // save model to cache\n try {\n const saveResult = await model.save(cachedModelName);\n log('model saved:', cachedModelName, saveResult);\n } catch (err) {\n log('error saving model:', modelUrl, err);\n }\n }\n validateModel(null, model, `${modelPath}`);\n return model;\n}\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { mergeDeep, now } from '../util/util';\nimport { env } from '../util/env';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport { face } from './face';\nimport { body } from './body';\nimport { hand } from './hand';\nimport { object } from './object';\nimport { gesture } from './gesture';\nimport type { Result, PersonResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\nlet drawTime = 0;\n\nexport { options } from './options';\nexport { face } from './face';\nexport { body } from './body';\nexport { hand } from './hand';\nexport { object } from './object';\nexport { gesture } from './gesture';\n\n/** draw combined person results instead of individual detection result objects */\nexport async function person(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n\n for (let i = 0; i < result.length; i++) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `person #${i}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\n/** draw processed canvas */\nexport async function canvas(input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) {\n if (!input || !output) return;\n const ctx = getCanvasContext(output);\n if (!ctx) return;\n ctx.drawImage(input, 0, 0);\n}\n\n/** meta-function that performs draw for: canvas, face, body, hand */\nexport async function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial) {\n if (!result || !result.performance || !result || !inCanvas) return null;\n const timeStamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n const promise = Promise.all([\n face(inCanvas, result.face, localOptions),\n body(inCanvas, result.body, localOptions),\n hand(inCanvas, result.hand, localOptions),\n object(inCanvas, result.object, localOptions),\n gesture(inCanvas, result.gesture, localOptions), // gestures do not have buffering\n // person(inCanvas, result.persons, localOptions); // already included above\n ]);\n drawTime = env.perfadd ? drawTime + Math.round(now() - timeStamp) : Math.round(now() - timeStamp);\n result.performance.draw = drawTime;\n return promise;\n}\n", "import { log } from '../util/util';\nimport type { AnyCanvas } from '../exports';\nimport type { Point } from '../result';\nimport type { DrawOptions } from './options';\n\nexport const getCanvasContext = (input: AnyCanvas) => {\n if (!input) log('draw error: invalid canvas');\n else if (!input.getContext) log('draw error: canvas context not defined');\n else {\n const ctx = input.getContext('2d');\n if (!ctx) log('draw error: cannot get canvas context');\n else return ctx;\n }\n return null;\n};\n\nexport const rad2deg = (theta: number) => Math.round((theta * 180) / Math.PI);\n\nexport const colorDepth = (z: number | undefined, opt: DrawOptions): string => { // performance optimization needed\n if (!opt.useDepth || typeof z === 'undefined') return opt.color;\n const rgb = Uint8ClampedArray.from([127 + (2 * z), 127 - (2 * z), 255]);\n return `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${opt.alpha})`;\n};\n\nexport function point(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, z: number | undefined, localOptions: DrawOptions) {\n ctx.fillStyle = colorDepth(z, localOptions);\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nexport function rect(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, width: number, height: number, localOptions: DrawOptions) {\n ctx.beginPath();\n ctx.lineWidth = localOptions.lineWidth;\n if (localOptions.useCurves) {\n const cx = (x + x + width) / 2;\n const cy = (y + y + height) / 2;\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nexport function lines(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n ctx.strokeStyle = colorDepth(pt[2] || 0, localOptions);\n ctx.lineTo(Math.trunc(pt[0]), Math.trunc(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport function curves(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.lineWidth = localOptions.lineWidth;\n if (!localOptions.useCurves || points.length <= 2) {\n lines(ctx, points, localOptions);\n return;\n }\n ctx.moveTo(points[0][0], points[0][1]);\n for (let i = 0; i < points.length - 2; i++) {\n const xc = (points[i][0] + points[i + 1][0]) / 2;\n const yc = (points[i][1] + points[i + 1][1]) / 2;\n ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n }\n ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport function arrow(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, from: Point, to: Point, radius = 5) {\n let angle;\n let x;\n let y;\n ctx.beginPath();\n ctx.moveTo(from[0], from[1]);\n ctx.lineTo(to[0], to[1]);\n angle = Math.atan2(to[1] - from[1], to[0] - from[0]);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.moveTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n}\n", "/** Draw Options\n * - Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n */\nexport type DrawOptions = {\n /** draw line color */\n color: string,\n /** alpha value used for lines */\n alpha: number,\n /** label color */\n labelColor: string,\n /** label shadow color */\n shadowColor: string,\n /** label font */\n font: string,\n /** line spacing between labels */\n lineHeight: number,\n /** line width for drawn lines */\n lineWidth: number,\n /** size of drawn points */\n pointSize: number,\n /** draw rounded boxes by n pixels */\n roundRect: number,\n /** should points be drawn? */\n drawPoints: boolean,\n /** should labels be drawn? */\n drawLabels: boolean,\n /** should face attention keypoints be highlighted */\n drawAttention: boolean;\n /** should detected gestures be drawn? */\n drawGestures: boolean,\n /** should draw boxes around detection results? */\n drawBoxes: boolean,\n /** should draw polygons from detection points? */\n drawPolygons: boolean,\n /** should draw gaze arrows? */\n drawGaze: boolean,\n /** should fill polygons? */\n fillPolygons: boolean,\n /** use z-coordinate when available */\n useDepth: boolean,\n /** should lines be curved? */\n useCurves: boolean,\n}\n\n/** currently set draw options {@link DrawOptions} */\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n alpha: 0.5,\n font: 'small-caps 16px \"Segoe UI\"',\n lineHeight: 18,\n lineWidth: 4,\n pointSize: 2,\n roundRect: 8,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawAttention: true,\n drawGestures: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n};\n", "import { TRI468 as triangulation } from '../face/facemeshcoords';\nimport { mergeDeep } from '../util/util';\nimport { getCanvasContext, rad2deg, rect, point, lines, arrow } from './primitives';\nimport { options } from './options';\nimport * as facemeshConstants from '../face/constants';\nimport type { FaceResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\nlet opt: DrawOptions;\n\nfunction drawLabels(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawLabels) {\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face: ${Math.trunc(100 * f.score)}%`);\n if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`distance: ${f.iris}`);\n if (f.real) labels.push(`real: ${Math.trunc(100 * f.real)}%`);\n if (f.live) labels.push(`live: ${Math.trunc(100 * f.live)}%`);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n if (emotion.length > 3) emotion.length = 3;\n labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.gaze) {\n if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}\u00B0 yaw:${rad2deg(f.rotation.angle.yaw)}\u00B0 pitch:${rad2deg(f.rotation.angle.pitch)}\u00B0`);\n if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\u00B0`);\n }\n if (labels.length === 0) labels.push('face');\n ctx.fillStyle = opt.color;\n for (let i = labels.length - 1; i >= 0; i--) {\n const x = Math.max(f.box[0], 0);\n const y = i * opt.lineHeight + f.box[1];\n if (opt.shadowColor && opt.shadowColor !== '') {\n ctx.fillStyle = opt.shadowColor;\n ctx.fillText(labels[i], x + 5, y + 16);\n }\n ctx.fillStyle = opt.labelColor;\n ctx.fillText(labels[i], x + 4, y + 15);\n }\n }\n}\n\nfunction drawIrisElipse(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris'] && f.annotations['leftEyeIris'][0]) {\n ctx.strokeStyle = opt.useDepth ? 'rgba(255, 200, 255, 0.3)' : opt.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 (opt.fillPolygons) {\n ctx.fillStyle = opt.useDepth ? 'rgba(255, 255, 200, 0.3)' : opt.color;\n ctx.fill();\n }\n }\n if (f.annotations && f.annotations['rightEyeIris'] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = opt.useDepth ? 'rgba(255, 200, 255, 0.3)' : opt.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 (opt.fillPolygons) {\n ctx.fillStyle = opt.useDepth ? 'rgba(255, 255, 200, 0.3)' : opt.color;\n ctx.fill();\n }\n }\n}\n\nfunction drawGazeSpheres(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawGaze && f.rotation?.angle && typeof Path2D !== 'undefined') {\n ctx.strokeStyle = 'pink';\n const valX = (f.box[0] + f.box[2] / 2) - (f.box[3] * rad2deg(f.rotation.angle.yaw) / 90);\n const valY = (f.box[1] + f.box[3] / 2) + (f.box[2] * rad2deg(f.rotation.angle.pitch) / 90);\n const pathV = new Path2D(`\n M ${f.box[0] + f.box[2] / 2} ${f.box[1]}\n C\n ${valX} ${f.box[1]},\n ${valX} ${f.box[1] + f.box[3]},\n ${f.box[0] + f.box[2] / 2} ${f.box[1] + f.box[3]}\n `);\n const pathH = new Path2D(`\n M ${f.box[0]} ${f.box[1] + f.box[3] / 2}\n C \n ${f.box[0]} ${valY},\n ${f.box[0] + f.box[2]} ${valY},\n ${f.box[0] + f.box[2]} ${f.box[1] + f.box[3] / 2}\n `);\n ctx.stroke(pathH);\n ctx.stroke(pathV);\n }\n}\n\nfunction drawGazeArrows(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawGaze && f.rotation?.gaze?.strength && f.rotation?.gaze?.bearing && f.annotations['leftEyeIris'] && f.annotations['rightEyeIris'] && f.annotations['leftEyeIris'][0] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = 'pink';\n ctx.fillStyle = 'pink';\n const leftGaze = [\n f.annotations['leftEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['leftEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]], [leftGaze[0], leftGaze[1]], 4);\n const rightGaze = [\n f.annotations['rightEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['rightEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]], [rightGaze[0], rightGaze[1]], 4);\n }\n}\n\nfunction drawFacePolygons(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawPolygons && f.mesh.length >= 468) {\n ctx.lineWidth = 1;\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [triangulation[i * 3 + 0], triangulation[i * 3 + 1], triangulation[i * 3 + 2]].map((index) => f.mesh[index]);\n lines(ctx, points, opt);\n }\n drawIrisElipse(f, ctx);\n }\n /*\n if (opt.drawPolygons && f.contours.length > 1) {\n ctx.lineWidth = 5;\n lines(ctx, f.contours, opt);\n }\n ctx.lineWidth = 1;\n */\n}\n\nfunction drawFacePoints(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawPoints && f.mesh.length >= 468) {\n for (let i = 0; i < f.mesh.length; i++) {\n point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2], opt);\n if (opt.drawAttention) {\n if (facemeshConstants.LANDMARKS_REFINEMENT_LIPS_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) + 127, opt);\n if (facemeshConstants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) - 127, opt);\n if (facemeshConstants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) - 127, opt);\n }\n }\n }\n}\n\nfunction drawFaceBoxes(f: FaceResult, ctx) {\n if (opt.drawBoxes) {\n rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], opt);\n }\n}\n\n/** draw detected faces */\nexport async function face(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n opt = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.font = opt.font;\n ctx.strokeStyle = opt.color;\n ctx.fillStyle = opt.color;\n for (const f of result) {\n drawFaceBoxes(f, ctx);\n drawLabels(f, ctx);\n if (f.mesh && f.mesh.length > 0) {\n drawFacePoints(f, ctx);\n drawFacePolygons(f, ctx);\n drawGazeSpheres(f, ctx);\n drawGazeArrows(f, ctx);\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, curves, colorDepth } from './primitives';\nimport { options } from './options';\nimport type { BodyResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected bodies */\nexport async function body(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n }\n if (localOptions.drawPoints && result[i].keypoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n if (!result[i].keypoints[pt].score || (result[i].keypoints[pt].score === 0)) continue;\n ctx.fillStyle = colorDepth(result[i].keypoints[pt].position[2], localOptions);\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels && result[i].keypoints) {\n ctx.font = localOptions.font;\n for (const pt of result[i].keypoints) {\n if (!pt.score || (pt.score === 0)) continue;\n ctx.fillStyle = colorDepth(pt.position[2], localOptions);\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {\n for (const part of Object.values(result[i].annotations)) {\n for (const connected of part) curves(ctx, connected, localOptions);\n }\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, colorDepth } from './primitives';\nimport { options } from './options';\nimport type { HandResult } from '../result';\nimport type { AnyCanvas, DrawOptions, Point } from '../exports';\n\n/** draw detected hands */\nexport async function hand(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); // can use h.label\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); // can use h.label\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = colorDepth(pt[2], localOptions);\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels && h.annotations) {\n const addHandLabel = (part: Array, title: string) => {\n if (!part || part.length === 0 || !part[0]) return;\n const z = part[part.length - 1][2] || -256;\n ctx.fillStyle = colorDepth(z, localOptions);\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['index'], 'index');\n addHandLabel(h.annotations['middle'], 'middle');\n addHandLabel(h.annotations['ring'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palm'], 'palm');\n }\n if (localOptions.drawPolygons && h.annotations) {\n const addHandLine = (part: Array) => {\n if (!part || part.length === 0 || !part[0]) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n const z = part[i][2] || 0;\n ctx.strokeStyle = colorDepth(i * z, localOptions);\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['index']);\n addHandLine(h.annotations['middle']);\n addHandLine(h.annotations['ring']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palm);\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport type { ObjectResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected objects */\nexport async function object(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${h.label} ${Math.round(100 * h.score)}%`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext } from './primitives';\nimport { options } from './options';\nimport type { GestureResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected gestures */\nexport async function gesture(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (localOptions.drawGestures) {\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.font = localOptions.font;\n ctx.fillStyle = localOptions.color;\n let i = 1;\n for (let j = 0; j < result.length; j++) {\n let where: unknown[] = []; // what&where is a record\n let what: unknown[] = []; // what&where is a record\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && ((what[1] as string).length > 0)) {\n const who = where[1] as number > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${who}: ${what[1]}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n i += 1;\n }\n }\n }\n}\n", "import type { Tensor } from '../tfjs/types';\nimport type { FaceResult } from '../result';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { meshAnnotations } from './facemeshcoords';\n\nconst expandFact = 0.1;\nconst alpha = 0.5;\n\n// point inclusion in polygon based on https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\nfunction insidePoly(x: number, y: number, polygon: Array<{ x: number, y: number }>): boolean {\n let inside = false;\n let j = polygon.length - 1;\n for (let i = 0; i < polygon.length; j = i++) {\n if (((polygon[i].y > y) !== (polygon[j].y > y)) && (x < (polygon[j].x - polygon[i].x) * (y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)) inside = !inside;\n }\n return inside;\n}\n\nexport async function mask(face: FaceResult): Promise {\n if (!face.tensor) return face.tensor;\n if (!face.mesh || face.mesh.length < 100) return face.tensor;\n const width = face.tensor.shape[2] || 0;\n const height = face.tensor.shape[1] || 0;\n const buffer = await face.tensor.buffer();\n let silhouette: Array<{ x: number, y: number }> = [];\n for (const pt of meshAnnotations.silhouette) silhouette.push({ x: (face.mesh[pt][0] - face.box[0]) / face.box[2], y: (face.mesh[pt][1] - face.box[1]) / face.box[3] }); // add all silhouette points scaled to local box\n if (expandFact && expandFact > 0) silhouette = silhouette.map((pt) => ({ x: pt.x > 0.5 ? pt.x + expandFact : pt.x - expandFact, y: pt.y > 0.5 ? pt.y + expandFact : pt.y - expandFact })); // expand silhouette\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n const inside = insidePoly(x / width, y / width, silhouette);\n if (!inside) {\n buffer.set(alpha * buffer.get(0, y, x, 0), 0, y, x, 0);\n buffer.set(alpha * buffer.get(0, y, x, 1), 0, y, x, 1);\n buffer.set(alpha * buffer.get(0, y, x, 2), 0, y, x, 2);\n }\n }\n }\n const output = buffer.toTensor();\n tf.dispose(buffer);\n return output;\n}\n", "import type { Point, FaceResult } from '../result';\n\ntype Vector = [number, number, number];\n\nconst calculateGaze = (face: FaceResult): { bearing: number, strength: number } => {\n const radians = (pt1: Point, pt2: Point) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\n if (!face.annotations['rightEyeIris'] || !face.annotations['leftEyeIris']) return { bearing: 0, strength: 0 };\n\n const offsetIris = [0, -0.1]; // iris center may not align with average of eye extremes\n const eyeRatio = 1; // factor to normalize changes x vs y\n\n const left = (face.mesh[33][2] || 0) > (face.mesh[263][2] || 0); // pick left or right eye depending which one is closer bazed on outsize point z axis\n const irisCenter = left ? face.mesh[473] : face.mesh[468];\n const eyeCenter = left // eye center is average of extreme points on x axis for both x and y, ignoring y extreme points as eyelids naturally open/close more when gazing up/down so relative point is less precise\n ? [(face.mesh[133][0] + face.mesh[33][0]) / 2, (face.mesh[133][1] + face.mesh[33][1]) / 2]\n : [(face.mesh[263][0] + face.mesh[362][0]) / 2, (face.mesh[263][1] + face.mesh[362][1]) / 2];\n const eyeSize = left // eye size is difference between extreme points for both x and y, used to normalize & squarify eye dimensions\n ? [face.mesh[133][0] - face.mesh[33][0], face.mesh[23][1] - face.mesh[27][1]]\n : [face.mesh[263][0] - face.mesh[362][0], face.mesh[253][1] - face.mesh[257][1]];\n const eyeDiff: Point = [ // x distance between extreme point and center point normalized with eye size\n (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],\n eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1],\n ];\n let strength = Math.sqrt((eyeDiff[0] * eyeDiff[0]) + (eyeDiff[1] * eyeDiff[1])); // vector length is a diagonal between two differences\n strength = Math.min(strength, face.boxRaw[2] / 2, face.boxRaw[3] / 2); // limit strength to half of box size to avoid clipping due to low precision\n const bearing = (radians([0, 0], eyeDiff) + (Math.PI / 2)) % Math.PI; // using eyeDiff instead eyeCenter/irisCenter combo due to manual adjustments and rotate clockwise 90degrees\n return { bearing, strength };\n};\n\nexport const calculateFaceAngle = (face: FaceResult, imageSize: [number, number]): {\n angle: { pitch: number, yaw: number, roll: number },\n matrix: [number, number, number, number, number, number, number, number, number],\n gaze: { bearing: number, strength: number },\n} => {\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v: Vector): Vector => { // normalize vector\n const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n v[0] /= length;\n v[1] /= length;\n v[2] /= length;\n return v;\n };\n const subVectors = (a: Vector, b: Vector): Vector => { // vector subtraction (a - b)\n const x = a[0] - b[0];\n const y = a[1] - b[1];\n const z = a[2] - b[2];\n return [x, y, z];\n };\n const crossVectors = (a: Vector, b: Vector): Vector => { // vector cross product (a x b)\n const x = a[1] * b[2] - a[2] * b[1];\n const y = a[2] * b[0] - a[0] * b[2];\n const z = a[0] * b[1] - a[1] * b[0];\n return [x, y, z];\n };\n // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n const rotationMatrixToEulerAngle = (r: number[]): { pitch: number, yaw: number, roll: number } => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const [r00, _r01, _r02, r10, r11, r12, r20, r21, r22] = r;\n let thetaX: number;\n let thetaY: number;\n let thetaZ: number;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n if (isNaN(thetaX)) thetaX = 0;\n if (isNaN(thetaY)) thetaY = 0;\n if (isNaN(thetaZ)) thetaZ = 0;\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n\n /*\n const meshToEulerAngle = (mesh) => { // simple Euler angle calculation based existing 3D mesh\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n return { // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face // pitch is face move up/down\n yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye // yaw is face turn left/right\n roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye // roll is face lean left/right\n };\n };\n */\n\n // initialize gaze and mesh\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } };\n\n const size = Math.max(face.boxRaw[2] * imageSize[0], face.boxRaw[3] * imageSize[1]) / 1.5;\n // top, bottom, left, right\n const pts: Point[] = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [pt[0] * imageSize[0] / size, pt[1] * imageSize[1] / size, pt[2]] as Point); // make the xyz coordinates proportional, independent of the image/box size\n\n const y_axis = normalize(subVectors(pts[1] as Vector, pts[0] as Vector));\n let x_axis = normalize(subVectors(pts[3] as Vector, pts[2] as Vector));\n const z_axis = normalize(crossVectors(x_axis, y_axis));\n // adjust x_axis to make sure that all axes are perpendicular to each other\n x_axis = crossVectors(y_axis, z_axis);\n\n // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n const matrix: [number, number, number, number, number, number, number, number, number] = [\n x_axis[0], x_axis[1], x_axis[2],\n y_axis[0], y_axis[1], y_axis[2],\n z_axis[0], z_axis[1], z_axis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n\n // we have iris keypoints so we can calculate gaze direction\n const gaze = mesh.length === 478 ? calculateGaze(face) : { bearing: 0, strength: 0 };\n\n return { angle, matrix, gaze };\n};\n", "/**\n * Face algorithm implementation\n * Uses FaceMesh, Emotion and FaceRes models to create a unified pipeline\n */\n\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as facemesh from './facemesh';\nimport * as emotion from '../gear/emotion';\nimport * as faceres from './faceres';\nimport * as mask from './mask';\nimport * as antispoof from './antispoof';\nimport * as liveness from './liveness';\nimport * as gear from '../gear/gear';\nimport * as ssrnetAge from '../gear/ssrnet-age';\nimport * as ssrnetGender from '../gear/ssrnet-gender';\nimport * as mobilefacenet from './mobilefacenet';\nimport * as insightface from './insightface';\nimport type { FaceResult, Emotion, Gender, Race } from '../result';\nimport type { Tensor } from '../tfjs/types';\nimport type { Human } from '../human';\nimport { calculateFaceAngle } from './angles';\n\ntype DescRes = { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] };\n\nexport const detectFace = async (instance: Human /* instance of human */, input: Tensor): Promise => {\n // run facemesh, includes blazeface and iris\n // eslint-disable-next-line no-async-promise-executor\n let timeStamp: number = now();\n let ageRes: { age: number } | Promise<{ age: number }> | null;\n let gearRes: gear.GearType | Promise | null;\n let genderRes: { gender: string, genderScore: number } | Promise<{ gender: string, genderScore: number }> | null;\n let emotionRes: { score: number, emotion: Emotion }[] | Promise<{ score: number, emotion: Emotion }[]>;\n let mobilefacenetRes: number[] | Promise | null;\n let insightfaceRes: number[] | Promise | null;\n let antispoofRes: number | Promise | null;\n let livenessRes: number | Promise | null;\n let descRes: DescRes | Promise | null;\n\n const faceRes: Array = [];\n instance.state = 'run:face';\n\n const faces = await facemesh.predict(input, instance.config);\n instance.performance.face = env.perfadd ? (instance.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n if (!input.shape || input.shape.length !== 4) return [];\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n instance.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefied\n if (!faces[i].tensor || faces[i].tensor['isDisposedInternal']) {\n log('Face object is disposed:', faces[i].tensor);\n continue;\n }\n\n // optional face mask\n if (instance.config.face.detector?.mask) {\n const masked = await mask.mask(faces[i]);\n tf.dispose(faces[i].tensor);\n faces[i].tensor = masked as Tensor;\n }\n\n // calculate face angles\n const rotation = faces[i].mesh && (faces[i].mesh.length > 200) ? calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]) : null;\n\n // run emotion, inherits face from blazeface\n instance.analyze('Start Emotion:');\n if (instance.config.async) {\n emotionRes = instance.config.face.emotion?.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : [];\n } else {\n instance.state = 'run:emotion';\n timeStamp = now();\n emotionRes = instance.config.face.emotion?.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : [];\n instance.performance.emotion = env.perfadd ? (instance.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Emotion:');\n\n // run antispoof, inherits face from blazeface\n instance.analyze('Start AntiSpoof:');\n if (instance.config.async) {\n antispoofRes = instance.config.face.antispoof?.enabled ? antispoof.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:antispoof';\n timeStamp = now();\n antispoofRes = instance.config.face.antispoof?.enabled ? await antispoof.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.antispoof = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End AntiSpoof:');\n\n // run liveness, inherits face from blazeface\n instance.analyze('Start Liveness:');\n if (instance.config.async) {\n livenessRes = instance.config.face.liveness?.enabled ? liveness.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:liveness';\n timeStamp = now();\n livenessRes = instance.config.face.liveness?.enabled ? await liveness.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.liveness = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Liveness:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start GEAR:');\n if (instance.config.async) {\n gearRes = instance.config.face['gear']?.enabled ? gear.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:gear';\n timeStamp = now();\n gearRes = instance.config.face['gear']?.enabled ? await gear.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.gear = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End GEAR:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start SSRNet:');\n if (instance.config.async) {\n ageRes = instance.config.face['ssrnet']?.enabled ? ssrnetAge.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? ssrnetGender.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:ssrnet';\n timeStamp = now();\n ageRes = instance.config.face['ssrnet']?.enabled ? await ssrnetAge.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? await ssrnetGender.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.ssrnet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End SSRNet:');\n\n // run mobilefacenet alternative, inherits face from blazeface\n instance.analyze('Start MobileFaceNet:');\n if (instance.config.async) {\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:mobilefacenet';\n timeStamp = now();\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? await mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End MobileFaceNet:');\n\n // run insightface alternative, inherits face from blazeface\n instance.analyze('Start InsightFace:');\n if (instance.config.async) {\n insightfaceRes = instance.config.face['insightface']?.enabled ? insightface.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:mobilefacenet';\n timeStamp = now();\n insightfaceRes = instance.config.face['insightface']?.enabled ? await insightface.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End InsightFace:');\n\n // run faceres, inherits face from blazeface\n instance.analyze('Start Description:');\n if (instance.config.async) {\n descRes = faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length);\n } else {\n instance.state = 'run:description';\n timeStamp = now();\n descRes = await faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length);\n instance.performance.description = env.perfadd ? (instance.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Description:');\n\n // if async wait for results\n if (instance.config.async) {\n [ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes]);\n }\n instance.analyze('Finish Face:');\n\n if (instance.config.face['ssrnet']?.enabled && ageRes && genderRes) { // override age/gender if ssrnet model is used\n descRes = {\n ...(descRes as DescRes),\n age: (ageRes as { age: number}).age,\n gender: (genderRes as { gender: Gender, genderScore: number }).gender,\n genderScore: (genderRes as { gender: Gender, genderScore: number }).genderScore,\n };\n }\n if (instance.config.face['gear']?.enabled && gearRes) { // override age/gender/race if gear model is used\n descRes = {\n ...(descRes as DescRes),\n age: (gearRes as gear.GearType).age,\n gender: (gearRes as gear.GearType).gender,\n genderScore: (gearRes as gear.GearType).genderScore,\n race: (gearRes as gear.GearType).race,\n };\n }\n if (instance.config.face['mobilefacenet']?.enabled && mobilefacenetRes) { // override descriptor if mobilefacenet model is used\n (descRes as DescRes).descriptor = mobilefacenetRes as number[];\n }\n\n if (instance.config.face['insightface']?.enabled && insightfaceRes) { // override descriptor if insightface model is used\n (descRes as DescRes).descriptor = insightfaceRes as number[];\n }\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!instance.config.face.iris?.enabled) {\n // if (faces[i]?.annotations?.leftEyeIris) delete faces[i].annotations.leftEyeIris;\n // if (faces[i]?.annotations?.rightEyeIris) delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations && faces[i].annotations.leftEyeIris && faces[i].annotations.leftEyeIris[0] && faces[i].annotations.rightEyeIris && faces[i].annotations.rightEyeIris[0]\n && (faces[i].annotations.leftEyeIris.length > 0) && (faces[i].annotations.rightEyeIris.length > 0)\n && (faces[i].annotations.leftEyeIris[0] !== null) && (faces[i].annotations.rightEyeIris[0] !== null))\n ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2]\n : 0; // note: average human iris size is 11.7mm\n\n // optionally return tensor\n const tensor = instance.config.face.detector?.return ? tf.squeeze(faces[i].tensor) : null;\n // dispose original face tensor\n tf.dispose(faces[i].tensor);\n // delete temp face image\n if (faces[i].tensor) delete faces[i].tensor;\n // combine results\n const res: FaceResult = {\n ...faces[i],\n id: i,\n };\n if ((descRes as DescRes)?.age) res.age = (descRes as DescRes).age as number;\n if ((descRes as DescRes)?.gender) res.gender = (descRes as DescRes).gender as Gender;\n if ((descRes as DescRes)?.genderScore) res.genderScore = (descRes as DescRes)?.genderScore as number;\n if ((descRes as DescRes)?.descriptor) res.embedding = (descRes as DescRes)?.descriptor as Array;\n if ((descRes as DescRes)?.race) res.race = (descRes as DescRes)?.race as { score: number, race: Race }[];\n if (emotionRes) res.emotion = emotionRes as Array<{ score: number, emotion: Emotion }>;\n if (antispoofRes) res.real = antispoofRes as number;\n if (livenessRes) res.live = livenessRes as number;\n if (irisSize && irisSize !== 0) res.iris = Math.trunc(500 / irisSize / 11.7) / 100;\n if (rotation) res.rotation = rotation;\n if (tensor) res.tensor = tensor;\n faceRes.push(res);\n instance.analyze('End Face');\n }\n instance.analyze('End FaceMesh:');\n if (instance.config.async) {\n if (instance.performance.face) delete instance.performance.face;\n if (instance.performance.age) delete instance.performance.age;\n if (instance.performance.gender) delete instance.performance.gender;\n if (instance.performance.emotion) delete instance.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * Gesture detection algorithm\n */\n\nimport type { GestureResult, BodyResult, FaceResult, HandResult, Point } from '../result';\nimport * as fingerPose from '../hand/fingerpose';\n\n/** face gesture type */\nexport type FaceGesture =\n `facing ${'left' | 'center' | 'right'}`\n | `blink ${'left' | 'right'} eye`\n | `mouth ${number}% open`\n | `head ${'up' | 'down'}`;\n\n/** iris gesture type */\nexport type IrisGesture =\n 'facing center'\n | `looking ${'left' | 'right' | 'up' | 'down'}`\n | 'looking center';\n\n/** body gesture type */\nexport type BodyGesture =\n `leaning ${'left' | 'right'}`\n | `raise ${'left' | 'right'} hand`\n | 'i give up';\n\n/** hand gesture type */\nexport type HandGesture =\n `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} forward`\n | `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} up`\n | 'victory'\n | 'thumbs up';\n\nexport const body = (res: BodyResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: BodyGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position[1] < nose.position[1]) && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise right hand' });\n\n // leaning\n const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n if (leftShoulder && rightShoulder && Math.abs(leftShoulder.positionRaw[1] - rightShoulder.positionRaw[1]) > 0.1) {\n gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position[1] > rightShoulder.position[1]) ? 'left' : 'right'}` });\n }\n }\n return gestures;\n};\n\nexport const face = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: FaceGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 450) {\n const zDiff = (res[i].mesh[33][2] || 0) - (res[i].mesh[263][2] || 0);\n const xDiff = res[i].mesh[33][0] - res[i].mesh[263][0];\n if (Math.abs(zDiff / xDiff) <= 0.15) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${zDiff < 0 ? 'left' : 'right'}` });\n const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n const chinDepth = res[i].mesh[152][2] || 0;\n if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n }\n }\n return gestures;\n};\n\nexport const iris = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: IrisGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.leftEyeIris[0] || !res[i].annotations.rightEyeIris || !res[i].annotations.rightEyeIris[0]) continue;\n const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n let center = false;\n const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n if (difference < 0.25) {\n center = true;\n gestures.push({ iris: i, gesture: 'facing center' });\n }\n\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > rightIrisCenterX) { // check eye with bigger offset\n if (leftIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking right' });\n } else {\n if (rightIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking left' });\n }\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3];\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) center = false;\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res: HandResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: HandGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: Point }> = [];\n if (res[i]['annotations']) {\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos) && pos[0]) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => ((best.position[2] || 0) < (a.position[2] || 0) ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward` as HandGesture });\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${highest.name} up` as HandGesture });\n }\n if (res[i]['keypoints']) {\n const poses = fingerPose.match(res[i]['keypoints']);\n for (const pose of poses) gestures.push({ hand: i, gesture: pose.name as HandGesture });\n }\n }\n return gestures;\n};\n", "/**\n * Results interpolation for smoothening of video detection results inbetween detected frames\n */\n\nimport type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult, Box, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { Config } from '../config';\n\nimport * as moveNetCoords from '../body/movenetcoords';\nimport * as blazePoseCoords from '../body/blazeposecoords';\nimport * as efficientPoseCoords from '../body/efficientposecoords';\nimport { now } from './util';\nimport { env } from './env';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null };\nlet interpolateTime = 0;\n\nexport function calc(newResult: Result, config: Config): Result {\n const t0 = now();\n if (!newResult) return { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null };\n // each record is only updated using deep clone when number of detected record changes, otherwise it will converge by itself\n // otherwise bufferedResult is a shallow clone of result plus updated local calculated values\n // thus mixing by-reference and by-value assignments to minimize memory operations\n\n const elapsed = Date.now() - newResult.timestamp;\n // curve fitted: buffer = 8 - ln(delay)\n // interpolation formula: current = ((buffer - 1) * previous + live) / buffer\n // - at 50ms delay buffer = ~4.1 => 28% towards live data\n // - at 250ms delay buffer = ~2.5 => 40% towards live data\n // - at 500ms delay buffer = ~1.8 => 55% towards live data\n // - at 750ms delay buffer = ~1.4 => 71% towards live data\n // - at 1sec delay buffer = 1 which means live data is used\n const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed + 1) : 1;\n\n if (newResult.canvas) bufferedResult.canvas = newResult.canvas;\n if (newResult.error) bufferedResult.error = newResult.error;\n\n // interpolate body results\n if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {\n bufferedResult.body = JSON.parse(JSON.stringify(newResult.body as BodyResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.body.length; i++) {\n const box = newResult.body[i].box // update box\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + newBoxCoord) / bufferedFactor) as Box;\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + newBoxCoord) / bufferedFactor) as Box;\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((newKpt, j) => ({\n score: newKpt.score,\n part: newKpt.part as BodyLandmark,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2],\n ],\n distance: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[0] || 0) + (newKpt.distance?.[0] || 0)) / bufferedFactor : newKpt.distance?.[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[1] || 0) + (newKpt.distance?.[1] || 0)) / bufferedFactor : newKpt.distance?.[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[2] || 0) + (newKpt.distance?.[2] || 0)) / bufferedFactor : newKpt.distance?.[2],\n ],\n }))) as Array<{ score: number, part: BodyLandmark, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n\n const annotations: Record = {} as Record; // recreate annotations\n let coords = { connected: {} };\n if (config.body?.modelPath?.includes('efficientpose')) coords = efficientPoseCoords;\n else if (config.body?.modelPath?.includes('blazepose')) coords = blazePoseCoords;\n else if (config.body?.modelPath?.includes('movenet')) coords = moveNetCoords;\n for (const [name, indexes] of Object.entries(coords.connected as Record)) {\n const pt: Array = [];\n for (let j = 0; j < indexes.length - 1; j++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[j]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[j + 1]);\n // if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints, annotations: annotations as BodyResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate hand results\n if (!bufferedResult.hand || (newResult.hand.length !== bufferedResult.hand.length)) {\n bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand as HandResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.hand.length; i++) {\n const box = (newResult.hand[i].box// update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; // reset keypoints as previous frame did not have them\n const keypoints = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) as Point)\n : [];\n let annotations = {};\n if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) {\n bufferedResult.hand[i].annotations = newResult.hand[i].annotations; // reset annotations as previous frame did not have them\n annotations = bufferedResult.hand[i].annotations;\n } else if (newResult.hand[i].annotations) {\n for (const key of Object.keys(newResult.hand[i].annotations)) { // update annotations\n annotations[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0]\n ? newResult.hand[i].annotations[key]\n .map((val, j: number) => val\n .map((coord: number, k: number) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor))\n : null;\n }\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations as HandResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate face results\n if (!bufferedResult.face || (newResult.face.length !== bufferedResult.face.length)) {\n bufferedResult.face = JSON.parse(JSON.stringify(newResult.face as FaceResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.face.length; i++) {\n const box = (newResult.face[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (newResult.face[i].rotation) {\n const rotation: {\n matrix: [number, number, number, number, number, number, number, number, number],\n angle: { roll: number, yaw: number, pitch: number },\n gaze: { bearing: number, strength: number }\n } = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } };\n rotation.matrix = newResult.face[i].rotation?.matrix as [number, number, number, number, number, number, number, number, number];\n rotation.angle = {\n roll: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.roll || 0) + (newResult.face[i].rotation?.angle?.roll || 0)) / bufferedFactor,\n yaw: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.yaw || 0) + (newResult.face[i].rotation?.angle?.yaw || 0)) / bufferedFactor,\n pitch: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.pitch || 0) + (newResult.face[i].rotation?.angle?.pitch || 0)) / bufferedFactor,\n };\n rotation.gaze = {\n // not fully correct due projection on circle, also causes wrap-around draw on jump from negative to positive\n bearing: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.bearing || 0) + (newResult.face[i].rotation?.gaze?.bearing || 0)) / bufferedFactor,\n strength: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.strength || 0) + (newResult.face[i].rotation?.gaze?.strength || 0)) / bufferedFactor,\n };\n bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; // shallow clone plus updated values\n }\n bufferedResult.face[i] = { ...newResult.face[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate object detection results\n if (!bufferedResult.object || (newResult.object.length !== bufferedResult.object.length)) {\n bufferedResult.object = JSON.parse(JSON.stringify(newResult.object as ObjectResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.object.length; i++) {\n const box = (newResult.object[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\n if (newResult.persons) {\n const newPersons = newResult.persons; // trigger getter function\n if (!bufferedResult.persons || (newPersons.length !== bufferedResult.persons.length)) {\n bufferedResult.persons = JSON.parse(JSON.stringify(newPersons as PersonResult[]));\n } else {\n for (let i = 0; i < newPersons.length; i++) { // update person box, we don't update the rest as it's updated as reference anyhow\n bufferedResult.persons[i].box = (newPersons[i].box\n .map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor)) as Box;\n }\n }\n }\n\n // just copy latest gestures without interpolation\n if (newResult.gesture) bufferedResult.gesture = newResult.gesture as GestureResult[];\n\n // append interpolation performance data\n const t1 = now();\n interpolateTime = env.perfadd ? interpolateTime + Math.round(t1 - t0) : Math.round(t1 - t0);\n if (newResult.performance) bufferedResult.performance = { ...newResult.performance, interpolate: interpolateTime };\n\n return bufferedResult;\n}\n", "/** Face descriptor type as number array */\nexport type Descriptor = Array\nexport type MatchOptions = { order?: number, threshold?: number, multiplier?: number, min?: number, max?: number } | undefined;\n\n/** Calculates distance between two descriptors\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n */\nexport function distance(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25 }) {\n // general minkowski distance, euclidean distance is limited case where order is 2\n if (!descriptor1 || !descriptor1) return Number.MAX_SAFE_INTEGER;\n let sum = 0;\n for (let i = 0; i < descriptor1.length; i++) {\n const diff = (!options.order || options.order === 2) ? (descriptor1[i] - descriptor2[i]) : (Math.abs(descriptor1[i] - descriptor2[i]));\n sum += (!options.order || options.order === 2) ? (diff * diff) : (diff ** options.order);\n }\n return (options.multiplier || 20) * sum;\n}\n\n// invert distance to similarity, normalize to given range and clamp\nconst normalizeDistance = (dist, order, min, max) => {\n if (dist === 0) return 1; // short circuit for identical inputs\n const root = order === 2 ? Math.sqrt(dist) : dist ** (1 / order); // take root of distance\n const norm = (1 - (root / 100) - min) / (max - min); // normalize to range\n const clamp = Math.max(Math.min(norm, 1), 0); // clamp to 0..1\n return clamp;\n};\n\n/** Calculates normalized similarity between two face descriptors based on their `distance`\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n * - min - normalize similarity result to a given range\n * - max - normalzie similarity resutl to a given range\n * default is 0.2...0.8\n * Returns similarity between two face descriptors normalized to 0..1 range where 0 is no similarity and 1 is perfect similarity\n */\nexport function similarity(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }) {\n const dist = distance(descriptor1, descriptor2, options);\n return normalizeDistance(dist, options.order || 2, options.min || 0, options.max || 1);\n}\n\n/** Matches given descriptor to a closest entry in array of descriptors\n * @param descriptor - face descriptor\n * @param descriptors - array of face descriptors to commpare given descriptor to\n * @param options - see `similarity` method for options description\n * Returns\n * - `index` index array index where best match was found or -1 if no matches\n * - `distance` calculated `distance` of given descriptor to the best match\n * - `similarity` calculated normalized `similarity` of given descriptor to the best match\n*/\nexport function match(descriptor: Descriptor, descriptors: Array, options: MatchOptions = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) {\n if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0) { // validate input\n return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 };\n }\n let lowestDistance = Number.MAX_SAFE_INTEGER;\n let index = -1;\n for (let i = 0; i < descriptors.length; i++) {\n const res = descriptors[i].length === descriptor.length ? distance(descriptor, descriptors[i], options) : Number.MAX_SAFE_INTEGER;\n if (res < lowestDistance) {\n lowestDistance = res;\n index = i;\n }\n if (lowestDistance < (options.threshold || 0)) break;\n }\n const normalizedSimilarity = normalizeDistance(lowestDistance, options.order || 2, options.min || 0, options.max || 1);\n return { index, distance: lowestDistance, similarity: normalizedSimilarity };\n}\n", "/**\n * Analyze detection Results and sort&combine them into per-person view\n */\n\nimport type { FaceResult, BodyResult, HandResult, GestureResult, PersonResult, Box } from '../result';\n\nexport function join(faces: Array, bodies: Array, hands: Array, gestures: Array, shape: Array | undefined): Array {\n let id = 0;\n const persons: Array = [];\n for (const face of faces) { // person is defined primarily by face and then we append other objects as found\n const person: PersonResult = { id: id++, face, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] };\n for (const body of bodies) {\n if (face.box[0] > body.box[0] // x within body\n && face.box[0] < body.box[0] + body.box[2]\n && face.box[1] + face.box[3] > body.box[1] // y within body\n && face.box[1] + face.box[3] < body.box[1] + body.box[3]) {\n person.body = body;\n }\n }\n if (person.body) { // only try to join hands if body is found\n for (const hand of hands) {\n if (hand.box[0] + hand.box[2] > person.body.box[0] // x within body for left hand\n && hand.box[0] + hand.box[2] < person.body.box[0] + person.body.box[2]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for left hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.left = hand;\n }\n if (hand.box[0] < person.body.box[0] + person.body.box[2] // x within body for right hand\n && hand.box[0] > person.body.box[0]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for right hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.right = hand;\n }\n }\n }\n for (const gesture of gestures) { // append all gestures according to ids\n if (gesture['face'] !== undefined && gesture['face'] === face.id) person.gestures?.push(gesture);\n else if (gesture['iris'] !== undefined && gesture['iris'] === face.id) person.gestures?.push(gesture);\n else if (gesture['body'] !== undefined && gesture['body'] === person.body?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.left?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.right?.id) person.gestures?.push(gesture);\n }\n\n // create new overarching box from all boxes belonging to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box: Box | undefined) => { // extract all [x, y] coordinates from boxes [x, y, width, height]\n if (box && box.length === 4) {\n x.push(box[0], box[0] + box[2]);\n y.push(box[1], box[1] + box[3]);\n }\n };\n extractXY(person.face?.box);\n extractXY(person.body?.box);\n extractXY(person.hands?.left?.box);\n extractXY(person.hands?.right?.box);\n const minX = Math.min(...x);\n const minY = Math.min(...y);\n person.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; // create new overarching box\n\n // shape is known so we calculate boxRaw as well\n if (shape && shape[1] && shape[2]) person.boxRaw = [person.box[0] / shape[2], person.box[1] / shape[1], person.box[2] / shape[2], person.box[3] / shape[1]];\n\n persons.push(person);\n }\n return persons;\n}\n", "/**\n * Embedded sample images used during warmup in dataURL format\n */\n\n// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\n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\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "/**\n * Warmup algorithm that uses embedded images to exercise loaded models for faster future inference\n */\n\nimport { log, now, mergeDeep } from './util/util';\nimport * as sample from './sample';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as image from './image/image';\nimport { env } from './util/env';\nimport type { Config } from './config';\nimport type { Result } from './result';\nimport type { Human, Models } from './human';\nimport type { Tensor } from './tfjs/types';\n\nasync function warmupBitmap(instance: Human): Promise {\n const b64toBlob = (base64: string, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (instance.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'body':\n case 'full': blob = await b64toBlob(sample.body); break;\n default: blob = null;\n }\n if (blob) {\n const bitmap = await createImageBitmap(blob);\n res = await instance.detect(bitmap, instance.config);\n bitmap.close();\n }\n return res;\n}\n\nasync function warmupCanvas(instance: Human): Promise {\n return new Promise((resolve) => {\n let src;\n // let size = 0;\n switch (instance.config.warmup) {\n case 'face':\n // size = 256;\n src = 'data:image/jpeg;base64,' + sample.face;\n break;\n case 'full':\n case 'body':\n // size = 1200;\n src = 'data:image/jpeg;base64,' + sample.body;\n break;\n default:\n src = null;\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n let img: HTMLImageElement;\n if (typeof Image !== 'undefined') img = new Image();\n // @ts-ignore env.image is an external monkey-patch\n else if (env.Image) img = new env.Image();\n else return;\n img.onload = async () => {\n const canvas = image.canvas(img.naturalWidth, img.naturalHeight);\n if (!canvas) {\n log('Warmup: Canvas not found');\n resolve(undefined);\n } else {\n const ctx = canvas.getContext('2d');\n if (ctx) ctx.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const tensor = await instance.image(canvas);\n const res = await instance.detect(tensor.tensor as Tensor, instance.config);\n resolve(res);\n }\n };\n if (src) img.src = src;\n else resolve(undefined);\n });\n}\n\nasync function warmupNode(instance: Human): Promise {\n const atob = (str: string) => Buffer.from(str, 'base64');\n let img;\n if (instance.config.warmup === 'face') img = atob(sample.face);\n else img = atob(sample.body);\n let res;\n if (('node' in tf) && (tf.getBackend() === 'tensorflow')) {\n // @ts-ignore tf.node may be undefined\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n instance.tf.dispose(data);\n // log('Input:', expanded);\n res = await instance.detect(expanded, instance.config);\n instance.tf.dispose(expanded);\n } else {\n if (instance.config.debug) log('Warmup tfjs-node not loaded');\n /*\n const input = await canvasJS.loadImage(img);\n const canvas = canvasJS.createCanvas(input.width, input.height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, input.width, input.height);\n res = await instance.detect(input, instance.config);\n */\n }\n return res;\n}\n\nasync function runInference(instance: Human) {\n let res: Result | undefined;\n if (typeof createImageBitmap === 'function') res = await warmupBitmap(instance);\n else if (typeof Image !== 'undefined' || env.Canvas !== undefined) res = await warmupCanvas(instance);\n else res = await warmupNode(instance);\n return res;\n}\n\n/** Runs pre-compile on all loaded models */\nexport async function runCompile(allModels: Models) {\n if (!tf.env().flagRegistry['ENGINE_COMPILE_ONLY']) return; // tfjs does not support compile-only inference\n const backendType = tf.getBackend();\n const webGLBackend = tf.backend();\n if ((backendType !== 'webgl' && backendType !== 'humangl') || (!webGLBackend || !webGLBackend.checkCompileCompletion)) {\n // log('compile pass: skip');\n return;\n }\n tf.env().set('ENGINE_COMPILE_ONLY', true);\n const numTensorsStart = tf.engine().state.numTensors;\n const compiledModels: string[] = [];\n for (const [modelName, model] of Object.entries(allModels).filter(([key, val]) => (key !== null && val !== null))) {\n const shape = (model.inputs && model.inputs[0] && model.inputs[0].shape) ? [...model.inputs[0].shape] : [1, 64, 64, 3];\n const dtype = (model.inputs && model.inputs[0] && model.inputs[0].dtype) ? model.inputs[0].dtype : 'float32';\n for (let dim = 0; dim < shape.length; dim++) {\n if (shape[dim] === -1) shape[dim] = dim === 0 ? 1 : 64; // override batch number and any dynamic dimensions\n }\n const tensor = tf.zeros(shape, dtype);\n try {\n const res = model.execute(tensor);\n compiledModels.push(modelName);\n if (Array.isArray(res)) res.forEach((t) => tf.dispose(t));\n else tf.dispose(res);\n } catch {\n log('compile fail model:', modelName);\n }\n tf.dispose(tensor);\n }\n const kernels = await webGLBackend.checkCompileCompletionAsync();\n webGLBackend.getUniformLocations();\n log('compile pass models:', compiledModels);\n log('compile pass kernels:', kernels.length);\n tf.env().set('ENGINE_COMPILE_ONLY', false);\n const numTensorsEnd = tf.engine().state.numTensors;\n if ((numTensorsEnd - numTensorsStart) > 0) log('tensor leak:', numTensorsEnd - numTensorsStart);\n}\n\n/** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used in browser environments for `webgl` and `humangl` backends\n * @param userConfig?: Config\n*/\nexport async function warmup(instance: Human, userConfig?: Partial): Promise {\n const t0 = now();\n instance.state = 'warmup';\n if (userConfig) instance.config = mergeDeep(instance.config, userConfig) as Config;\n if (!instance.config.warmup || instance.config.warmup.length === 0 || instance.config.warmup === 'none') {\n return { face: [], body: [], hand: [], gesture: [], object: [], performance: instance.performance, timestamp: now(), persons: [], error: null };\n }\n return new Promise(async (resolve) => {\n await runCompile(instance.models);\n const res = await runInference(instance);\n const t1 = now();\n if (instance.config.debug) log('warmup', instance.config.warmup, Math.round(t1 - t0), 'ms');\n instance.emit('warmup');\n resolve(res);\n });\n}\n", "/**\n * Human main module\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\n// module imports\nimport { log, now, mergeDeep, validate } from './util/util';\nimport { defaults } from './config';\nimport { env, Env } from './util/env';\nimport { setModelLoadOptions } from './tfjs/load';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as app from '../package.json';\nimport * as backend from './tfjs/backend';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as draw from './draw/draw';\nimport * as efficientpose from './body/efficientpose';\nimport * as face from './face/face';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as gesture from './gesture/gesture';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as humangl from './tfjs/humangl';\nimport * as image from './image/image';\nimport * as interpolate from './util/interpolate';\nimport * as match from './face/match';\nimport * as models from './models';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as persons from './util/persons';\nimport * as posenet from './body/posenet';\nimport * as segmentation from './segmentation/segmentation';\nimport * as warmups from './warmup';\n// type definitions\nimport type { Input, Tensor, DrawOptions, Config, Result, FaceResult, HandResult, BodyResult, ObjectResult, GestureResult, PersonResult, AnyCanvas, ModelStats } from './exports';\n// type exports\nexport * from './exports';\n\n/** **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n *\n * @param userConfig - {@link Config}\n * @returns instance of {@link Human}\n */\nexport class Human {\n /** Current version of Human library in *semver* format */\n version: string;\n\n /** Current configuration\n * - Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\n config: Config;\n\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\n\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n * - Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle'\n */\n state: string;\n\n /** currenty processed image tensor and canvas */\n process: { tensor: Tensor | null, canvas: AnyCanvas | null };\n\n /** Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n * [TFJS API](https://js.tensorflow.org/api/latest/)\n */\n tf;\n\n /** Object containing environment information used for diagnostics */\n env: Env;\n\n /** Draw helper classes that can draw detected objects on canvas using specified draw\n * - canvas: draws input to canvas\n * - options: are global settings for all draw operations, can be overriden for each draw method {@link DrawOptions}\n * - face, body, hand, gesture, object, person: draws detected results as overlays on canvas\n */\n draw: { canvas: typeof draw.canvas, face: typeof draw.face, body: typeof draw.body, hand: typeof draw.hand, gesture: typeof draw.gesture, object: typeof draw.object, person: typeof draw.person, all: typeof draw.all, options: DrawOptions };\n\n /** Currently loaded models\n * @internal\n * {@link Models}\n */\n models: models.Models;\n\n /** Container for events dispatched by Human\n * Possible events:\n * - `create`: triggered when Human object is instantiated\n * - `load`: triggered when models are loaded (explicitly or on-demand)\n * - `image`: triggered when input image is processed\n * - `result`: triggered when detection is complete\n * - `warmup`: triggered when warmup is complete\n * - `error`: triggered on some errors\n */\n events: EventTarget | undefined;\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: number[];\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: [number, number][];\n /** Performance object that contains values for all recently performed operations */\n performance: Record; // perf members are dynamically defined as needed\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n /** WebGL debug info */\n gl: Record;\n // definition end\n\n /** Constructor for **Human** library that is futher used for all operations\n * @param userConfig - user configuration object {@link Config}\n */\n constructor(userConfig?: Partial) {\n this.env = env;\n /*\n defaults.wasmPath = tf.version['tfjs-core'].includes('-') // custom build or official build\n ? 'https://vladmandic.github.io/tfjs/dist/'\n : `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tf.version_core}/dist/`;\n */\n const tfVersion = (tf.version?.tfjs || tf.version_core).replace(/-(.*)/, '');\n defaults.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tfVersion}/dist/`;\n defaults.modelBasePath = env.browser ? '../models/' : 'file://models/';\n defaults.backend = env.browser ? 'humangl' : 'tensorflow';\n this.version = app.version; // expose version property on instance of class\n Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself\n this.config = JSON.parse(JSON.stringify(defaults));\n Object.seal(this.config);\n this.config.cacheModels = typeof indexedDB !== 'undefined';\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n setModelLoadOptions(this.config);\n this.tf = tf;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.performance = {};\n this.events = (typeof EventTarget !== 'undefined') ? new EventTarget() : undefined;\n // object that contains all initialized models\n this.models = new models.Models();\n // reexport draw methods\n this.draw = {\n options: draw.options as DrawOptions,\n canvas: (input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) => draw.canvas(input, output),\n face: (output: AnyCanvas, result: FaceResult[], options?: Partial) => draw.face(output, result, options),\n body: (output: AnyCanvas, result: BodyResult[], options?: Partial) => draw.body(output, result, options),\n hand: (output: AnyCanvas, result: HandResult[], options?: Partial) => draw.hand(output, result, options),\n gesture: (output: AnyCanvas, result: GestureResult[], options?: Partial) => draw.gesture(output, result, options),\n object: (output: AnyCanvas, result: ObjectResult[], options?: Partial) => draw.object(output, result, options),\n person: (output: AnyCanvas, result: PersonResult[], options?: Partial) => draw.person(output, result, options),\n all: (output: AnyCanvas, result: Result, options?: Partial) => draw.all(output, result, options),\n };\n this.result = { face: [], body: [], hand: [], gesture: [], object: [], performance: {}, timestamp: 0, persons: [], error: null };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.process = { tensor: null, canvas: null };\n // export raw access to underlying models\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // set gl info\n this.gl = humangl.config;\n // init model validation\n models.validateModel(this, null, '');\n // include platform info\n this.emit('create');\n }\n\n /** internal function to measure tensor leaks */\n analyze = (...msg: string[]) => {\n if (!this.#analyzeMemoryLeaks) return;\n const currentTensors = this.tf.engine().state.numTensors;\n const previousTensors = this.#numTensors;\n this.#numTensors = currentTensors;\n const leaked = currentTensors - previousTensors;\n if (leaked !== 0) log(...msg, leaked);\n };\n\n /** internal function for quick sanity check on inputs @hidden */\n #sanity = (input: Input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.env.node && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n try {\n this.tf.getBackend();\n } catch {\n return 'backend not loaded';\n }\n return null;\n };\n\n /** Reset configuration to default values */\n reset(): void {\n const currentBackend = this.config.backend; // save backend;\n this.config = JSON.parse(JSON.stringify(defaults));\n this.config.backend = currentBackend;\n }\n\n /** Validate current configuration schema */\n validate(userConfig?: Partial) {\n return validate(defaults, userConfig || this.config);\n }\n\n /** Check model for invalid kernel ops for current backend */\n check() {\n return models.validate(this);\n }\n\n /** Exports face matching methods {@link match#similarity} */\n public similarity = match.similarity;\n /** Exports face matching methods {@link match#distance} */\n public distance = match.distance;\n /** Exports face matching methods {@link match#match} */\n public match = match.match;\n\n /** Utility wrapper for performance.now() */\n now(): number {\n return now();\n }\n\n /** Process input as return canvas and tensor\n *\n * @param input - any input {@link Input}\n * @param getTensor - should image processing also return tensor or just canvas\n * Returns object with `tensor` and `canvas`\n */\n image(input: Input, getTensor: boolean = true) {\n return image.process(input, this.config, getTensor);\n }\n\n /** Segmentation method takes any input and returns processed canvas with body segmentation\n * - Segmentation is not triggered as part of detect process\n * @param input - {@link Input}\n * @param background - {@link Input}\n * - Optional parameter background is used to fill the background with specific input\n * Returns:\n * - `data` as raw data array with per-pixel segmentation values\n * - `canvas` as canvas which is input image filtered with segementation data and optionally merged with background image. canvas alpha values are set to segmentation values for easy merging\n * - `alpha` as grayscale canvas that represents segmentation alpha values\n */\n async segmentation(input: Input, background?: Input): Promise<{ data: number[] | Tensor, canvas: AnyCanvas | null, alpha: AnyCanvas | null }> {\n return segmentation.process(input, background, this.config);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\n *\n * @param input - Tensor as provided in human.result.face[n].tensor\n * @returns Tensor\n */\n // eslint-disable-next-line class-methods-use-this\n enhance(input: Tensor): Tensor | null {\n return faceres.enhance(input);\n }\n\n /** Compare two input tensors for pixel simmilarity\n * - use `human.image` to process any valid input and get a tensor that can be used for compare\n * - when passing manually generated tensors:\n * - both input tensors must be in format [1, height, width, 3]\n * - if resolution of tensors does not match, second tensor will be resized to match resolution of the first tensor\n * - return value is pixel similarity score normalized by input resolution and rgb channels\n */\n compare(firstImageTensor: Tensor, secondImageTensor: Tensor): Promise {\n return image.compare(this.config, firstImageTensor, secondImageTensor);\n }\n\n /** Explicit backend initialization\n * - Normally done implicitly during initial load phase\n * - Call to explictly register and initialize TFJS backend without any other operations\n * - Use when changing backend during runtime\n */\n async init(): Promise {\n await backend.check(this, true);\n await this.tf.ready();\n }\n\n /** Load method preloads all configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n *\n * @param userConfig - {@link Config}\n */\n async load(userConfig?: Partial): Promise {\n this.state = 'load';\n const timeStamp = now();\n const count = Object.values(this.models).filter((model) => model).length;\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.env.initial) { // print version info on first run and check for correct backend setup\n if (this.config.debug) log(`version: ${this.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version['tfjs-core']}`);\n if (!await backend.check(this)) log('error: backend check failed');\n await tf.ready();\n if (this.env.browser) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('environment:', this.env);\n if (this.config.debug) log('tf flags:', this.tf.ENV['flags']);\n }\n }\n\n await models.load(this); // actually loads models\n if (this.env.initial && this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors'); // print memory stats on first run\n this.env.initial = false;\n\n const loaded = Object.values(this.models).filter((model) => model).length;\n if (loaded !== count) { // number of loaded models changed\n await models.validate(this); // validate kernel ops used by model against current backend\n this.emit('load');\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.loadModels as number || 0)) this.performance.loadModels = this.env.perfadd ? (this.performance.loadModels || 0) + current : current;\n }\n\n /** emit event */\n emit = (event: string) => {\n if (this.events && this.events.dispatchEvent) this.events?.dispatchEvent(new Event(event));\n };\n\n /** Runs interpolation using last known result and returns smoothened result\n * Interpolation is based on time since last known result so can be called independently\n *\n * @param result - {@link Result} optional use specific result set to run interpolation on\n * @returns result - {@link Result}\n */\n next(result: Result = this.result): Result {\n return interpolate.calc(result, this.config) as Result;\n }\n\n /** get model loading/loaded stats */\n getModelStats(): ModelStats { return models.getModelStats(this); }\n\n /** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async warmup(userConfig?: Partial) {\n const t0 = now();\n const res = await warmups.warmup(this, userConfig);\n const t1 = now();\n this.performance.warmup = Math.trunc(t1 - t0);\n return res;\n }\n\n /** Run detect with tensorflow profiling\n * - result object will contain total exeuction time information for top-20 kernels\n * - actual detection object can be accessed via `human.result`\n */\n async profile(input: Input, userConfig?: Partial): Promise> {\n const profile = await this.tf.profile(() => this.detect(input, userConfig));\n const kernels: Record = {};\n let total = 0;\n for (const kernel of profile.kernels) { // sum kernel time values per kernel\n if (kernels[kernel.name]) kernels[kernel.name] += kernel.kernelTimeMs;\n else kernels[kernel.name] = kernel.kernelTimeMs;\n total += kernel.kernelTimeMs;\n }\n const kernelArr: Array<{ kernel: string, time: number, perc: number }> = [];\n Object.entries(kernels).forEach((key) => kernelArr.push({ kernel: key[0], time: key[1] as unknown as number, perc: 0 })); // convert to array\n for (const kernel of kernelArr) {\n kernel.perc = Math.round(1000 * kernel.time / total) / 1000;\n kernel.time = Math.round(1000 * kernel.time) / 1000;\n }\n kernelArr.sort((a, b) => b.time - a.time); // sort\n kernelArr.length = 20; // crop\n return kernelArr;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n *\n * @param input - {@link Input}\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async detect(input: Input, userConfig?: Partial): Promise {\n // detection happens inside a promise\n this.state = 'detect';\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n this.emit('error');\n resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error });\n }\n\n const timeStart = now();\n\n // configure backend if needed\n await backend.check(this);\n\n // load models if enabled\n await this.load();\n\n timeStamp = now();\n this.state = 'image';\n const img = await image.process(input, this.config) as { canvas: AnyCanvas, tensor: Tensor };\n this.process = img;\n this.performance.inputProcess = this.env.perfadd ? (this.performance.inputProcess || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n if (!img.tensor) {\n if (this.config.debug) log('could not convert input to tensor');\n this.emit('error');\n resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error: 'could not convert input to tensor' });\n return;\n }\n this.emit('image');\n\n timeStamp = now();\n this.config.skipAllowed = await image.skip(this.config, img.tensor);\n if (!this.performance.totalFrames) this.performance.totalFrames = 0;\n if (!this.performance.cachedFrames) this.performance.cachedFrames = 0;\n (this.performance.totalFrames as number)++;\n if (this.config.skipAllowed) this.performance.cachedFrames++;\n this.performance.cacheCheck = this.env.perfadd ? (this.performance.cacheCheck || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n // keep them with weak typing as it can be promise or not\n let faceRes: FaceResult[] | Promise | never[] = [];\n let bodyRes: BodyResult[] | Promise | never[] = [];\n let handRes: HandResult[] | Promise | never[] = [];\n let objectRes: ObjectResult[] | Promise | never[] = [];\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n this.state = 'detect:face';\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, img.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, img.tensor) : [];\n this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n\n if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1)) faceRes = await faceRes; // need face result for auto-detect number of hands or bodies\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n this.state = 'detect:body';\n const bodyConfig = this.config.body.maxDetected === -1 ? mergeDeep(this.config, { body: { maxDetected: this.config.face.enabled ? 1 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of bodies\n if (this.config.async) {\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(img.tensor, bodyConfig) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n timeStamp = now();\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(img.tensor, bodyConfig) : [];\n this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n this.state = 'detect:hand';\n const handConfig = this.config.hand.maxDetected === -1 ? mergeDeep(this.config, { hand: { maxDetected: this.config.face.enabled ? 2 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of hands\n if (this.config.async) {\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? handtrack.predict(img.tensor, handConfig) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n timeStamp = now();\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? await handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? await handtrack.predict(img.tensor, handConfig) : [];\n this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Hand:');\n\n // run object detection\n this.analyze('Start Object:');\n this.state = 'detect:object';\n if (this.config.async) {\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(img.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n timeStamp = now();\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(img.tensor, this.config) : [];\n this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Object:');\n\n // if async wait for results\n this.state = 'detect:await';\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n this.state = 'detect:gesture';\n let gestureRes: GestureResult[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes as FaceResult[]), ...gesture.body(bodyRes as BodyResult[]), ...gesture.hand(handRes as HandResult[]), ...gesture.iris(faceRes as FaceResult[])];\n if (!this.config.async) this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = this.env.perfadd ? (this.performance.total || 0) + Math.trunc(now() - timeStart) : Math.trunc(now() - timeStart);\n const shape = this.process?.tensor?.shape || [];\n this.result = {\n face: faceRes as FaceResult[],\n body: bodyRes as BodyResult[],\n hand: handRes as HandResult[],\n gesture: gestureRes,\n object: objectRes as ObjectResult[],\n performance: this.performance,\n canvas: this.process.canvas,\n timestamp: Date.now(),\n error: null,\n get persons() { return persons.join(faceRes as FaceResult[], bodyRes as BodyResult[], handRes as HandResult[], gestureRes, shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(img.tensor);\n\n // log('Result:', result);\n this.emit('detect');\n this.state = 'idle';\n resolve(this.result);\n });\n }\n}\n\n/** Class Human as default export */\n/* eslint no-restricted-exports: [\"off\", { \"restrictedNamedExports\": [\"default\"] }] */\nexport { Human as default, match, draw, models };\n"], - "mappings": "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C,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,gBAAgB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,gBAAgB;AAAA,EAClC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,gBAAgB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,gBAAgB,iBAAiB;AAAA,EAClC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,kBAAkB,iBAAiB;AAAA,EACpC,CAAC,iBAAiB,iBAAiB;AAAA,EACnC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,mBAAmB,iBAAiB;AACvC;AAEO,IAAM,SAAwB;AAAA,EACnC;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;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,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,UAAU,GAAG,SAAS;AAAA,EAC3B,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,EACzB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EACvB,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Jb,IAAMC,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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", - "names": ["config", "dist_star", "match", "index", "size", "image", "squeeze", "min", "max", "sub", "rgb", "reshape", "process", "config", "tensor", "rgb", "cast", "models_exports", "load", "validate", "last", "config", "image", "count", "_a", "_b", "gender", "age", "tensor", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "predict", "image", "count", "tensor", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "predict", "image", "count", "tensor", "model", "skipped", "lastCount", "lastTime", "load", "config", "predict", "image", "count", "image", "size", "size", "inputSize", "anchors", "face", "model", "load", "config", "tensor", "inputSize", "anchors", "outputSize", "min", "max", "env", "inputSize", "skipped", "lastTime", "sigmoid", "config", "size", "tensor", "outputSize", "kpt", "config", "sigmoid", "inputSize", "distance", "annotations", "body", "predict", "lastTime", "skipped", "model", "inputSize", "last", "lastTime", "skipped", "load", "config", "process", "tensor", "predict", "outputSize", "connected", "kpt", "model", "lastTime", "cache", "skipped", "load", "config", "max", "mod", "div", "predict", "image", "tensor", "enhance", "squeeze", "stack", "x", "y", "kpt", "connected", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "predict", "image", "count", "_a", "_b", "inputSize", "tensor", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "predict", "count", "_a", "tensor", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "predict", "count", "_a", "tensor", "model", "inputSize", "load", "config", "index", "face", "connectionsToIndices", "index", "cache", "model", "inputSize", "predict", "config", "face", "index", "load", "model", "last", "lastTime", "lastCount", "skipped", "load", "config", "tensor", "predict", "image", "count", "_a", "_b", "gender", "age", "all", "getBoxSize", "getBoxCenter", "image", "scaleBoxCoordinates", "enlargeBox", "size", "squarifyBox", "normalizeRadians", "computeRotation", "buildTranslationMatrix", "dot", "getColumnFrom2DArr", "multiplyTransformMatrices", "size", "buildRotationMatrix", "invertTransformMatrix", "rotatePoint", "anchors", "model", "anchors", "tensor", "index", "config", "hand", "scaleBoxCoordinates", "lastTime", "handPoseModel", "rotatePoint", "enlargeBox", "squarifyBox", "getBoxSize", "buildRotationMatrix", "invertTransformMatrix", "getBoxCenter", "dot", "image", "config", "computeRotation", "point", "point2", "gesture", "meshAnnotations", "predict", "config", "annotations", "index", "load", "config", "instance", "instance", "config", "models", "inputSize", "skipped", "lastTime", "cache", "loadDetect", "config", "config", "models", "hand", "tensor", "inputSize", "kpt", "index", "predict", "skipped", "lastTime", "cache", "model", "cached", "skipped", "lastCount", "lastTime", "load", "config", "predict", "image", "count", "connected", "kpt", "cache", "body", "compare", "inputSize", "tensor", "outputSize", "kpt", "model", "inputSize", "skipped", "cache", "load", "config", "image", "kpt", "annotations", "connected", "body", "predict", "tensor", "model", "last", "lastTime", "skipped", "inputSize", "load", "config", "process", "predict", "image", "outputSize", "maxSize", "max", "outputStride", "min", "max", "model", "point", "height", "width", "minConfidence", "predict", "config", "tensor", "load", "model", "load", "config", "process", "tensor", "instance", "model", "load", "loadDetect", "validate", "options", "init", "config", "model", "canvas", "options", "opt", "rgb", "options", "labels", "emotion", "index", "inCanvas", "options", "inCanvas", "options", "connected", "inCanvas", "options", "inCanvas", "options", "inCanvas", "options", "inCanvas", "options", "canvas", "face", "face", "size", "instance", "predict", "tensor", "body", "face", "iris", "hand", "calc", "config", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "annotations", "match", "options", "sum", "min", "max", "clamp", "index", "join", "face", "person", "body", "hand", "gesture", "face", "body", "instance", "res", "face", "body", "canvas", "tensor", "model", "match", "version", "options", "canvas", "config", "validate", "process", "count", "model", "load", "calc", "predict", "face", "body", "hand", "iris", "join"] + "sourcesContent": ["import type { Config } from '../exports';\n\n/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`modelpath error: expecting json file: ${path}`);\n return path;\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: checks current config validity\nexport function validate(defaults: Partial, config: Partial, parent = 'config', msgs: Array<{ reason: string, where: string, expected?: string }> = []) {\n for (const key of Object.keys(config)) {\n if (typeof config[key] === 'object') {\n validate(defaults[key], config[key], key, msgs);\n } else {\n const defined = defaults && (typeof defaults[key] !== 'undefined');\n if (!defined) msgs.push({ reason: 'unknown property', where: `${parent}.${key} = ${config[key]}` });\n const same = defaults && typeof defaults[key] === typeof config[key];\n if (defined && !same) msgs.push({ reason: 'property type mismatch', where: `${parent}.${key} = ${config[key]}`, expected: typeof defaults[key] });\n }\n // ok = ok && defined && same;\n }\n if (config.debug && parent === 'config' && msgs.length > 0) log('invalid configuration', msgs);\n return msgs;\n}\n\n// helper function: perform deep merge of multiple objects so it allows full inheritance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: Array) => data.reduce((acc: Array, val) => {\n acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n return acc;\n}, []);\n\n// helper function: async wait\nexport async function wait(time: number) {\n const waiting = new Promise((resolve) => { setTimeout(() => resolve(true), time); });\n await waiting;\n}\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/** Generic config type inherited by all module types */\nexport interface GenericConfig {\n /** is module enabled? */\n enabled: boolean,\n /** path to model json file (relative to `modelBasePath` */\n modelPath: string,\n /** how many max frames to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipFrames: number,\n /** how many max milliseconds to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipTime: number,\n}\n\n/** Detector part of face configuration */\nexport interface FaceDetectorConfig extends GenericConfig {\n /** is face rotation correction performed after detecting face?\n * used to correctly analyze faces under high angles\n */\n rotation: boolean,\n /** maximum number of detected faces */\n maxDetected: number,\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected faces before one is discarded */\n iouThreshold: number,\n /** should child models perform on masked image of a face */\n mask: boolean,\n /** should face detection return processed and cropped face tensor that can with an external model for addtional processing?\n * if enabled it must be manually deallocated to avoid memory leak */\n return: boolean,\n}\n\n/** Mesh part of face configuration */\nexport interface FaceMeshConfig extends GenericConfig {\n /** Keep detected faces that cannot be verified using facemesh */\n keepInvalid: boolean\n}\n\n/** Iris part of face configuration */\nexport interface FaceIrisConfig extends GenericConfig {}\n\n/** Attention part of face configuration */\nexport interface FaceAttentionConfig extends GenericConfig {}\n\n/** Description or face embedding part of face configuration\n * - also used by age and gender detection\n */\nexport interface FaceDescriptionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Emotion part of face configuration */\nexport interface FaceEmotionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Anti-spoofing part of face configuration */\nexport interface FaceAntiSpoofConfig extends GenericConfig {}\n\n/** Liveness part of face configuration */\nexport interface FaceLivenessConfig extends GenericConfig {}\n\n/** Gear part of face configuration */\nexport interface FaceGearConfig extends GenericConfig {\n /** minimum confidence for a detected race before results are discarded */\n minConfidence: number,\n}\n\n/** Configures all face-specific options: face detection, mesh analysis, age, gender, emotion detection and face description */\nexport interface FaceConfig extends GenericConfig {\n detector: Partial,\n mesh: Partial,\n attention: Partial,\n iris: Partial,\n description: Partial,\n emotion: Partial,\n antispoof: Partial,\n liveness: Partial,\n gear: Partial,\n}\n\n/** Configures all body detection specific options */\nexport interface BodyConfig extends GenericConfig {\n /** maximum number of detected bodies */\n maxDetected: number,\n /** minimum confidence for a detected body before results are discarded */\n minConfidence: number,\n /* experimental\n /** experimental: detector used for body model before actual analysis\n detector?: {\n /** experimental: enable body detector before body landmarks\n enabled: boolean,\n /** experimental: path to optional body detector model json file\n modelPath: string,\n /** experimental: minimum confidence for a detected body before results are discarded\n minConfidence: number,\n /** experimental: minimum overlap between two detected bodies before one is discarded\n iouThreshold: number\n },\n */\n}\n\n/** Configures all hand detection specific options */\nexport interface HandConfig extends GenericConfig {\n /** should hand rotation correction be performed after hand detection? */\n rotation: boolean,\n /** minimum confidence for a detected hand before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected hands before one is discarded */\n iouThreshold: number,\n /** maximum number of detected hands */\n maxDetected: number,\n /** should hand landmarks be detected or just return detected hand box */\n landmarks: boolean,\n detector: {\n /** path to hand detector model json */\n modelPath?: string,\n },\n skeleton: {\n /** path to hand skeleton model json */\n modelPath?: string,\n },\n}\n\n/** Configures all object detection specific options */\nexport interface ObjectConfig extends GenericConfig {\n /** minimum confidence for a detected objects before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected objects before one is discarded */\n iouThreshold: number,\n /** maximum number of detected objects */\n maxDetected: number,\n}\n\n/** Configures all body segmentation module\n * removes background from input containing person\n * if segmentation is enabled it will run as preprocessing task before any other model\n * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n * remove background or replace it with user-provided background\n*/\nexport interface SegmentationConfig extends GenericConfig {\n /** blur segmentation output by pixels for more realistic image */\n blur: number,\n}\n\n/** Run input through image filters before inference\n * - available only in Browser environments\n * - image filters run with near-zero latency as they are executed on the GPU using WebGL\n*/\nexport interface FilterConfig {\n /** are image filters enabled? */\n enabled: boolean,\n /** perform image histogram equalization\n * - equalization is performed on input as a whole and detected face before its passed for further analysis\n */\n equalization: boolean,\n /** resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** return processed canvas imagedata in result */\n return: boolean,\n /** flip input as mirror image */\n flip: boolean,\n /** range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** image negative */\n negative: boolean,\n /** image sepia colors */\n sepia: boolean,\n /** image vintage colors */\n vintage: boolean,\n /** image kodachrome colors */\n kodachrome: boolean,\n /** image technicolor colors */\n technicolor: boolean,\n /** image polaroid camera effect */\n polaroid: boolean,\n /** range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n}\n\n/** Controlls gesture detection */\nexport interface GestureConfig {\n /** is gesture detection enabled? */\n enabled: boolean,\n}\n/** Possible TensorFlow backends */\nexport type BackendType = ['cpu', 'wasm', 'webgl', 'humangl', 'tensorflow', 'webgpu'];\n\n/** Possible values for `human.warmup` */\nexport type WarmupType = ['' | 'none' | 'face' | 'full' | 'body'];\n\n/**\n * Configuration interface definition for **Human** library\n * Contains all configurable parameters\n * Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\nexport interface Config {\n /** Backend used for TFJS operations\n * valid build-in backends are:\n * - Browser: `cpu`, `wasm`, `webgl`, `humangl`, `webgpu`\n * - NodeJS: `cpu`, `wasm`, `tensorflow`\n * default: `humangl` for browser and `tensorflow` for nodejs\n */\n backend: '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu',\n\n /** Path to *.wasm files if backend is set to `wasm`\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPath: string,\n\n /** Force WASM loader to use platform fetch\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPlatformFetch: boolean,\n\n /** Print debug statements to console\n *\n * default: `true`\n */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially\n *\n * default: `true`\n */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - used by `webgl`, `humangl` and `webgpu` backends\n *\n * default: `full`\n */\n warmup: '' | 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n *\n * default: `../models/` for browsers and `file://models/` for nodejs\n */\n modelBasePath: string,\n\n /** Cache models in IndexDB on first sucessfull load\n * default: true if indexdb is available (browsers), false if its not (nodejs)\n */\n cacheModels: boolean,\n\n /** Validate kernel ops used in model during model load\n * default: true\n * any errors will be printed on console but will be treated as non-fatal\n */\n validateModels: boolean,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n *\n * default: 0.7\n */\n cacheSensitivity: number;\n\n /** Perform immediate garbage collection on deallocated tensors instead of caching them */\n deallocate: boolean;\n\n /** Internal Variable */\n skipAllowed: boolean;\n\n /** Filter config {@link FilterConfig} */\n filter: Partial,\n\n /** Gesture config {@link GestureConfig} */\n gesture: Partial;\n\n /** Face config {@link FaceConfig} */\n face: Partial,\n\n /** Body config {@link BodyConfig} */\n body: Partial,\n\n /** Hand config {@link HandConfig} */\n hand: Partial,\n\n /** Object config {@link ObjectConfig} */\n object: Partial,\n\n /** Segmentation config {@link SegmentationConfig} */\n segmentation: Partial,\n}\n\n/** - [See all default Config values...](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) */\nconst config: Config = {\n backend: '',\n modelBasePath: '',\n cacheModels: true,\n validateModels: true,\n wasmPath: '',\n wasmPlatformFetch: false,\n debug: false,\n async: true,\n warmup: 'full',\n cacheSensitivity: 0.70,\n skipAllowed: false,\n deallocate: false,\n filter: {\n enabled: true,\n equalization: false,\n width: 0,\n height: 0,\n flip: false,\n return: true,\n brightness: 0,\n contrast: 0,\n sharpness: 0,\n blur: 0,\n saturation: 0,\n hue: 0,\n negative: false,\n sepia: false,\n vintage: false,\n kodachrome: false,\n technicolor: false,\n polaroid: false,\n pixelate: 0,\n },\n gesture: {\n enabled: true,\n },\n face: {\n enabled: true,\n detector: {\n modelPath: 'blazeface.json',\n rotation: true,\n maxDetected: 1,\n skipFrames: 99,\n skipTime: 2500,\n minConfidence: 0.2,\n iouThreshold: 0.1,\n mask: false,\n return: false,\n },\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json',\n keepInvalid: false,\n },\n attention: {\n enabled: false,\n modelPath: 'facemesh-attention.json',\n },\n iris: {\n enabled: true,\n modelPath: 'iris.json',\n },\n emotion: {\n enabled: true,\n minConfidence: 0.1,\n skipFrames: 99,\n skipTime: 1500,\n modelPath: 'emotion.json',\n },\n description: {\n enabled: true,\n modelPath: 'faceres.json',\n skipFrames: 99,\n skipTime: 3000,\n minConfidence: 0.1,\n },\n antispoof: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'antispoof.json',\n },\n liveness: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'liveness.json',\n },\n },\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json',\n maxDetected: -1,\n minConfidence: 0.3,\n skipFrames: 1,\n skipTime: 200,\n },\n hand: {\n enabled: true,\n rotation: true,\n skipFrames: 99,\n skipTime: 1000,\n minConfidence: 0.50,\n iouThreshold: 0.2,\n maxDetected: -1,\n landmarks: true,\n detector: {\n modelPath: 'handtrack.json',\n },\n skeleton: {\n modelPath: 'handlandmark-full.json',\n },\n },\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json',\n minConfidence: 0.2,\n iouThreshold: 0.4,\n maxDetected: 10,\n skipFrames: 99,\n skipTime: 2000,\n },\n segmentation: {\n enabled: false,\n modelPath: 'selfie.json',\n blur: 8,\n },\n};\n\nexport { config as defaults };\n", "/*\n Human\n homepage: \n author: '\n*/\n\nexport*from\"@tensorflow/tfjs/dist/index.js\";export*from\"@tensorflow/tfjs-backend-webgl/dist/index.js\";var r=\"3.19.0\",e=\"3.19.0\",o=\"3.19.0\",a=\"3.19.0\",t=\"3.19.0\",s=\"3.19.0\",f=\"3.19.0\",v={tfjs:r,\"tfjs-core\":e,\"tfjs-data\":o,\"tfjs-layers\":a,\"tfjs-converter\":t,\"tfjs-backend-webgl\":s,\"tfjs-backend-wasm\":f};import{Tensor as d}from\"@tensorflow/tfjs/dist/index.js\";import{GraphModel as b}from\"@tensorflow/tfjs-converter/dist/index\";export{b as GraphModel,d as Tensor,v as version};\n", "export const vertexIdentity = `\n precision highp float;\n attribute vec2 pos;\n attribute vec2 uv;\n varying vec2 vUv;\n uniform float flipY;\n void main(void) {\n vUv = uv;\n gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);\n }\n`;\n\nexport const fragmentIdentity = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n void main(void) {\n gl_FragColor = texture2D(texture, vUv);\n }\n`;\n\nexport const colorMatrixWithAlpha = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform float m[20];\n void main(void) {\n vec4 c = texture2D(texture, vUv);\n gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];\n gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];\n gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];\n gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];\n }\n`;\n\nexport const colorMatrixWithoutAlpha = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform float m[20];\n void main(void) {\n vec4 c = texture2D(texture, vUv);\n gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];\n gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];\n gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];\n gl_FragColor.a = c.a;\n }\n`;\n\nexport const pixelate = `\n precision highp float;\n varying vec2 vUv;\n uniform vec2 size;\n uniform sampler2D texture;\n vec2 pixelate(vec2 coord, vec2 size) {\n return floor( coord / size ) * size;\n }\n void main(void) {\n gl_FragColor = vec4(0.0);\n vec2 coord = pixelate(vUv, size);\n gl_FragColor += texture2D(texture, coord);\n }\n`;\n\nexport const blur = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform vec2 px;\n void main(void) {\n gl_FragColor = vec4(0.0);\n gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;\n gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;\n gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;\n gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;\n gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;\n gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;\n gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;\n gl_FragColor += texture2D(texture, vUv )*0.159576912161;\n gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;\n gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;\n gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;\n gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;\n gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;\n gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;\n gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;\n }\n`;\n\nexport const convolution = `\n precision highp float;\n varying vec2 vUv;\n uniform sampler2D texture;\n uniform vec2 px;\n uniform float m[9];\n void main(void) {\n vec4 c11 = texture2D(texture, vUv - px); // top left\n vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y)); // top center\n vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y)); // top right\n vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) ); // mid left\n vec4 c22 = texture2D(texture, vUv); // mid center\n vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) ); // mid right\n vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) ); // bottom left\n vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) ); // bottom center\n vec4 c33 = texture2D(texture, vUv + px ); // bottom right\n gl_FragColor = \n c11 * m[0] + c12 * m[1] + c22 * m[2] +\n c21 * m[3] + c22 * m[4] + c23 * m[5] +\n c31 * m[6] + c32 * m[7] + c33 * m[8];\n gl_FragColor.a = c22.a;\n }\n`;\n", "/**\n * Image Filters in WebGL algoritm implementation\n * Based on: [WebGLImageFilter](https://github.com/phoboslab/WebGLImageFilter)\n */\n\nimport * as shaders from './imagefxshaders';\nimport { canvas } from './image';\nimport { log } from '../util/util';\n\nconst collect = (source, prefix, collection) => {\n const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n source.replace(r, (match, name) => {\n collection[name] = 0;\n return match;\n });\n};\n\nclass GLProgram {\n uniform = {};\n attribute = {};\n gl: WebGLRenderingContext;\n id: WebGLProgram;\n\n constructor(gl, vertexSource, fragmentSource) {\n this.gl = gl;\n const vertexShader = this.compile(vertexSource, this.gl.VERTEX_SHADER);\n const fragmentShader = this.compile(fragmentSource, this.gl.FRAGMENT_SHADER);\n this.id = this.gl.createProgram() as WebGLProgram;\n if (!vertexShader || !fragmentShader) return;\n if (!this.id) {\n log('filter: could not create webgl program');\n return;\n }\n this.gl.attachShader(this.id, vertexShader);\n this.gl.attachShader(this.id, fragmentShader);\n this.gl.linkProgram(this.id);\n if (!this.gl.getProgramParameter(this.id, this.gl.LINK_STATUS)) {\n log(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)}`);\n return;\n }\n this.gl.useProgram(this.id);\n collect(vertexSource, 'attribute', this.attribute); // Collect attributes\n for (const a in this.attribute) this.attribute[a] = this.gl.getAttribLocation(this.id, a);\n collect(vertexSource, 'uniform', this.uniform); // Collect uniforms\n collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = this.gl.getUniformLocation(this.id, u);\n }\n\n compile = (source, type): WebGLShader | null => {\n const shader = this.gl.createShader(type) as WebGLShader;\n if (!shader) {\n log('filter: could not create shader');\n return null;\n }\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n log(`filter: gl compile failed: ${this.gl.getShaderInfoLog(shader)}`);\n return null;\n }\n return shader;\n };\n}\n\n// function that is instantiated as class so it has private this members\n/**\n * @class GLImageFilter\n * @property {function} reset reset current filter chain\n * @property {function} add add specified filter to filter chain\n * @property {function} apply execute filter chain and draw result\n * @property {function} draw just draw input to result\n */\n\nexport function GLImageFilter() {\n let drawCount = 0;\n let sourceTexture: WebGLTexture | null = null;\n let lastInChain = false;\n let currentFramebufferIndex = -1;\n let tempFramebuffers: [null, null] | [{ fbo: WebGLFramebuffer | null, texture: WebGLTexture | null }] = [null, null];\n let filterChain: Record[] = [];\n let vertexBuffer: WebGLBuffer | null = null;\n let currentProgram: GLProgram | null = null;\n const fxcanvas = canvas(100, 100);\n const shaderProgramCache = { }; // key is the shader program source, value is the compiled program\n const DRAW = { INTERMEDIATE: 1 };\n const gl = fxcanvas.getContext('webgl') as WebGLRenderingContext;\n if (!gl) {\n log('filter: cannot get webgl context');\n return;\n }\n // @ts-ignore used for sanity checks outside of imagefx\n this.gl = gl;\n\n function resize(width, height) {\n if (width === fxcanvas.width && height === fxcanvas.height) return; // Same width/height? Nothing to do here\n fxcanvas.width = width;\n fxcanvas.height = height;\n if (!vertexBuffer) { // Create the context if we don't have it yet\n const vertices = new Float32Array([-1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0]); // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n vertexBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n }\n gl.viewport(0, 0, fxcanvas.width, fxcanvas.height);\n tempFramebuffers = [null, null]; // Delete old temp framebuffers\n }\n\n function createFramebufferTexture(width, height) {\n const fbo = gl.createFramebuffer() as WebGLFramebuffer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture() as WebGLTexture;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { fbo, texture };\n }\n\n function getTempFramebuffer(index): { fbo: WebGLFramebuffer | null, texture: WebGLTexture | null } {\n tempFramebuffers[index] = tempFramebuffers[index] || createFramebufferTexture(fxcanvas.width, fxcanvas.height);\n return tempFramebuffers[index] as { fbo: WebGLFramebuffer, texture: WebGLTexture };\n }\n\n function draw(flags = 0) {\n if (!currentProgram) return;\n let source: WebGLTexture | null = null;\n let target: WebGLFramebuffer | null = null;\n let flipY = false;\n if (drawCount === 0) source = sourceTexture; // First draw call - use the source texture\n else source = getTempFramebuffer(currentFramebufferIndex).texture || null; // All following draw calls use the temp buffer last drawn to\n drawCount++;\n if (lastInChain && !(flags & DRAW.INTERMEDIATE)) { // Last filter in our chain - draw directly to the WebGL Canvas. We may also have to flip the image vertically now\n target = null;\n flipY = drawCount % 2 === 0;\n } else {\n currentFramebufferIndex = (currentFramebufferIndex + 1) % 2;\n target = getTempFramebuffer(currentFramebufferIndex).fbo || null; // Intermediate draw call - get a temp buffer to draw to\n }\n gl.bindTexture(gl.TEXTURE_2D, source); // Bind the source and target and draw the two triangles\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.uniform1f(currentProgram.uniform['flipY'], (flipY ? -1 : 1));\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n\n function compileShader(fragmentSource): GLProgram | null {\n if (shaderProgramCache[fragmentSource]) {\n currentProgram = shaderProgramCache[fragmentSource];\n gl.useProgram((currentProgram ? currentProgram.id : null) || null);\n return currentProgram as GLProgram;\n }\n currentProgram = new GLProgram(gl, shaders.vertexIdentity, fragmentSource);\n if (!currentProgram) {\n log('filter: could not get webgl program');\n return null;\n }\n const floatSize = Float32Array.BYTES_PER_ELEMENT;\n const vertSize = 4 * floatSize;\n gl.enableVertexAttribArray(currentProgram.attribute['pos']);\n gl.vertexAttribPointer(currentProgram.attribute['pos'], 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n gl.enableVertexAttribArray(currentProgram.attribute['uv']);\n gl.vertexAttribPointer(currentProgram.attribute['uv'], 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n shaderProgramCache[fragmentSource] = currentProgram;\n return currentProgram as GLProgram;\n }\n\n const filter = {\n colorMatrix: (matrix) => { // general color matrix filter\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0) // Can we ignore the alpha value? Makes things a bit faster.\n ? shaders.colorMatrixWithoutAlpha\n : shaders.colorMatrixWithAlpha;\n const program = compileShader(shader);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n draw();\n },\n\n brightness: (brightness) => {\n const b = (brightness || 0) + 1;\n filter.colorMatrix([\n b, 0, 0, 0, 0,\n 0, b, 0, 0, 0,\n 0, 0, b, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n saturation: (amount) => {\n const x = (amount || 0) * 2 / 3 + 1;\n const y = ((x - 1) * -0.5);\n filter.colorMatrix([\n x, y, y, 0, 0,\n y, x, y, 0, 0,\n y, y, x, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n desaturate: () => {\n filter.saturation(-1);\n },\n\n contrast: (amount) => {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n filter.colorMatrix([\n v, 0, 0, 0, o,\n 0, v, 0, 0, o,\n 0, 0, v, 0, o,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n negative: () => {\n filter.contrast(-2);\n },\n\n hue: (rotation) => {\n rotation = (rotation || 0) / 180 * Math.PI;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const lumR = 0.213;\n const lumG = 0.715;\n const lumB = 0.072;\n filter.colorMatrix([\n lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n desaturateLuminance: () => {\n filter.colorMatrix([\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n sepia: () => {\n filter.colorMatrix([\n 0.393, 0.7689999, 0.18899999, 0, 0,\n 0.349, 0.6859999, 0.16799999, 0, 0,\n 0.272, 0.5339999, 0.13099999, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n brownie: () => {\n filter.colorMatrix([\n 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n vintagePinhole: () => {\n filter.colorMatrix([\n 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n kodachrome: () => {\n filter.colorMatrix([\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n technicolor: () => {\n filter.colorMatrix([\n 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n polaroid: () => {\n filter.colorMatrix([\n 1.438, -0.062, -0.062, 0, 0,\n -0.122, 1.378, -0.122, 0, 0,\n -0.016, -0.016, 1.483, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n shiftToBGR: () => {\n filter.colorMatrix([\n 0, 0, 1, 0, 0,\n 0, 1, 0, 0, 0,\n 1, 0, 0, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n },\n\n convolution: (matrix) => { // general convolution Filter\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / fxcanvas.width;\n const pixelSizeY = 1 / fxcanvas.height;\n const program = compileShader(shaders.convolution);\n if (!program) return;\n gl.uniform1fv(program.uniform['m'], m);\n gl.uniform2f(program.uniform['px'], pixelSizeX, pixelSizeY);\n draw();\n },\n\n detectEdges: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n },\n\n sobelX: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n },\n\n sobelY: () => {\n // @ts-ignore this\n filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n },\n\n sharpen: (amount) => {\n const a = amount || 1;\n // @ts-ignore this\n filter.convolution.call(this, [\n 0, -1 * a, 0,\n -1 * a, 1 + 4 * a, -1 * a,\n 0, -1 * a, 0,\n ]);\n },\n\n emboss: (size) => {\n const s = size || 1;\n // @ts-ignore this\n filter.convolution.call(this, [\n -2 * s, -1 * s, 0,\n -1 * s, 1, 1 * s,\n 0, 1 * s, 2 * s,\n ]);\n },\n\n blur: (size) => {\n const blurSizeX = (size / 7) / fxcanvas.width;\n const blurSizeY = (size / 7) / fxcanvas.height;\n const program = compileShader(shaders.blur);\n if (!program) return;\n // Vertical\n gl.uniform2f(program.uniform['px'], 0, blurSizeY);\n draw(DRAW.INTERMEDIATE);\n // Horizontal\n gl.uniform2f(program.uniform['px'], blurSizeX, 0);\n draw();\n },\n\n pixelate: (size) => {\n const blurSizeX = (size) / fxcanvas.width;\n const blurSizeY = (size) / fxcanvas.height;\n const program = compileShader(shaders.pixelate);\n if (!program) return;\n gl.uniform2f(program.uniform['size'], blurSizeX, blurSizeY);\n draw();\n },\n };\n\n // @ts-ignore this\n this.add = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const func = filter[name];\n filterChain.push({ func, args });\n };\n\n // @ts-ignore this\n this.reset = function () {\n filterChain = [];\n };\n\n // @ts-ignore this\n this.get = function () {\n return filterChain;\n };\n\n // @ts-ignore this\n this.apply = function (image) {\n resize(image.width, image.height);\n drawCount = 0;\n if (!sourceTexture) sourceTexture = gl.createTexture(); // Create the texture for the input image if we haven't yet\n gl.bindTexture(gl.TEXTURE_2D, sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n for (let i = 0; i < filterChain.length; i++) {\n lastInChain = (i === filterChain.length - 1);\n const f = filterChain[i];\n // @ts-ignore function assigment\n f.func.apply(this, f.args || []);\n }\n return fxcanvas;\n };\n\n // @ts-ignore this\n this.draw = function (image) {\n this.add('brightness', 0);\n return this.apply(image);\n };\n}\n", "/**\n * Image enhancements\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../exports';\n\nexport async function histogramEqualization(inputImage: Tensor): Promise {\n // const maxValue = 254; // using 255 results in values slightly larger than 1 due to math rounding errors\n const squeeze = inputImage.shape.length === 4 ? tf.squeeze(inputImage) : inputImage;\n const channels = tf.split(squeeze, 3, 2);\n const min: Tensor[] = [tf.min(channels[0]), tf.min(channels[1]), tf.min(channels[2])];\n const max: Tensor[] = [tf.max(channels[0]), tf.max(channels[1]), tf.max(channels[2])];\n const absMax = await Promise.all(max.map((channel) => channel.data()));\n const maxValue = 0.99 * Math.max(absMax[0][0], absMax[1][0], absMax[2][0]);\n const sub = [tf.sub(channels[0], min[0]), tf.sub(channels[1], min[1]), tf.sub(channels[2], min[2])];\n const range = [tf.sub(max[0], min[0]), tf.sub(max[1], min[1]), tf.sub(max[2], min[2])];\n const fact = [tf.div(maxValue, range[0]), tf.div(maxValue, range[1]), tf.div(maxValue, range[2])];\n const enh = [tf.mul(sub[0], fact[0]), tf.mul(sub[1], fact[1]), tf.mul(sub[2], fact[2])];\n const rgb = tf.stack([enh[0], enh[1], enh[2]], 2);\n const reshape = tf.reshape(rgb, [1, squeeze.shape[0], squeeze.shape[1], 3]);\n tf.dispose([...channels, ...min, ...max, ...sub, ...range, ...fact, ...enh, rgb, squeeze]);\n return reshape; // output shape is [1, height, width, 3]\n}\n", "/**\n * Image Processing algorithm implementation\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport type { Input, AnyCanvas, Tensor, Config } from '../exports';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport * as enhance from './enhance';\n\nconst maxSize = 3840;\n// internal temp canvases\nlet inCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet outCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\nlet tmpCanvas: AnyCanvas | null = null; // use global variable to avoid recreating canvas on each frame\n// @ts-ignore // imagefx is js module that should be converted to a class\nlet fx: fxImage.GLImageFilter | null; // instance of imagefx\n\nconst last: { inputSum: number, cacheDiff: number, sumMethod: number, inputTensor: undefined | Tensor } = {\n inputSum: 0,\n cacheDiff: 1,\n sumMethod: 0,\n inputTensor: undefined,\n};\n\nexport function canvas(width: number, height: number): AnyCanvas {\n let c;\n if (env.browser) { // browser defines canvas object\n if (env.worker) { // if runing in web worker use OffscreenCanvas\n if (typeof OffscreenCanvas === 'undefined') throw new Error('canvas error: attempted to run in web worker but OffscreenCanvas is not supported');\n c = new OffscreenCanvas(width, height);\n } else { // otherwise use DOM canvas\n if (typeof document === 'undefined') throw new Error('canvas error: attempted to run in browser but DOM is not defined');\n c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n }\n } else { // if not running in browser, there is no \"default\" canvas object, so we need monkey patch or fail\n // @ts-ignore // env.canvas is an external monkey-patch\n if (typeof env.Canvas !== 'undefined') c = new env.Canvas(width, height);\n else if (typeof globalThis.Canvas !== 'undefined') c = new globalThis.Canvas(width, height);\n // else throw new Error('canvas error: attempted to use canvas in nodejs without canvas support installed');\n }\n return c;\n}\n\n// helper function to copy canvas from input to output\nexport function copy(input: AnyCanvas, output?: AnyCanvas) {\n const outputCanvas = output || canvas(input.width, input.height);\n const ctx = outputCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctx.drawImage(input, 0, 0);\n return outputCanvas;\n}\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport async function process(input: Input, config: Config, getTensor: boolean = true): Promise<{ tensor: Tensor | null, canvas: AnyCanvas | null }> {\n if (!input) {\n // throw new Error('input is missing');\n if (config.debug) log('input error: input is missing');\n return { tensor: null, canvas: null }; // video may become temporarily unavailable due to onresize\n }\n // sanity checks since different browsers do not implement all dom elements\n if (\n !(input instanceof tf.Tensor)\n && !(typeof Image !== 'undefined' && input instanceof Image)\n && !(typeof env.Canvas !== 'undefined' && input instanceof env.Canvas)\n && !(typeof globalThis.Canvas !== 'undefined' && input instanceof globalThis.Canvas)\n && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n ) {\n throw new Error('input error: type is not recognized');\n }\n if (input instanceof tf.Tensor) { // if input is tensor use as-is without filters but correct shape as needed\n let tensor: Tensor | null = null;\n if ((input as Tensor)['isDisposedInternal']) throw new Error('input error: attempted to use tensor but it is disposed');\n if (!(input as Tensor)['shape']) throw new Error('input error: attempted to use tensor without a shape');\n if ((input as Tensor).shape.length === 3) { // [height, width, 3 || 4]\n if ((input as Tensor).shape[2] === 3) { // [height, width, 3] so add batch\n tensor = tf.expandDims(input, 0);\n } else if ((input as Tensor).shape[2] === 4) { // [height, width, 4] so strip alpha and add batch\n const rgb = tf.slice3d(input, [0, 0, 0], [-1, -1, 3]);\n tensor = tf.expandDims(rgb, 0);\n tf.dispose(rgb);\n }\n } else if ((input as Tensor).shape.length === 4) { // [1, width, height, 3 || 4]\n if ((input as Tensor).shape[3] === 3) { // [1, width, height, 3] just clone\n tensor = tf.clone(input);\n } else if ((input as Tensor).shape[3] === 4) { // [1, width, height, 4] so strip alpha\n tensor = tf.slice4d(input, [0, 0, 0, 0], [-1, -1, -1, 3]);\n }\n }\n // at the end shape must be [1, height, width, 3]\n if (tensor == null || tensor.shape.length !== 4 || tensor.shape[0] !== 1 || tensor.shape[3] !== 3) throw new Error(`input error: attempted to use tensor with unrecognized shape: ${input['shape']}`);\n if ((tensor as Tensor).dtype === 'int32') {\n const cast = tf.cast(tensor, 'float32');\n tf.dispose(tensor);\n tensor = cast;\n }\n return { tensor, canvas: (config.filter.return ? outCanvas : null) };\n } else {\n // check if resizing will be needed\n if (typeof input['readyState'] !== 'undefined' && input['readyState'] <= 2) {\n if (config.debug) log('input stream is not ready');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n if (!originalWidth || !originalHeight) {\n if (config.debug) log('cannot determine input dimensions');\n return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n }\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = Math.trunc(targetWidth * originalHeight / originalWidth);\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = Math.trunc(targetHeight * originalWidth / originalHeight);\n }\n\n // create our canvas and resize it if needed\n if ((config.filter.width || 0) > 0) targetWidth = config.filter.width;\n else if ((config.filter.height || 0) > 0) targetWidth = originalWidth * ((config.filter.height || 0) / originalHeight);\n if ((config.filter.height || 0) > 0) targetHeight = config.filter.height;\n else if ((config.filter.width || 0) > 0) targetHeight = originalHeight * ((config.filter.width || 0) / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('input error: cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) inCanvas = canvas(targetWidth, targetHeight);\n\n // draw input to our canvas\n const inCtx = inCanvas.getContext('2d') as CanvasRenderingContext2D;\n if ((typeof ImageData !== 'undefined') && (input instanceof ImageData)) {\n inCtx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof inCtx.translate !== 'undefined') {\n inCtx.translate(originalWidth, 0);\n inCtx.scale(-1, 1);\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n inCtx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n inCtx.drawImage(input as AnyCanvas, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n if (!outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) outCanvas = canvas(inCanvas.width, inCanvas.height); // init output canvas\n\n // imagefx transforms using gl from input canvas to output canvas\n if (config.filter.enabled && env.webgl.supported) {\n if (!fx) fx = env.browser ? new fxImage.GLImageFilter() : null; // && (typeof document !== 'undefined')\n env.filter = !!fx;\n if (!fx || !fx.add) {\n if (config.debug) log('input process error: cannot initialize filters');\n env.webgl.supported = false;\n config.filter.enabled = false;\n copy(inCanvas, outCanvas); // filter failed to initialize\n // return { tensor: null, canvas: inCanvas };\n } else {\n fx.reset();\n if (config.filter.brightness !== 0) fx.add('brightness', config.filter.brightness);\n if (config.filter.contrast !== 0) fx.add('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.add('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.add('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.add('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.add('hue', config.filter.hue);\n if (config.filter.negative) fx.add('negative');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.vintage) fx.add('brownie');\n if (config.filter.sepia) fx.add('sepia');\n if (config.filter.kodachrome) fx.add('kodachrome');\n if (config.filter.technicolor) fx.add('technicolor');\n if (config.filter.polaroid) fx.add('polaroid');\n if (config.filter.pixelate !== 0) fx.add('pixelate', config.filter.pixelate);\n if (fx.get() > 0) outCanvas = fx.apply(inCanvas);\n else outCanvas = fx.draw(inCanvas);\n }\n } else {\n copy(inCanvas, outCanvas); // if no filters applied, output canvas is input canvas\n if (fx) fx = null;\n env.filter = !!fx;\n }\n\n if (!getTensor) return { tensor: null, canvas: outCanvas }; // just canvas was requested\n if (!outCanvas) throw new Error('canvas error: cannot create output');\n\n // create tensor from image unless input was a tensor already\n let pixels;\n let depth = 3;\n if ((typeof ImageData !== 'undefined' && input instanceof ImageData) || (input['data'] && input['width'] && input['height'])) { // if input is imagedata, just use it\n if (env.browser && tf.browser) {\n pixels = tf.browser ? tf.browser.fromPixels(input) : null;\n } else {\n depth = input['data'].length / input['height'] / input['width'];\n // const arr = Uint8Array.from(input['data']);\n const arr = new Uint8Array(input['data']['buffer']);\n pixels = tf.tensor(arr, [input['height'], input['width'], depth], 'int32');\n }\n } else {\n if (!tmpCanvas || (outCanvas.width !== tmpCanvas.width) || (outCanvas.height !== tmpCanvas.height)) tmpCanvas = canvas(outCanvas.width, outCanvas.height); // init output canvas\n if (tf.browser && env.browser) {\n if (config.backend === 'webgl' || config.backend === 'humangl' || config.backend === 'webgpu') {\n pixels = tf.browser.fromPixels(outCanvas); // safe to reuse since both backend and context are gl based\n } else {\n tmpCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n pixels = tf.browser.fromPixels(tmpCanvas);\n }\n } else {\n const tempCanvas = copy(outCanvas); // cannot use output canvas as it already has gl context so we do a silly one more canvas\n const tempCtx = tempCanvas.getContext('2d') as CanvasRenderingContext2D;\n const tempData = tempCtx.getImageData(0, 0, targetWidth, targetHeight);\n depth = tempData.data.length / targetWidth / targetHeight;\n const arr = new Uint8Array(tempData.data.buffer);\n pixels = tf.tensor(arr, [targetWidth, targetHeight, depth]);\n }\n }\n if (depth === 4) { // rgba to rgb\n const rgb = tf.slice3d(pixels, [0, 0, 0], [-1, -1, 3]); // strip alpha channel\n tf.dispose(pixels);\n pixels = rgb;\n }\n if (!pixels) throw new Error('input error: cannot create tensor');\n const casted = tf.cast(pixels, 'float32');\n const tensor = config.filter.equalization ? await enhance.histogramEqualization(casted) : tf.expandDims(casted, 0);\n tf.dispose([pixels, casted]);\n return { tensor, canvas: (config.filter.return ? outCanvas : null) };\n }\n}\n\n/*\nconst checksum = async (input: Tensor): Promise => { // use tf sum or js based sum loop depending on which is faster\n const resizeFact = 48;\n const reduced: Tensor = tf.image.resizeBilinear(input, [Math.trunc((input.shape[1] || 1) / resizeFact), Math.trunc((input.shape[2] || 1) / resizeFact)]);\n const tfSum = async (): Promise => {\n const sumT = tf.sum(reduced);\n const sum0 = await sumT.data();\n tf.dispose(sumT);\n return sum0[0];\n };\n const jsSum = async (): Promise => {\n const reducedData = await reduced.data(); // raw image rgb array\n let sum0 = 0;\n for (let i = 0; i < reducedData.length / 3; i++) sum0 += reducedData[3 * i + 2]; // look only at green value of each pixel\n return sum0;\n };\n if (last.sumMethod === 0) {\n const t0 = now();\n await jsSum();\n const t1 = now();\n await tfSum();\n const t2 = now();\n last.sumMethod = t1 - t0 < t2 - t1 ? 1 : 2;\n }\n const res = last.sumMethod === 1 ? await jsSum() : await tfSum();\n tf.dispose(reduced);\n return res;\n};\n*/\n\nexport async function skip(config: Partial, input: Tensor) {\n let skipFrame = false;\n if (config.cacheSensitivity === 0 || !input.shape || input.shape.length !== 4 || input.shape[1] > 2048 || input.shape[2] > 2048) return skipFrame; // cache disabled or input is invalid or too large for cache analysis\n\n /*\n const checkSum = await checksum(input);\n const diff = 100 * (Math.max(checkSum, last.inputSum) / Math.min(checkSum, last.inputSum) - 1);\n last.inputSum = checkSum;\n // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n let skipFrame = diff < Math.max(config.cacheSensitivity, last.cacheDiff);\n // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n last.cacheDiff = diff > 10 * config.cacheSensitivity ? 0 : diff;\n skipFrame = skipFrame && (last.cacheDiff > 0); // if no cached diff value then force no skip\n */\n\n if (!last.inputTensor) {\n last.inputTensor = tf.clone(input);\n } else if (last.inputTensor.shape[1] !== input.shape[1] || last.inputTensor.shape[2] !== input.shape[2]) { // input resolution changed\n tf.dispose(last.inputTensor);\n last.inputTensor = tf.clone(input);\n } else {\n const t: Record = {};\n t.diff = tf.sub(input, last.inputTensor);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input.shape[1] || 1) / (input.shape[2] || 1) / 255 / 3; // squared difference relative to input resolution and averaged per channel\n tf.dispose([last.inputTensor, t.diff, t.squared, t.sum]);\n last.inputTensor = tf.clone(input);\n skipFrame = diffRelative <= (config.cacheSensitivity || 0);\n }\n return skipFrame;\n}\n\nexport async function compare(config: Partial, input1: Tensor, input2: Tensor): Promise {\n const t: Record = {};\n if (!input1 || !input2 || input1.shape.length !== 4 || input1.shape.length !== input2.shape.length) {\n if (!config.debug) log('invalid input tensor or tensor shapes do not match:', input1.shape, input2.shape);\n return 0;\n }\n if (input1.shape[0] !== 1 || input2.shape[0] !== 1 || input1.shape[3] !== 3 || input2.shape[3] !== 3) {\n if (!config.debug) log('input tensors must be of shape [1, height, width, 3]:', input1.shape, input2.shape);\n return 0;\n }\n t.input1 = tf.clone(input1);\n t.input2 = (input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2]) ? tf.image.resizeBilinear(input2, [input1.shape[1], input1.shape[2]]) : tf.clone(input2);\n t.diff = tf.sub(t.input1, t.input2);\n t.squared = tf.mul(t.diff, t.diff);\n t.sum = tf.sum(t.squared);\n const diffSum = await t.sum.data();\n const diffRelative = diffSum[0] / (input1.shape[1] || 1) / (input1.shape[2] || 1) / 255 / 3;\n tf.dispose([t.input1, t.input2, t.diff, t.squared, t.sum]);\n return diffRelative;\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\n\n/** Env class that holds detected capabilities */\nexport class Env {\n /** Running in Browser */\n browser: boolean;\n /** Running in NodeJS */\n node: boolean;\n /** Running in WebWorker thread */\n worker: boolean;\n /** Detected platform */\n platform: string = '';\n /** Detected agent */\n agent: string = '';\n /** List of supported backends */\n backends: string[] = [];\n /** Has any work been performed so far */\n initial: boolean;\n /** Are image filters supported? */\n filter: boolean | undefined;\n /** TFJS instance details */\n tfjs: {\n version: undefined | string,\n };\n /** Is offscreenCanvas supported? */\n offscreen: undefined | boolean;\n /** Are performance counter instant values or additive */\n perfadd: boolean = false;\n /** WASM detected capabilities */\n wasm: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n simd: undefined | boolean,\n multithread: undefined | boolean,\n } = {\n supported: undefined,\n backend: undefined,\n simd: undefined,\n multithread: undefined,\n };\n /** WebGL detected capabilities */\n webgl: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n version: undefined | string,\n renderer: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n version: undefined,\n renderer: undefined,\n };\n /** WebGPU detected capabilities */\n webgpu: {\n supported: undefined | boolean,\n backend: undefined | boolean,\n adapter: undefined | string,\n } = {\n supported: undefined,\n backend: undefined,\n adapter: undefined,\n };\n /** CPU info */\n cpu: {\n model: undefined | string,\n flags: string[],\n } = {\n model: undefined,\n flags: [],\n };\n /** List of supported kernels for current backend */\n kernels: string[] = [];\n /** MonkeyPatch for Canvas */\n Canvas: undefined;\n /** MonkeyPatch for Image */\n Image: undefined;\n /** MonkeyPatch for ImageData */\n ImageData: undefined;\n\n constructor() {\n this.browser = typeof navigator !== 'undefined';\n this.node = (typeof process !== 'undefined') && (typeof process.versions !== 'undefined') && (typeof process.versions.node !== 'undefined');\n this.tfjs = { version: tf.version['tfjs-core'] };\n this.offscreen = typeof OffscreenCanvas !== 'undefined';\n this.initial = true;\n // @ts-ignore WorkerGlobalScope evaluated in browser only\n this.worker = this.browser && this.offscreen ? (typeof WorkerGlobalScope !== 'undefined') : undefined;\n if (typeof navigator !== 'undefined') {\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw && raw[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n this.platform = (platformMatch && platformMatch[0]) ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n this.agent = navigator.userAgent.replace(raw[0], '');\n if (this.platform[1]) this.agent = this.agent.replace(raw[1], '');\n this.agent = this.agent.replace(/ /g, ' ');\n // chrome offscreencanvas gpu memory leak\n /*\n const isChrome = env.agent.match(/Chrome\\/.[0-9]/g);\n const verChrome = isChrome && isChrome[0] ? isChrome[0].split('/')[1] : 0;\n if (verChrome > 92 && verChrome < 96) {\n log('disabling offscreenCanvas due to browser error:', isChrome ? isChrome[0] : 'unknown');\n this.offscreen = false;\n }\n */\n }\n } else if (typeof process !== 'undefined') {\n this.platform = `${process.platform} ${process.arch}`;\n this.agent = `NodeJS ${process.version}`;\n }\n }\n\n /** update backend information */\n async updateBackend() {\n // analyze backends\n this.backends = Object.keys(tf.engine().registryFactory);\n this.wasm.supported = typeof WebAssembly !== 'undefined';\n this.wasm.backend = this.backends.includes('wasm');\n if (this.wasm.supported && this.wasm.backend && tf.getBackend() === 'wasm') {\n this.wasm.simd = tf.env().get('WASM_HAS_SIMD_SUPPORT');\n this.wasm.multithread = tf.env().get('WASM_HAS_MULTITHREAD_SUPPORT');\n }\n const c = image.canvas(100, 100);\n const ctx = c ? c.getContext('webgl2') : undefined; // causes too many gl contexts\n // const ctx = typeof tf.backend().getGPGPUContext !== undefined ? tf.backend().getGPGPUContext : null;\n this.webgl.supported = typeof ctx !== 'undefined';\n this.webgl.backend = this.backends.includes('webgl');\n if (this.webgl.supported && this.webgl.backend && (tf.getBackend() === 'webgl' || tf.getBackend() === 'humangl')) {\n // @ts-ignore getGPGPUContext only exists on WebGL backend\n const gl = tf.backend().gpgpu !== 'undefined' ? await tf.backend().getGPGPUContext().gl : null;\n if (gl) {\n this.webgl.version = gl.getParameter(gl.VERSION);\n this.webgl.renderer = gl.getParameter(gl.RENDERER);\n }\n }\n // @ts-ignore navigator.gpu is only defined when webgpu is available in browser\n this.webgpu.supported = this.browser && typeof navigator['gpu'] !== 'undefined';\n this.webgpu.backend = this.backends.includes('webgpu');\n try {\n // @ts-ignore navigator.gpu is only defined when webgpu is available in browser\n if (this.webgpu.supported) this.webgpu.adapter = (await navigator['gpu'].requestAdapter()).name;\n } catch {\n this.webgpu.supported = false;\n }\n try {\n this.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase());\n } catch { /**/ }\n }\n\n /** update cpu information */\n updateCPU() {\n const cpu = { model: '', flags: [] };\n if (this.node && this.platform.startsWith('linux')) {\n /*\n const fs = require('fs');\n try {\n const data = fs.readFileSync('/proc/cpuinfo').toString();\n for (const line of data.split('\\n')) {\n if (line.startsWith('model name')) cpu.model = line.match(/:(.*)/g)[0].replace(':', '').trim();\n if (line.startsWith('flags')) cpu.flags = line.match(/:(.*)/g)[0].replace(':', '').trim().split(' ').sort();\n }\n } catch { }\n */\n }\n if (!this['cpu']) Object.defineProperty(this, 'cpu', { value: cpu });\n else this['cpu'] = cpu;\n }\n}\n\nexport const env = new Env();\n", "/**\n * Loader and Validator for all models used by Human\n */\n\nimport { env } from './util/env';\nimport { log } from './util/util';\nimport * as gear from './gear/gear';\nimport * as ssrnetAge from './gear/ssrnet-age';\nimport * as ssrnetGender from './gear/ssrnet-gender';\nimport * as antispoof from './face/antispoof';\nimport * as blazeface from './face/blazeface';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as efficientpose from './body/efficientpose';\nimport * as emotion from './gear/emotion';\nimport * as mobilefacenet from './face/mobilefacenet';\nimport * as insightface from './face/insightface';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as iris from './face/iris';\nimport * as liveness from './face/liveness';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as posenet from './body/posenet';\nimport * as segmentation from './segmentation/segmentation';\nimport { modelStats, ModelInfo } from './tfjs/load';\nimport type { GraphModel } from './tfjs/types';\nimport type { Human } from './human';\n\n/** Instances of all possible TFJS Graph Models used by Human\n * - loaded as needed based on configuration\n * - initialized explictly with `human.load()` method\n * - initialized implicity on first call to `human.detect()`\n * - each model can be `null` if not loaded, instance of `GraphModel` if loaded or `Promise` if loading\n */\nexport class Models {\n ssrnetage: null | GraphModel | Promise = null;\n gear: null | GraphModel | Promise = null;\n blazeposedetect: null | GraphModel | Promise = null;\n blazepose: null | GraphModel | Promise = null;\n centernet: null | GraphModel | Promise = null;\n efficientpose: null | GraphModel | Promise = null;\n mobilefacenet: null | GraphModel | Promise = null;\n insightface: null | GraphModel | Promise = null;\n emotion: null | GraphModel | Promise = null;\n facedetect: null | GraphModel | Promise = null;\n faceiris: null | GraphModel | Promise = null;\n facemesh: null | GraphModel | Promise = null;\n faceres: null | GraphModel | Promise = null;\n ssrnetgender: null | GraphModel | Promise = null;\n handpose: null | GraphModel | Promise = null;\n handskeleton: null | GraphModel | Promise = null;\n handtrack: null | GraphModel | Promise = null;\n liveness: null | GraphModel | Promise = null;\n movenet: null | GraphModel | Promise = null;\n nanodet: null | GraphModel | Promise = null;\n posenet: null | GraphModel | Promise = null;\n segmentation: null | GraphModel | Promise = null;\n antispoof: null | GraphModel | Promise = null;\n}\n\nexport type ModelStats = {\n numLoadedModels: number,\n numEnabledModels: undefined,\n numDefinedModels: number,\n percentageLoaded: number,\n totalSizeFromManifest: number,\n totalSizeWeights: number,\n totalSizeLoading: number,\n totalSizeEnabled: undefined,\n modelStats: ModelInfo[],\n}\n\nexport const getModelStats = (instance: Human): ModelStats => {\n let totalSizeFromManifest = 0;\n let totalSizeWeights = 0;\n let totalSizeLoading = 0;\n for (const m of Object.values(modelStats)) {\n totalSizeFromManifest += m.sizeFromManifest;\n totalSizeWeights += m.sizeLoadedWeights;\n totalSizeLoading += m.sizeDesired;\n }\n const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0;\n return {\n numLoadedModels: Object.values(modelStats).length,\n numEnabledModels: undefined,\n numDefinedModels: Object.keys(instance.models).length,\n percentageLoaded,\n totalSizeFromManifest,\n totalSizeWeights,\n totalSizeLoading,\n totalSizeEnabled: undefined,\n modelStats: Object.values(modelStats),\n };\n};\n\nexport function reset(instance: Human): void {\n // if (instance.config.debug) log('resetting loaded models');\n for (const model of Object.keys(instance.models)) instance.models[model as keyof Models] = null;\n}\n\n/** Load method preloads all instance.configured models on-demand */\nexport async function load(instance: Human): Promise {\n if (env.initial) reset(instance);\n if (instance.config.hand.enabled) { // handpose model is a combo that must be loaded as a whole\n if (!instance.models.handpose && instance.config.hand.detector?.modelPath?.includes('handdetect')) {\n [instance.models.handpose, instance.models.handskeleton] = await handpose.load(instance.config);\n }\n if (!instance.models.handskeleton && instance.config.hand.landmarks && instance.config.hand.detector?.modelPath?.includes('handdetect')) {\n [instance.models.handpose, instance.models.handskeleton] = await handpose.load(instance.config);\n }\n }\n if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body?.modelPath?.includes('blazepose')) instance.models.blazepose = blazepose.loadPose(instance.config);\n // @ts-ignore optional model\n if (instance.config.body.enabled && !instance.models.blazeposedetect && instance.config.body['detector'] && instance.config.body['detector']['modelPath']) instance.models.blazeposedetect = blazepose.loadDetect(instance.config);\n if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body?.modelPath?.includes('efficientpose')) instance.models.efficientpose = efficientpose.load(instance.config);\n if (instance.config.body.enabled && !instance.models.movenet && instance.config.body?.modelPath?.includes('movenet')) instance.models.movenet = movenet.load(instance.config);\n if (instance.config.body.enabled && !instance.models.posenet && instance.config.body?.modelPath?.includes('posenet')) instance.models.posenet = posenet.load(instance.config);\n if (instance.config.face.enabled && !instance.models.facedetect) instance.models.facedetect = blazeface.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.antispoof?.enabled && !instance.models.antispoof) instance.models.antispoof = antispoof.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.liveness?.enabled && !instance.models.liveness) instance.models.liveness = liveness.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.description?.enabled && !instance.models.faceres) instance.models.faceres = faceres.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.emotion?.enabled && !instance.models.emotion) instance.models.emotion = emotion.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.iris?.enabled && !instance.config.face.attention?.enabled && !instance.models.faceiris) instance.models.faceiris = iris.load(instance.config);\n if (instance.config.face.enabled && instance.config.face.mesh?.enabled && !instance.models.facemesh) instance.models.facemesh = facemesh.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['gear']?.enabled && !instance.models.gear) instance.models.gear = gear.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetage) instance.models.ssrnetage = ssrnetAge.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['ssrnet']?.enabled && !instance.models.ssrnetgender) instance.models.ssrnetgender = ssrnetGender.load(instance.config);\n // @ts-ignore optional model\n if (instance.config.face.enabled && instance.config.face['mobilefacenet']?.enabled && !instance.models.mobilefacenet) instance.models.mobilefacenet = mobilefacenet.load(instance.config);\n if (instance.config.face.enabled && instance.config.face['insightface']?.enabled && !instance.models.insightface) instance.models.insightface = insightface.load(instance.config);\n if (instance.config.hand.enabled && !instance.models.handtrack && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handtrack = handtrack.loadDetect(instance.config);\n if (instance.config.hand.enabled && instance.config.hand.landmarks && !instance.models.handskeleton && instance.config.hand.detector?.modelPath?.includes('handtrack')) instance.models.handskeleton = handtrack.loadSkeleton(instance.config);\n if (instance.config.object.enabled && !instance.models.centernet && instance.config.object?.modelPath?.includes('centernet')) instance.models.centernet = centernet.load(instance.config);\n if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object?.modelPath?.includes('nanodet')) instance.models.nanodet = nanodet.load(instance.config);\n if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = segmentation.load(instance.config);\n\n // models are loaded in parallel asynchronously so lets wait until they are actually loaded\n for await (const model of Object.keys(instance.models)) {\n if (instance.models[model as keyof Models] && typeof instance.models[model as keyof Models] !== 'undefined') {\n instance.models[model as keyof Models] = await instance.models[model as keyof Models];\n }\n }\n}\n\nlet instance: Human;\nexport type KernelOps = { name: string, url: string, missing: string[], ops: string[] }\n\nexport function validateModel(newInstance: Human | null, model: GraphModel | null, name: string): KernelOps | null {\n if (newInstance) instance = newInstance;\n if (!model) return null;\n if (!instance) log('instance not registred');\n if (!instance.config.validateModels) return null;\n const simpleOps = ['const', 'placeholder', 'noop', 'pad', 'squeeze', 'add', 'sub', 'mul', 'div'];\n const ignoreOps = ['biasadd', 'fusedbatchnormv3', 'matmul'];\n const ops: string[] = [];\n const missing: string[] = [];\n interface Op { name: string, category: string, op: string }\n // @ts-ignore // modelUrl is a private method\n const url = model.modelUrl;\n // @ts-ignore // executor is a private method\n const executor = model.executor;\n if (executor && executor.graph.nodes) {\n for (const kernel of Object.values(executor.graph.nodes)) {\n const op = (kernel as Op).op.toLowerCase();\n if (!ops.includes(op)) ops.push(op);\n }\n } else {\n if (!executor && instance.config.debug) log('model signature not determined:', name);\n }\n for (const op of ops) {\n if (!simpleOps.includes(op) // exclude simple ops\n && !ignoreOps.includes(op) // exclude specific ops\n && !instance.env.kernels.includes(op) // check actual kernel ops\n && !instance.env.kernels.includes(op.replace('_', '')) // check variation without _\n && !instance.env.kernels.includes(op.replace('native', '')) // check standard variation\n && !instance.env.kernels.includes(op.replace('v2', ''))) { // check non-versioned variation\n missing.push(op);\n }\n }\n if (instance.config.debug && missing.length > 0) log('model validation failed:', name, missing);\n return missing.length > 0 ? { name, missing, ops, url } : null;\n}\n\nexport function validate(newInstance: Human): Array<{ name: string, missing: string[] }> {\n instance = newInstance;\n const missing: Array = [];\n for (const defined of Object.keys(instance.models)) {\n const model: GraphModel | null = instance.models[defined as keyof Models] as GraphModel | null;\n if (!model) continue;\n const res = validateModel(instance, model, defined);\n if (res) missing.push(res);\n }\n return missing;\n}\n", "/**\n * GEAR [gender/emotion/age/race] model implementation\n *\n * Based on: [**GEAR Predictor**](https://github.com/Udolf15/GEAR-Predictor)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Gender, Race } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport { env } from '../util/env';\n\nexport type GearType = { age: number, gender: Gender, genderScore: number, race: Array<{ score: number, race: Race }> }\nlet model: GraphModel | null;\nconst last: Array = [];\nconst raceNames = ['white', 'black', 'asian', 'indian', 'other'];\nconst ageWeights = [15, 23, 28, 35.5, 45.5, 55.5, 65];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['gear']?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n const skipFrame = skipped < (config.face['gear']?.skipFrames || 0);\n const skipTime = (config.face['gear']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n // t.resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape[2], model?.inputs[0].shape[1]], false);\n const box = [[0.0, 0.10, 0.90, 0.90]]; // empyrical values for top, left, bottom, right\n t.resize = tf.image.cropAndResize(image, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const obj: GearType = { age: 0, gender: 'unknown', genderScore: 0, race: [] };\n if (config.face['gear']?.enabled) [t.age, t.gender, t.race] = model.execute(t.resize, ['age_output', 'gender_output', 'race_output']) as Tensor[];\n const gender = await t.gender.data();\n obj.gender = gender[0] > gender[1] ? 'male' : 'female';\n obj.genderScore = Math.round(100 * (gender[0] > gender[1] ? gender[0] : gender[1])) / 100;\n const race = await t.race.data();\n for (let i = 0; i < race.length; i++) {\n if (race[i] > (config.face['gear']?.minConfidence || 0.2)) obj.race.push({ score: Math.round(100 * race[i]) / 100, race: raceNames[i] as Race });\n }\n obj.race.sort((a, b) => b.score - a.score);\n // {0: 'Below20', 1: '21-25', 2: '26-30', 3: '31-40',4: '41-50', 5: '51-60', 6: 'Above60'}\n const ageDistribution = Array.from(await t.age.data());\n const ageSorted = ageDistribution.map((a, i) => [ageWeights[i], a]).sort((a, b) => b[1] - a[1]);\n let age = ageSorted[0][0]; // pick best starting point\n for (let i = 1; i < ageSorted.length; i++) age += ageSorted[i][1] * (ageSorted[i][0] - age); // adjust with each other choice by weight\n obj.age = Math.round(10 * age) / 10;\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from './types';\n\nexport const constants: Record = {\n tf255: 255,\n tf1: 1,\n tf2: 2,\n tf05: 0.5,\n tf127: 127.5,\n rgb: [0.2989, 0.5870, 0.1140],\n};\n\nexport function init() {\n constants.tf255 = tf.scalar(255, 'float32');\n constants.tf1 = tf.scalar(1, 'float32');\n constants.tf2 = tf.scalar(2, 'float32');\n constants.tf05 = tf.scalar(0.5, 'float32');\n constants.tf127 = tf.scalar(127.5, 'float32');\n constants.rgb = tf.tensor1d([0.2989, 0.5870, 0.1140], 'float32'); // factors for red/green/blue colors when converting to grayscale\n}\n", "/**\n * Age model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\n\nlet model: GraphModel | null;\nconst last: Array<{ age: number }> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathAge);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise<{ age: number }> {\n if (!model) return { age: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs || !model.inputs[0] || !model.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.mul(t.resize, constants.tf255);\n const obj = { age: 0 };\n if (config.face['ssrnet'].enabled) t.age = model.execute(t.enhance) as Tensor;\n if (t.age) {\n const data = await t.age.data();\n obj.age = Math.trunc(10 * data[0]) / 10;\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Gender model implementation\n *\n * Based on: [**SSR-Net**](https://github.com/shamangary/SSR-Net)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Gender } from '../result';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array<{ gender: Gender, genderScore: number }> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function load(config: Config | any) {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['ssrnet'].modelPathGender);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function predict(image: Tensor, config: Config, idx, count): Promise<{ gender: Gender, genderScore: number }> {\n if (!model) return { gender: 'unknown', genderScore: 0 };\n const skipFrame = skipped < (config.face['ssrnet']?.skipFrames || 0);\n const skipTime = (config.face['ssrnet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.gender && (last[idx]?.genderScore > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n if (!model?.inputs[0].shape) return;\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n t.enhance = tf.tidy(() => {\n const [red, green, blue] = tf.split(t.resize, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const normalize = tf.mul(tf.sub(grayscale, constants.tf05), 2); // range grayscale:-1..1\n return normalize;\n });\n const obj: { gender: Gender, genderScore: number } = { gender: 'unknown', genderScore: 0 };\n if (config.face['ssrnet'].enabled) t.gender = model.execute(t.enhance) as Tensor;\n const data = await t.gender.data();\n obj.gender = data[0] > data[1] ? 'female' : 'male'; // returns two values 0..1, bigger one is prediction\n obj.genderScore = data[0] > data[1] ? (Math.trunc(100 * data[0]) / 100) : (Math.trunc(100 * data[1]) / 100);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n last[idx] = obj;\n lastCount = count;\n lastTime = now();\n resolve(obj);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.antispoof?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return 0;\n const skipTime = (config.face.antispoof?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.antispoof?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nexport const meshAnnotations: Record = {\n silhouette: [\n 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n ],\n // lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291], // 11\n // lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291], // 10\n // lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308], // 11\n // lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], // 11\n lipsUpperOuter: [185, 40, 39, 37, 0, 267, 269, 270, 409],\n lipsLowerOuter: [61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [191, 80, 81, 82, 13, 312, 311, 310, 415],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n lipsLowerSemiOuter: [76, 77, 90, 180, 85, 16, 315, 404, 320, 307, 306],\n lipsUpperSemiOuter: [184, 74, 73, 72, 11, 302, 303, 304, 408],\n lipsLowerSemiInner: [62, 96, 89, 179, 86, 15, 316, 403, 319, 325, 292],\n lipsUpperSemiInner: [183, 42, 41, 38, 12, 268, 271, 272, 407],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173], // 7\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133], // 9\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190], // 7\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243], // 9\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189], // 7\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244], // 9\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245], // 9\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193], // 8\n rightEyebrowLower: [35, 124, 46, 53, 52, 65], // 6\n rightEyeIris: [473, 474, 475, 476, 477], // 5\n leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n leftEyeIris: [468, 469, 470, 471, 472],\n midwayBetweenEyes: [168],\n noseTip: [1],\n noseBottom: [2],\n noseRightCorner: [98],\n noseLeftCorner: [327],\n rightCheek: [205],\n leftCheek: [425],\n};\n\nexport const meshLandmarks: Record = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, meshAnnotations['midwayBetweenEyes'][0]],\n};\n\nexport const blazeFaceLandmarks: Record = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nexport const irisIndices: Array<{ key: string, indices: number[] }> = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] }, // 7 x 3d\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] }, // 7 x 3d\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] }, // 7 x 3d\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] }, // 7 x 3d\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] }, // 9 x 3d\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] }, // 9 x 3d\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] }, // 9 x 3d\n { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] }, // 8 x 3d\n { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] }, // 6 x 3d\n];\n\nexport const UV468: [number, number][] = [\n [0.499976992607117, 0.652534008026123],\n [0.500025987625122, 0.547487020492554],\n [0.499974012374878, 0.602371990680695],\n [0.482113003730774, 0.471979022026062],\n [0.500150978565216, 0.527155995368958],\n [0.499909996986389, 0.498252987861633],\n [0.499523013830185, 0.40106201171875],\n [0.289712011814117, 0.380764007568359],\n [0.499954998493195, 0.312398016452789],\n [0.499987006187439, 0.269918978214264],\n [0.500023007392883, 0.107050001621246],\n [0.500023007392883, 0.666234016418457],\n [0.5000159740448, 0.679224014282227],\n [0.500023007392883, 0.692348003387451],\n [0.499976992607117, 0.695277988910675],\n [0.499976992607117, 0.70593398809433],\n [0.499976992607117, 0.719385027885437],\n [0.499976992607117, 0.737019002437592],\n [0.499967992305756, 0.781370997428894],\n [0.499816000461578, 0.562981009483337],\n [0.473773002624512, 0.573909997940063],\n [0.104906998574734, 0.254140973091125],\n [0.365929991006851, 0.409575998783112],\n [0.338757991790771, 0.41302502155304],\n [0.311120003461838, 0.409460008144379],\n [0.274657994508743, 0.389131009578705],\n [0.393361985683441, 0.403706014156342],\n [0.345234006643295, 0.344011008739471],\n [0.370094001293182, 0.346076011657715],\n [0.319321990013123, 0.347265005111694],\n [0.297903001308441, 0.353591024875641],\n [0.24779200553894, 0.410809993743896],\n [0.396889001131058, 0.842755019664764],\n [0.280097991228104, 0.375599980354309],\n [0.106310002505779, 0.399955987930298],\n [0.2099249958992, 0.391353011131287],\n [0.355807989835739, 0.534406006336212],\n [0.471751004457474, 0.65040397644043],\n [0.474155008792877, 0.680191993713379],\n [0.439785003662109, 0.657229006290436],\n [0.414617002010345, 0.66654098033905],\n [0.450374007225037, 0.680860996246338],\n [0.428770989179611, 0.682690978050232],\n [0.374971002340317, 0.727805018424988],\n [0.486716985702515, 0.547628998756409],\n [0.485300987958908, 0.527395009994507],\n [0.257764995098114, 0.314490020275116],\n [0.401223003864288, 0.455172002315521],\n [0.429818987846375, 0.548614978790283],\n [0.421351999044418, 0.533740997314453],\n [0.276895999908447, 0.532056987285614],\n [0.483370006084442, 0.499586999416351],\n [0.33721199631691, 0.282882988452911],\n [0.296391993761063, 0.293242990970612],\n [0.169294998049736, 0.193813979625702],\n [0.447580009698868, 0.302609980106354],\n [0.392390012741089, 0.353887975215912],\n [0.354490011930466, 0.696784019470215],\n [0.067304998636246, 0.730105042457581],\n [0.442739009857178, 0.572826027870178],\n [0.457098007202148, 0.584792017936707],\n [0.381974011659622, 0.694710969924927],\n [0.392388999462128, 0.694203019142151],\n [0.277076005935669, 0.271932005882263],\n [0.422551989555359, 0.563233017921448],\n [0.385919004678726, 0.281364023685455],\n [0.383103013038635, 0.255840003490448],\n [0.331431001424789, 0.119714021682739],\n [0.229923993349075, 0.232002973556519],\n [0.364500999450684, 0.189113974571228],\n [0.229622006416321, 0.299540996551514],\n [0.173287004232407, 0.278747975826263],\n [0.472878992557526, 0.666198015213013],\n [0.446828007698059, 0.668527007102966],\n [0.422762006521225, 0.673889994621277],\n [0.445307999849319, 0.580065965652466],\n [0.388103008270264, 0.693961024284363],\n [0.403039008378983, 0.706539988517761],\n [0.403629004955292, 0.693953037261963],\n [0.460041999816895, 0.557139039039612],\n [0.431158006191254, 0.692366003990173],\n [0.452181994915009, 0.692366003990173],\n [0.475387006998062, 0.692366003990173],\n [0.465828001499176, 0.779190003871918],\n [0.472328990697861, 0.736225962638855],\n [0.473087012767792, 0.717857003211975],\n [0.473122000694275, 0.704625964164734],\n [0.473033010959625, 0.695277988910675],\n [0.427942007780075, 0.695277988910675],\n [0.426479011774063, 0.703539967536926],\n [0.423162013292313, 0.711845993995667],\n [0.4183090031147, 0.720062971115112],\n [0.390094995498657, 0.639572978019714],\n [0.013953999616206, 0.560034036636353],\n [0.499913990497589, 0.58014702796936],\n [0.413199990987778, 0.69539999961853],\n [0.409626007080078, 0.701822996139526],\n [0.468080013990402, 0.601534962654114],\n [0.422728985548019, 0.585985004901886],\n [0.463079988956451, 0.593783974647522],\n [0.37211999297142, 0.47341400384903],\n [0.334562003612518, 0.496073007583618],\n [0.411671012639999, 0.546965003013611],\n [0.242175996303558, 0.14767599105835],\n [0.290776997804642, 0.201445996761322],\n [0.327338010072708, 0.256527006626129],\n [0.399509996175766, 0.748921036720276],\n [0.441727995872498, 0.261676013469696],\n [0.429764986038208, 0.187834024429321],\n [0.412198007106781, 0.108901023864746],\n [0.288955003023148, 0.398952007293701],\n [0.218936994671822, 0.435410976409912],\n [0.41278201341629, 0.398970007896423],\n [0.257135003805161, 0.355440020561218],\n [0.427684992551804, 0.437960982322693],\n [0.448339998722076, 0.536936044692993],\n [0.178560003638268, 0.45755398273468],\n [0.247308000922203, 0.457193970680237],\n [0.286267012357712, 0.467674970626831],\n [0.332827985286713, 0.460712015628815],\n [0.368755996227264, 0.447206974029541],\n [0.398963987827301, 0.432654976844788],\n [0.476410001516342, 0.405806005001068],\n [0.189241006970406, 0.523923993110657],\n [0.228962004184723, 0.348950982093811],\n [0.490725994110107, 0.562400996685028],\n [0.404670000076294, 0.485132992267609],\n [0.019469000399113, 0.401564002037048],\n [0.426243007183075, 0.420431017875671],\n [0.396993011236191, 0.548797011375427],\n [0.266469985246658, 0.376977026462555],\n [0.439121007919312, 0.51895797252655],\n [0.032313998788595, 0.644356966018677],\n [0.419054001569748, 0.387154996395111],\n [0.462783008813858, 0.505746960639954],\n [0.238978996872902, 0.779744982719421],\n [0.198220998048782, 0.831938028335571],\n [0.107550002634525, 0.540755033493042],\n [0.183610007166862, 0.740257024765015],\n [0.134409993886948, 0.333683013916016],\n [0.385764002799988, 0.883153975009918],\n [0.490967005491257, 0.579378008842468],\n [0.382384985685349, 0.508572995662689],\n [0.174399003386497, 0.397670984268188],\n [0.318785011768341, 0.39623498916626],\n [0.343364000320435, 0.400596976280212],\n [0.396100014448166, 0.710216999053955],\n [0.187885001301765, 0.588537991046906],\n [0.430987000465393, 0.944064974784851],\n [0.318993002176285, 0.898285031318665],\n [0.266247987747192, 0.869701027870178],\n [0.500023007392883, 0.190576016902924],\n [0.499976992607117, 0.954452991485596],\n [0.366169989109039, 0.398822009563446],\n [0.393207013607025, 0.39553701877594],\n [0.410373002290726, 0.391080021858215],\n [0.194993004202843, 0.342101991176605],\n [0.388664990663528, 0.362284004688263],\n [0.365961998701096, 0.355970978736877],\n [0.343364000320435, 0.355356991291046],\n [0.318785011768341, 0.35834002494812],\n [0.301414996385574, 0.363156020641327],\n [0.058132998645306, 0.319076001644135],\n [0.301414996385574, 0.387449026107788],\n [0.499987989664078, 0.618434011936188],\n [0.415838003158569, 0.624195992946625],\n [0.445681989192963, 0.566076993942261],\n [0.465844005346298, 0.620640993118286],\n [0.49992299079895, 0.351523995399475],\n [0.288718998432159, 0.819945991039276],\n [0.335278987884521, 0.852819979190826],\n [0.440512001514435, 0.902418971061707],\n [0.128294005990028, 0.791940987110138],\n [0.408771991729736, 0.373893976211548],\n [0.455606997013092, 0.451801002025604],\n [0.499877005815506, 0.908990025520325],\n [0.375436991453171, 0.924192011356354],\n [0.11421000212431, 0.615022003650665],\n [0.448662012815475, 0.695277988910675],\n [0.4480200111866, 0.704632043838501],\n [0.447111994028091, 0.715808033943176],\n [0.444831997156143, 0.730794012546539],\n [0.430011987686157, 0.766808986663818],\n [0.406787008047104, 0.685672998428345],\n [0.400738000869751, 0.681069016456604],\n [0.392399996519089, 0.677703022956848],\n [0.367855995893478, 0.663918972015381],\n [0.247923001646996, 0.601333022117615],\n [0.452769994735718, 0.420849978923798],\n [0.43639200925827, 0.359887003898621],\n [0.416164010763168, 0.368713974952698],\n [0.413385987281799, 0.692366003990173],\n [0.228018000721931, 0.683571994304657],\n [0.468268007040024, 0.352671027183533],\n [0.411361992359161, 0.804327011108398],\n [0.499989002943039, 0.469825029373169],\n [0.479153990745544, 0.442654013633728],\n [0.499974012374878, 0.439637005329132],\n [0.432112008333206, 0.493588984012604],\n [0.499886006116867, 0.866917014122009],\n [0.49991300702095, 0.821729004383087],\n [0.456548988819122, 0.819200992584229],\n [0.344549000263214, 0.745438992977142],\n [0.37890899181366, 0.574010014533997],\n [0.374292999505997, 0.780184984207153],\n [0.319687992334366, 0.570737957954407],\n [0.357154995203018, 0.604269981384277],\n [0.295284003019333, 0.621580958366394],\n [0.447750002145767, 0.862477004528046],\n [0.410986006259918, 0.508723020553589],\n [0.31395098567009, 0.775308012962341],\n [0.354128003120422, 0.812552988529205],\n [0.324548006057739, 0.703992962837219],\n [0.189096003770828, 0.646299958229065],\n [0.279776990413666, 0.71465802192688],\n [0.1338230073452, 0.682700991630554],\n [0.336768001317978, 0.644733011722565],\n [0.429883986711502, 0.466521978378296],\n [0.455527991056442, 0.548622965812683],\n [0.437114000320435, 0.558896005153656],\n [0.467287987470627, 0.529924988746643],\n [0.414712011814117, 0.335219979286194],\n [0.37704598903656, 0.322777986526489],\n [0.344107985496521, 0.320150971412659],\n [0.312875986099243, 0.32233202457428],\n [0.283526003360748, 0.333190023899078],\n [0.241245999932289, 0.382785975933075],\n [0.102986000478268, 0.468762993812561],\n [0.267612010240555, 0.424560010433197],\n [0.297879010438919, 0.433175981044769],\n [0.333433985710144, 0.433878004550934],\n [0.366427004337311, 0.426115989685059],\n [0.396012008190155, 0.416696012020111],\n [0.420121014118195, 0.41022801399231],\n [0.007561000064015, 0.480777025222778],\n [0.432949006557465, 0.569517970085144],\n [0.458638995885849, 0.479089021682739],\n [0.473466008901596, 0.545744001865387],\n [0.476087987422943, 0.563830018043518],\n [0.468472003936768, 0.555056989192963],\n [0.433990985155106, 0.582361996173859],\n [0.483518004417419, 0.562983989715576],\n [0.482482999563217, 0.57784903049469],\n [0.42645001411438, 0.389798998832703],\n [0.438998997211456, 0.39649498462677],\n [0.450067013502121, 0.400434017181396],\n [0.289712011814117, 0.368252992630005],\n [0.276670008897781, 0.363372981548309],\n [0.517862021923065, 0.471948027610779],\n [0.710287988185883, 0.380764007568359],\n [0.526226997375488, 0.573909997940063],\n [0.895093023777008, 0.254140973091125],\n [0.634069979190826, 0.409575998783112],\n [0.661242008209229, 0.41302502155304],\n [0.688880026340485, 0.409460008144379],\n [0.725341975688934, 0.389131009578705],\n [0.606630027294159, 0.40370500087738],\n [0.654766023159027, 0.344011008739471],\n [0.629905998706818, 0.346076011657715],\n [0.680678009986877, 0.347265005111694],\n [0.702096998691559, 0.353591024875641],\n [0.75221198797226, 0.410804986953735],\n [0.602918028831482, 0.842862963676453],\n [0.719901978969574, 0.375599980354309],\n [0.893692970275879, 0.399959981441498],\n [0.790081977844238, 0.391354024410248],\n [0.643998026847839, 0.534487962722778],\n [0.528249025344849, 0.65040397644043],\n [0.525849997997284, 0.680191040039062],\n [0.560214996337891, 0.657229006290436],\n [0.585384011268616, 0.66654098033905],\n [0.549625992774963, 0.680860996246338],\n [0.57122802734375, 0.682691991329193],\n [0.624852001667023, 0.72809898853302],\n [0.513050019741058, 0.547281980514526],\n [0.51509702205658, 0.527251958847046],\n [0.742246985435486, 0.314507007598877],\n [0.598631024360657, 0.454979002475739],\n [0.570338010787964, 0.548575043678284],\n [0.578631997108459, 0.533622980117798],\n [0.723087012767792, 0.532054007053375],\n [0.516445994377136, 0.499638974666595],\n [0.662801027297974, 0.282917976379395],\n [0.70362401008606, 0.293271005153656],\n [0.830704987049103, 0.193813979625702],\n [0.552385985851288, 0.302568018436432],\n [0.607609987258911, 0.353887975215912],\n [0.645429015159607, 0.696707010269165],\n [0.932694971561432, 0.730105042457581],\n [0.557260990142822, 0.572826027870178],\n [0.542901992797852, 0.584792017936707],\n [0.6180260181427, 0.694710969924927],\n [0.607590973377228, 0.694203019142151],\n [0.722943007946014, 0.271963000297546],\n [0.577413976192474, 0.563166975975037],\n [0.614082992076874, 0.281386971473694],\n [0.616907000541687, 0.255886018276215],\n [0.668509006500244, 0.119913995265961],\n [0.770092010498047, 0.232020974159241],\n [0.635536015033722, 0.189248979091644],\n [0.77039098739624, 0.299556016921997],\n [0.826722025871277, 0.278755009174347],\n [0.527121007442474, 0.666198015213013],\n [0.553171992301941, 0.668527007102966],\n [0.577238023281097, 0.673889994621277],\n [0.554691970348358, 0.580065965652466],\n [0.611896991729736, 0.693961024284363],\n [0.59696102142334, 0.706539988517761],\n [0.596370995044708, 0.693953037261963],\n [0.539958000183105, 0.557139039039612],\n [0.568841993808746, 0.692366003990173],\n [0.547818005084991, 0.692366003990173],\n [0.52461302280426, 0.692366003990173],\n [0.534089982509613, 0.779141008853912],\n [0.527670979499817, 0.736225962638855],\n [0.526912987232208, 0.717857003211975],\n [0.526877999305725, 0.704625964164734],\n [0.526966989040375, 0.695277988910675],\n [0.572058022022247, 0.695277988910675],\n [0.573521018028259, 0.703539967536926],\n [0.57683801651001, 0.711845993995667],\n [0.581691026687622, 0.720062971115112],\n [0.609944999217987, 0.639909982681274],\n [0.986046016216278, 0.560034036636353],\n [0.5867999792099, 0.69539999961853],\n [0.590372025966644, 0.701822996139526],\n [0.531915009021759, 0.601536989212036],\n [0.577268004417419, 0.585934996604919],\n [0.536915004253387, 0.593786001205444],\n [0.627542972564697, 0.473352015018463],\n [0.665585994720459, 0.495950996875763],\n [0.588353991508484, 0.546862006187439],\n [0.757824003696442, 0.14767599105835],\n [0.709249973297119, 0.201507985591888],\n [0.672684013843536, 0.256581008434296],\n [0.600408971309662, 0.74900496006012],\n [0.55826598405838, 0.261672019958496],\n [0.570303976535797, 0.187870979309082],\n [0.588165998458862, 0.109044015407562],\n [0.711045026779175, 0.398952007293701],\n [0.781069993972778, 0.435405015945435],\n [0.587247014045715, 0.398931980133057],\n [0.742869973182678, 0.355445981025696],\n [0.572156012058258, 0.437651991844177],\n [0.55186802148819, 0.536570012569427],\n [0.821442008018494, 0.457556009292603],\n [0.752701997756958, 0.457181990146637],\n [0.71375697851181, 0.467626988887787],\n [0.66711300611496, 0.460672974586487],\n [0.631101012229919, 0.447153985500336],\n [0.6008620262146, 0.432473003864288],\n [0.523481011390686, 0.405627012252808],\n [0.810747981071472, 0.523926019668579],\n [0.771045982837677, 0.348959028720856],\n [0.509127020835876, 0.562718033790588],\n [0.595292985439301, 0.485023975372314],\n [0.980530977249146, 0.401564002037048],\n [0.573499977588654, 0.420000016689301],\n [0.602994978427887, 0.548687994480133],\n [0.733529984951019, 0.376977026462555],\n [0.560611009597778, 0.519016981124878],\n [0.967685997486115, 0.644356966018677],\n [0.580985009670258, 0.387160003185272],\n [0.537728011608124, 0.505385041236877],\n [0.760966002941132, 0.779752969741821],\n [0.801778972148895, 0.831938028335571],\n [0.892440974712372, 0.54076099395752],\n [0.816350996494293, 0.740260004997253],\n [0.865594983100891, 0.333687007427216],\n [0.614073991775513, 0.883246004581451],\n [0.508952975273132, 0.579437971115112],\n [0.617941975593567, 0.508316040039062],\n [0.825608015060425, 0.397674977779388],\n [0.681214988231659, 0.39623498916626],\n [0.656635999679565, 0.400596976280212],\n [0.603900015354156, 0.710216999053955],\n [0.81208598613739, 0.588539004325867],\n [0.56801301240921, 0.944564998149872],\n [0.681007981300354, 0.898285031318665],\n [0.733752012252808, 0.869701027870178],\n [0.633830010890961, 0.398822009563446],\n [0.606792986392975, 0.39553701877594],\n [0.589659988880157, 0.391062021255493],\n [0.805015981197357, 0.342108011245728],\n [0.611334979534149, 0.362284004688263],\n [0.634037971496582, 0.355970978736877],\n [0.656635999679565, 0.355356991291046],\n [0.681214988231659, 0.35834002494812],\n [0.698584973812103, 0.363156020641327],\n [0.941866993904114, 0.319076001644135],\n [0.698584973812103, 0.387449026107788],\n [0.584177017211914, 0.624107003211975],\n [0.554318010807037, 0.566076993942261],\n [0.534153997898102, 0.62064003944397],\n [0.711217999458313, 0.819975018501282],\n [0.664629995822906, 0.852871000766754],\n [0.559099972248077, 0.902631998062134],\n [0.871706008911133, 0.791940987110138],\n [0.591234028339386, 0.373893976211548],\n [0.544341027736664, 0.451583981513977],\n [0.624562978744507, 0.924192011356354],\n [0.88577002286911, 0.615028977394104],\n [0.551338016986847, 0.695277988910675],\n [0.551980018615723, 0.704632043838501],\n [0.552887976169586, 0.715808033943176],\n [0.555167973041534, 0.730794012546539],\n [0.569944024085999, 0.767035007476807],\n [0.593203008174896, 0.685675978660583],\n [0.599261999130249, 0.681069016456604],\n [0.607599973678589, 0.677703022956848],\n [0.631937980651855, 0.663500010967255],\n [0.752032995223999, 0.601315021514893],\n [0.547226011753082, 0.420395016670227],\n [0.563543975353241, 0.359827995300293],\n [0.583841025829315, 0.368713974952698],\n [0.586614012718201, 0.692366003990173],\n [0.771915018558502, 0.683578014373779],\n [0.531597018241882, 0.352482974529266],\n [0.588370978832245, 0.804440975189209],\n [0.52079701423645, 0.442565023899078],\n [0.567984998226166, 0.493479013442993],\n [0.543282985687256, 0.819254994392395],\n [0.655317008495331, 0.745514988899231],\n [0.621008992195129, 0.574018001556396],\n [0.625559985637665, 0.78031200170517],\n [0.680198013782501, 0.570719003677368],\n [0.64276397228241, 0.604337990283966],\n [0.704662978649139, 0.621529996395111],\n [0.552012026309967, 0.862591981887817],\n [0.589071989059448, 0.508637011051178],\n [0.685944974422455, 0.775357007980347],\n [0.645735025405884, 0.812640011310577],\n [0.675342977046967, 0.703978002071381],\n [0.810858011245728, 0.646304965019226],\n [0.72012197971344, 0.714666962623596],\n [0.866151988506317, 0.682704985141754],\n [0.663187026977539, 0.644596993923187],\n [0.570082008838654, 0.466325998306274],\n [0.544561982154846, 0.548375964164734],\n [0.562758982181549, 0.558784961700439],\n [0.531987011432648, 0.530140042304993],\n [0.585271000862122, 0.335177004337311],\n [0.622952997684479, 0.32277899980545],\n [0.655896008014679, 0.320163011550903],\n [0.687132000923157, 0.322345972061157],\n [0.716481983661652, 0.333200991153717],\n [0.758756995201111, 0.382786989212036],\n [0.897013008594513, 0.468769013881683],\n [0.732392013072968, 0.424547016620636],\n [0.70211398601532, 0.433162987232208],\n [0.66652500629425, 0.433866024017334],\n [0.633504986763, 0.426087975502014],\n [0.603875994682312, 0.416586995124817],\n [0.579657971858978, 0.409945011138916],\n [0.992439985275269, 0.480777025222778],\n [0.567192018032074, 0.569419980049133],\n [0.54136598110199, 0.478899002075195],\n [0.526564002037048, 0.546118021011353],\n [0.523913025856018, 0.563830018043518],\n [0.531529009342194, 0.555056989192963],\n [0.566035985946655, 0.582329034805298],\n [0.51631098985672, 0.563053965568542],\n [0.5174720287323, 0.577877044677734],\n [0.573594987392426, 0.389806985855103],\n [0.560697972774506, 0.395331978797913],\n [0.549755990505219, 0.399751007556915],\n [0.710287988185883, 0.368252992630005],\n [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468: Array = [\n 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68: Array = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n 8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n 45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n 23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n 39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n 35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n 48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n 66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33: Array = [\n /* eyes */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n /* brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n /* 4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n /* nose */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n /* chin */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n /* cont */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7: Array = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68: Array = [\n /* cont */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n /* nose */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n /* eyes */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n /* lip */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33: Array = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7: Array = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n\n// https://github.com/tensorflow/tfjs-models/blob/master/face-landmarks-detection/src/constants.ts\n// https://github.com/google/mediapipe/mediapipe/python/solutions/face_mesh_connections.py\n\ntype PairArray = Array<[number, number]>;\n\nfunction connectionsToIndices(connections: PairArray) {\n const indices = connections.map((connection) => connection[0]);\n indices.push(connections[connections.length - 1][1]);\n return indices;\n}\n\nexport const pairsLips: PairArray = [\n [61, 146], [146, 91], [91, 181], [181, 84], [84, 17], [17, 314], [314, 405], [405, 321], [321, 375], [375, 291], [61, 185], [185, 40], [40, 39], [39, 37], [37, 0], [0, 267], [267, 269], [269, 270], [270, 409], [409, 291],\n [78, 95], [95, 88], [88, 178], [178, 87], [87, 14], [14, 317], [317, 402], [402, 318], [318, 324], [324, 308], [78, 191], [191, 80], [80, 81], [81, 82], [82, 13], [13, 312], [312, 311], [311, 310], [310, 415], [415, 308],\n];\n\nexport const pairsLeftEye: PairArray = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]];\n\nexport const pairsLeftEyebrow: PairArray = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]];\n\nexport const pairsLeftIris: PairArray = [[474, 475], [475, 476], [476, 477], [477, 474]];\n\nexport const pairsRightEye: PairArray = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]];\n\nexport const pairsRightEyebrow: PairArray = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]];\n\nexport const pairsRightIris: PairArray = [[469, 470], [470, 471], [471, 472], [472, 469]];\n\nexport const pairsFaceContour: PairArray = [\n [10, 338], [338, 297], [297, 332], [332, 284], [284, 251], [251, 389],\n [389, 356], [356, 454], [454, 323], [323, 361], [361, 288], [288, 397],\n [397, 365], [365, 379], [379, 378], [378, 400], [400, 377], [377, 152],\n [152, 148], [148, 176], [176, 149], [149, 150], [150, 136], [136, 172],\n [172, 58], [58, 132], [132, 93], [93, 234], [234, 127], [127, 162],\n [162, 21], [21, 54], [54, 103], [103, 67], [67, 109], [109, 10],\n];\n\nexport const contourKeypoints = {\n lips: connectionsToIndices(pairsLips),\n leftEye: connectionsToIndices(pairsLeftEye),\n leftEyebrow: connectionsToIndices(pairsLeftEyebrow),\n leftIris: connectionsToIndices(pairsLeftIris),\n rightEye: connectionsToIndices(pairsRightEye),\n rightEyebrow: connectionsToIndices(pairsRightEyebrow),\n rightIris: connectionsToIndices(pairsRightIris),\n faceOval: connectionsToIndices(pairsFaceContour),\n};\n\nexport const pairsFaceMesh: PairArray = [\n [127, 34], [34, 139], [139, 127], [11, 0], [0, 37], [37, 11],\n [232, 231], [231, 120], [120, 232], [72, 37], [37, 39], [39, 72],\n [128, 121], [121, 47], [47, 128], [232, 121], [121, 128], [128, 232],\n [104, 69], [69, 67], [67, 104], [175, 171], [171, 148], [148, 175],\n [118, 50], [50, 101], [101, 118], [73, 39], [39, 40], [40, 73],\n [9, 151], [151, 108], [108, 9], [48, 115], [115, 131], [131, 48],\n [194, 204], [204, 211], [211, 194], [74, 40], [40, 185], [185, 74],\n [80, 42], [42, 183], [183, 80], [40, 92], [92, 186], [186, 40],\n [230, 229], [229, 118], [118, 230], [202, 212], [212, 214], [214, 202],\n [83, 18], [18, 17], [17, 83], [76, 61], [61, 146], [146, 76],\n [160, 29], [29, 30], [30, 160], [56, 157], [157, 173], [173, 56],\n [106, 204], [204, 194], [194, 106], [135, 214], [214, 192], [192, 135],\n [203, 165], [165, 98], [98, 203], [21, 71], [71, 68], [68, 21],\n [51, 45], [45, 4], [4, 51], [144, 24], [24, 23], [23, 144],\n [77, 146], [146, 91], [91, 77], [205, 50], [50, 187], [187, 205],\n [201, 200], [200, 18], [18, 201], [91, 106], [106, 182], [182, 91],\n [90, 91], [91, 181], [181, 90], [85, 84], [84, 17], [17, 85],\n [206, 203], [203, 36], [36, 206], [148, 171], [171, 140], [140, 148],\n [92, 40], [40, 39], [39, 92], [193, 189], [189, 244], [244, 193],\n [159, 158], [158, 28], [28, 159], [247, 246], [246, 161], [161, 247],\n [236, 3], [3, 196], [196, 236], [54, 68], [68, 104], [104, 54],\n [193, 168], [168, 8], [8, 193], [117, 228], [228, 31], [31, 117],\n [189, 193], [193, 55], [55, 189], [98, 97], [97, 99], [99, 98],\n [126, 47], [47, 100], [100, 126], [166, 79], [79, 218], [218, 166],\n [155, 154], [154, 26], [26, 155], [209, 49], [49, 131], [131, 209],\n [135, 136], [136, 150], [150, 135], [47, 126], [126, 217], [217, 47],\n [223, 52], [52, 53], [53, 223], [45, 51], [51, 134], [134, 45],\n [211, 170], [170, 140], [140, 211], [67, 69], [69, 108], [108, 67],\n [43, 106], [106, 91], [91, 43], [230, 119], [119, 120], [120, 230],\n [226, 130], [130, 247], [247, 226], [63, 53], [53, 52], [52, 63],\n [238, 20], [20, 242], [242, 238], [46, 70], [70, 156], [156, 46],\n [78, 62], [62, 96], [96, 78], [46, 53], [53, 63], [63, 46],\n [143, 34], [34, 227], [227, 143], [123, 117], [117, 111], [111, 123],\n [44, 125], [125, 19], [19, 44], [236, 134], [134, 51], [51, 236],\n [216, 206], [206, 205], [205, 216], [154, 153], [153, 22], [22, 154],\n [39, 37], [37, 167], [167, 39], [200, 201], [201, 208], [208, 200],\n [36, 142], [142, 100], [100, 36], [57, 212], [212, 202], [202, 57],\n [20, 60], [60, 99], [99, 20], [28, 158], [158, 157], [157, 28],\n [35, 226], [226, 113], [113, 35], [160, 159], [159, 27], [27, 160],\n [204, 202], [202, 210], [210, 204], [113, 225], [225, 46], [46, 113],\n [43, 202], [202, 204], [204, 43], [62, 76], [76, 77], [77, 62],\n [137, 123], [123, 116], [116, 137], [41, 38], [38, 72], [72, 41],\n [203, 129], [129, 142], [142, 203], [64, 98], [98, 240], [240, 64],\n [49, 102], [102, 64], [64, 49], [41, 73], [73, 74], [74, 41],\n [212, 216], [216, 207], [207, 212], [42, 74], [74, 184], [184, 42],\n [169, 170], [170, 211], [211, 169], [170, 149], [149, 176], [176, 170],\n [105, 66], [66, 69], [69, 105], [122, 6], [6, 168], [168, 122],\n [123, 147], [147, 187], [187, 123], [96, 77], [77, 90], [90, 96],\n [65, 55], [55, 107], [107, 65], [89, 90], [90, 180], [180, 89],\n [101, 100], [100, 120], [120, 101], [63, 105], [105, 104], [104, 63],\n [93, 137], [137, 227], [227, 93], [15, 86], [86, 85], [85, 15],\n [129, 102], [102, 49], [49, 129], [14, 87], [87, 86], [86, 14],\n [55, 8], [8, 9], [9, 55], [100, 47], [47, 121], [121, 100],\n [145, 23], [23, 22], [22, 145], [88, 89], [89, 179], [179, 88],\n [6, 122], [122, 196], [196, 6], [88, 95], [95, 96], [96, 88],\n [138, 172], [172, 136], [136, 138], [215, 58], [58, 172], [172, 215],\n [115, 48], [48, 219], [219, 115], [42, 80], [80, 81], [81, 42],\n [195, 3], [3, 51], [51, 195], [43, 146], [146, 61], [61, 43],\n [171, 175], [175, 199], [199, 171], [81, 82], [82, 38], [38, 81],\n [53, 46], [46, 225], [225, 53], [144, 163], [163, 110], [110, 144],\n [52, 65], [65, 66], [66, 52], [229, 228], [228, 117], [117, 229],\n [34, 127], [127, 234], [234, 34], [107, 108], [108, 69], [69, 107],\n [109, 108], [108, 151], [151, 109], [48, 64], [64, 235], [235, 48],\n [62, 78], [78, 191], [191, 62], [129, 209], [209, 126], [126, 129],\n [111, 35], [35, 143], [143, 111], [117, 123], [123, 50], [50, 117],\n [222, 65], [65, 52], [52, 222], [19, 125], [125, 141], [141, 19],\n [221, 55], [55, 65], [65, 221], [3, 195], [195, 197], [197, 3],\n [25, 7], [7, 33], [33, 25], [220, 237], [237, 44], [44, 220],\n [70, 71], [71, 139], [139, 70], [122, 193], [193, 245], [245, 122],\n [247, 130], [130, 33], [33, 247], [71, 21], [21, 162], [162, 71],\n [170, 169], [169, 150], [150, 170], [188, 174], [174, 196], [196, 188],\n [216, 186], [186, 92], [92, 216], [2, 97], [97, 167], [167, 2],\n [141, 125], [125, 241], [241, 141], [164, 167], [167, 37], [37, 164],\n [72, 38], [38, 12], [12, 72], [38, 82], [82, 13], [13, 38],\n [63, 68], [68, 71], [71, 63], [226, 35], [35, 111], [111, 226],\n [101, 50], [50, 205], [205, 101], [206, 92], [92, 165], [165, 206],\n [209, 198], [198, 217], [217, 209], [165, 167], [167, 97], [97, 165],\n [220, 115], [115, 218], [218, 220], [133, 112], [112, 243], [243, 133],\n [239, 238], [238, 241], [241, 239], [214, 135], [135, 169], [169, 214],\n [190, 173], [173, 133], [133, 190], [171, 208], [208, 32], [32, 171],\n [125, 44], [44, 237], [237, 125], [86, 87], [87, 178], [178, 86],\n [85, 86], [86, 179], [179, 85], [84, 85], [85, 180], [180, 84],\n [83, 84], [84, 181], [181, 83], [201, 83], [83, 182], [182, 201],\n [137, 93], [93, 132], [132, 137], [76, 62], [62, 183], [183, 76],\n [61, 76], [76, 184], [184, 61], [57, 61], [61, 185], [185, 57],\n [212, 57], [57, 186], [186, 212], [214, 207], [207, 187], [187, 214],\n [34, 143], [143, 156], [156, 34], [79, 239], [239, 237], [237, 79],\n [123, 137], [137, 177], [177, 123], [44, 1], [1, 4], [4, 44],\n [201, 194], [194, 32], [32, 201], [64, 102], [102, 129], [129, 64],\n [213, 215], [215, 138], [138, 213], [59, 166], [166, 219], [219, 59],\n [242, 99], [99, 97], [97, 242], [2, 94], [94, 141], [141, 2],\n [75, 59], [59, 235], [235, 75], [24, 110], [110, 228], [228, 24],\n [25, 130], [130, 226], [226, 25], [23, 24], [24, 229], [229, 23],\n [22, 23], [23, 230], [230, 22], [26, 22], [22, 231], [231, 26],\n [112, 26], [26, 232], [232, 112], [189, 190], [190, 243], [243, 189],\n [221, 56], [56, 190], [190, 221], [28, 56], [56, 221], [221, 28],\n [27, 28], [28, 222], [222, 27], [29, 27], [27, 223], [223, 29],\n [30, 29], [29, 224], [224, 30], [247, 30], [30, 225], [225, 247],\n [238, 79], [79, 20], [20, 238], [166, 59], [59, 75], [75, 166],\n [60, 75], [75, 240], [240, 60], [147, 177], [177, 215], [215, 147],\n [20, 79], [79, 166], [166, 20], [187, 147], [147, 213], [213, 187],\n [112, 233], [233, 244], [244, 112], [233, 128], [128, 245], [245, 233],\n [128, 114], [114, 188], [188, 128], [114, 217], [217, 174], [174, 114],\n [131, 115], [115, 220], [220, 131], [217, 198], [198, 236], [236, 217],\n [198, 131], [131, 134], [134, 198], [177, 132], [132, 58], [58, 177],\n [143, 35], [35, 124], [124, 143], [110, 163], [163, 7], [7, 110],\n [228, 110], [110, 25], [25, 228], [356, 389], [389, 368], [368, 356],\n [11, 302], [302, 267], [267, 11], [452, 350], [350, 349], [349, 452],\n [302, 303], [303, 269], [269, 302], [357, 343], [343, 277], [277, 357],\n [452, 453], [453, 357], [357, 452], [333, 332], [332, 297], [297, 333],\n [175, 152], [152, 377], [377, 175], [347, 348], [348, 330], [330, 347],\n [303, 304], [304, 270], [270, 303], [9, 336], [336, 337], [337, 9],\n [278, 279], [279, 360], [360, 278], [418, 262], [262, 431], [431, 418],\n [304, 408], [408, 409], [409, 304], [310, 415], [415, 407], [407, 310],\n [270, 409], [409, 410], [410, 270], [450, 348], [348, 347], [347, 450],\n [422, 430], [430, 434], [434, 422], [313, 314], [314, 17], [17, 313],\n [306, 307], [307, 375], [375, 306], [387, 388], [388, 260], [260, 387],\n [286, 414], [414, 398], [398, 286], [335, 406], [406, 418], [418, 335],\n [364, 367], [367, 416], [416, 364], [423, 358], [358, 327], [327, 423],\n [251, 284], [284, 298], [298, 251], [281, 5], [5, 4], [4, 281],\n [373, 374], [374, 253], [253, 373], [307, 320], [320, 321], [321, 307],\n [425, 427], [427, 411], [411, 425], [421, 313], [313, 18], [18, 421],\n [321, 405], [405, 406], [406, 321], [320, 404], [404, 405], [405, 320],\n [315, 16], [16, 17], [17, 315], [426, 425], [425, 266], [266, 426],\n [377, 400], [400, 369], [369, 377], [322, 391], [391, 269], [269, 322],\n [417, 465], [465, 464], [464, 417], [386, 257], [257, 258], [258, 386],\n [466, 260], [260, 388], [388, 466], [456, 399], [399, 419], [419, 456],\n [284, 332], [332, 333], [333, 284], [417, 285], [285, 8], [8, 417],\n [346, 340], [340, 261], [261, 346], [413, 441], [441, 285], [285, 413],\n [327, 460], [460, 328], [328, 327], [355, 371], [371, 329], [329, 355],\n [392, 439], [439, 438], [438, 392], [382, 341], [341, 256], [256, 382],\n [429, 420], [420, 360], [360, 429], [364, 394], [394, 379], [379, 364],\n [277, 343], [343, 437], [437, 277], [443, 444], [444, 283], [283, 443],\n [275, 440], [440, 363], [363, 275], [431, 262], [262, 369], [369, 431],\n [297, 338], [338, 337], [337, 297], [273, 375], [375, 321], [321, 273],\n [450, 451], [451, 349], [349, 450], [446, 342], [342, 467], [467, 446],\n [293, 334], [334, 282], [282, 293], [458, 461], [461, 462], [462, 458],\n [276, 353], [353, 383], [383, 276], [308, 324], [324, 325], [325, 308],\n [276, 300], [300, 293], [293, 276], [372, 345], [345, 447], [447, 372],\n [352, 345], [345, 340], [340, 352], [274, 1], [1, 19], [19, 274],\n [456, 248], [248, 281], [281, 456], [436, 427], [427, 425], [425, 436],\n [381, 256], [256, 252], [252, 381], [269, 391], [391, 393], [393, 269],\n [200, 199], [199, 428], [428, 200], [266, 330], [330, 329], [329, 266],\n [287, 273], [273, 422], [422, 287], [250, 462], [462, 328], [328, 250],\n [258, 286], [286, 384], [384, 258], [265, 353], [353, 342], [342, 265],\n [387, 259], [259, 257], [257, 387], [424, 431], [431, 430], [430, 424],\n [342, 353], [353, 276], [276, 342], [273, 335], [335, 424], [424, 273],\n [292, 325], [325, 307], [307, 292], [366, 447], [447, 345], [345, 366],\n [271, 303], [303, 302], [302, 271], [423, 266], [266, 371], [371, 423],\n [294, 455], [455, 460], [460, 294], [279, 278], [278, 294], [294, 279],\n [271, 272], [272, 304], [304, 271], [432, 434], [434, 427], [427, 432],\n [272, 407], [407, 408], [408, 272], [394, 430], [430, 431], [431, 394],\n [395, 369], [369, 400], [400, 395], [334, 333], [333, 299], [299, 334],\n [351, 417], [417, 168], [168, 351], [352, 280], [280, 411], [411, 352],\n [325, 319], [319, 320], [320, 325], [295, 296], [296, 336], [336, 295],\n [319, 403], [403, 404], [404, 319], [330, 348], [348, 349], [349, 330],\n [293, 298], [298, 333], [333, 293], [323, 454], [454, 447], [447, 323],\n [15, 16], [16, 315], [315, 15], [358, 429], [429, 279], [279, 358],\n [14, 15], [15, 316], [316, 14], [285, 336], [336, 9], [9, 285],\n [329, 349], [349, 350], [350, 329], [374, 380], [380, 252], [252, 374],\n [318, 402], [402, 403], [403, 318], [6, 197], [197, 419], [419, 6],\n [318, 319], [319, 325], [325, 318], [367, 364], [364, 365], [365, 367],\n [435, 367], [367, 397], [397, 435], [344, 438], [438, 439], [439, 344],\n [272, 271], [271, 311], [311, 272], [195, 5], [5, 281], [281, 195],\n [273, 287], [287, 291], [291, 273], [396, 428], [428, 199], [199, 396],\n [311, 271], [271, 268], [268, 311], [283, 444], [444, 445], [445, 283],\n [373, 254], [254, 339], [339, 373], [282, 334], [334, 296], [296, 282],\n [449, 347], [347, 346], [346, 449], [264, 447], [447, 454], [454, 264],\n [336, 296], [296, 299], [299, 336], [338, 10], [10, 151], [151, 338],\n [278, 439], [439, 455], [455, 278], [292, 407], [407, 415], [415, 292],\n [358, 371], [371, 355], [355, 358], [340, 345], [345, 372], [372, 340],\n [346, 347], [347, 280], [280, 346], [442, 443], [443, 282], [282, 442],\n [19, 94], [94, 370], [370, 19], [441, 442], [442, 295], [295, 441],\n [248, 419], [419, 197], [197, 248], [263, 255], [255, 359], [359, 263],\n [440, 275], [275, 274], [274, 440], [300, 383], [383, 368], [368, 300],\n [351, 412], [412, 465], [465, 351], [263, 467], [467, 466], [466, 263],\n [301, 368], [368, 389], [389, 301], [395, 378], [378, 379], [379, 395],\n [412, 351], [351, 419], [419, 412], [436, 426], [426, 322], [322, 436],\n [2, 164], [164, 393], [393, 2], [370, 462], [462, 461], [461, 370],\n [164, 0], [0, 267], [267, 164], [302, 11], [11, 12], [12, 302],\n [268, 12], [12, 13], [13, 268], [293, 300], [300, 301], [301, 293],\n [446, 261], [261, 340], [340, 446], [330, 266], [266, 425], [425, 330],\n [426, 423], [423, 391], [391, 426], [429, 355], [355, 437], [437, 429],\n [391, 327], [327, 326], [326, 391], [440, 457], [457, 438], [438, 440],\n [341, 382], [382, 362], [362, 341], [459, 457], [457, 461], [461, 459],\n [434, 430], [430, 394], [394, 434], [414, 463], [463, 362], [362, 414],\n [396, 369], [369, 262], [262, 396], [354, 461], [461, 457], [457, 354],\n [316, 403], [403, 402], [402, 316], [315, 404], [404, 403], [403, 315],\n [314, 405], [405, 404], [404, 314], [313, 406], [406, 405], [405, 313],\n [421, 418], [418, 406], [406, 421], [366, 401], [401, 361], [361, 366],\n [306, 408], [408, 407], [407, 306], [291, 409], [409, 408], [408, 291],\n [287, 410], [410, 409], [409, 287], [432, 436], [436, 410], [410, 432],\n [434, 416], [416, 411], [411, 434], [264, 368], [368, 383], [383, 264],\n [309, 438], [438, 457], [457, 309], [352, 376], [376, 401], [401, 352],\n [274, 275], [275, 4], [4, 274], [421, 428], [428, 262], [262, 421],\n [294, 327], [327, 358], [358, 294], [433, 416], [416, 367], [367, 433],\n [289, 455], [455, 439], [439, 289], [462, 370], [370, 326], [326, 462],\n [2, 326], [326, 370], [370, 2], [305, 460], [460, 455], [455, 305],\n [254, 449], [449, 448], [448, 254], [255, 261], [261, 446], [446, 255],\n [253, 450], [450, 449], [449, 253], [252, 451], [451, 450], [450, 252],\n [256, 452], [452, 451], [451, 256], [341, 453], [453, 452], [452, 341],\n [413, 464], [464, 463], [463, 413], [441, 413], [413, 414], [414, 441],\n [258, 442], [442, 441], [441, 258], [257, 443], [443, 442], [442, 257],\n [259, 444], [444, 443], [443, 259], [260, 445], [445, 444], [444, 260],\n [467, 342], [342, 445], [445, 467], [459, 458], [458, 250], [250, 459],\n [289, 392], [392, 290], [290, 289], [290, 328], [328, 460], [460, 290],\n [376, 433], [433, 435], [435, 376], [250, 290], [290, 392], [392, 250],\n [411, 416], [416, 433], [433, 411], [341, 463], [463, 464], [464, 341],\n [453, 464], [464, 465], [465, 453], [357, 465], [465, 412], [412, 357],\n [343, 412], [412, 399], [399, 343], [360, 363], [363, 440], [440, 360],\n [437, 399], [399, 456], [456, 437], [420, 456], [456, 363], [363, 420],\n [401, 435], [435, 288], [288, 401], [372, 383], [383, 353], [353, 372],\n [339, 255], [255, 249], [249, 339], [448, 261], [261, 255], [255, 448],\n [133, 243], [243, 190], [190, 133], [133, 155], [155, 112], [112, 133],\n [33, 246], [246, 247], [247, 33], [33, 130], [130, 25], [25, 33],\n [398, 384], [384, 286], [286, 398], [362, 398], [398, 414], [414, 362],\n [362, 463], [463, 341], [341, 362], [263, 359], [359, 467], [467, 263],\n [263, 249], [249, 255], [255, 263], [466, 467], [467, 260], [260, 466],\n [75, 60], [60, 166], [166, 75], [238, 239], [239, 79], [79, 238],\n [162, 127], [127, 139], [139, 162], [72, 11], [11, 37], [37, 72],\n [121, 232], [232, 120], [120, 121], [73, 72], [72, 39], [39, 73],\n [114, 128], [128, 47], [47, 114], [233, 232], [232, 128], [128, 233],\n [103, 104], [104, 67], [67, 103], [152, 175], [175, 148], [148, 152],\n [119, 118], [118, 101], [101, 119], [74, 73], [73, 40], [40, 74],\n [107, 9], [9, 108], [108, 107], [49, 48], [48, 131], [131, 49],\n [32, 194], [194, 211], [211, 32], [184, 74], [74, 185], [185, 184],\n [191, 80], [80, 183], [183, 191], [185, 40], [40, 186], [186, 185],\n [119, 230], [230, 118], [118, 119], [210, 202], [202, 214], [214, 210],\n [84, 83], [83, 17], [17, 84], [77, 76], [76, 146], [146, 77],\n [161, 160], [160, 30], [30, 161], [190, 56], [56, 173], [173, 190],\n [182, 106], [106, 194], [194, 182], [138, 135], [135, 192], [192, 138],\n [129, 203], [203, 98], [98, 129], [54, 21], [21, 68], [68, 54],\n [5, 51], [51, 4], [4, 5], [145, 144], [144, 23], [23, 145],\n [90, 77], [77, 91], [91, 90], [207, 205], [205, 187], [187, 207],\n [83, 201], [201, 18], [18, 83], [181, 91], [91, 182], [182, 181],\n [180, 90], [90, 181], [181, 180], [16, 85], [85, 17], [17, 16],\n [205, 206], [206, 36], [36, 205], [176, 148], [148, 140], [140, 176],\n [165, 92], [92, 39], [39, 165], [245, 193], [193, 244], [244, 245],\n [27, 159], [159, 28], [28, 27], [30, 247], [247, 161], [161, 30],\n [174, 236], [236, 196], [196, 174], [103, 54], [54, 104], [104, 103],\n [55, 193], [193, 8], [8, 55], [111, 117], [117, 31], [31, 111],\n [221, 189], [189, 55], [55, 221], [240, 98], [98, 99], [99, 240],\n [142, 126], [126, 100], [100, 142], [219, 166], [166, 218], [218, 219],\n [112, 155], [155, 26], [26, 112], [198, 209], [209, 131], [131, 198],\n [169, 135], [135, 150], [150, 169], [114, 47], [47, 217], [217, 114],\n [224, 223], [223, 53], [53, 224], [220, 45], [45, 134], [134, 220],\n [32, 211], [211, 140], [140, 32], [109, 67], [67, 108], [108, 109],\n [146, 43], [43, 91], [91, 146], [231, 230], [230, 120], [120, 231],\n [113, 226], [226, 247], [247, 113], [105, 63], [63, 52], [52, 105],\n [241, 238], [238, 242], [242, 241], [124, 46], [46, 156], [156, 124],\n [95, 78], [78, 96], [96, 95], [70, 46], [46, 63], [63, 70],\n [116, 143], [143, 227], [227, 116], [116, 123], [123, 111], [111, 116],\n [1, 44], [44, 19], [19, 1], [3, 236], [236, 51], [51, 3],\n [207, 216], [216, 205], [205, 207], [26, 154], [154, 22], [22, 26],\n [165, 39], [39, 167], [167, 165], [199, 200], [200, 208], [208, 199],\n [101, 36], [36, 100], [100, 101], [43, 57], [57, 202], [202, 43],\n [242, 20], [20, 99], [99, 242], [56, 28], [28, 157], [157, 56],\n [124, 35], [35, 113], [113, 124], [29, 160], [160, 27], [27, 29],\n [211, 204], [204, 210], [210, 211], [124, 113], [113, 46], [46, 124],\n [106, 43], [43, 204], [204, 106], [96, 62], [62, 77], [77, 96],\n [227, 137], [137, 116], [116, 227], [73, 41], [41, 72], [72, 73],\n [36, 203], [203, 142], [142, 36], [235, 64], [64, 240], [240, 235],\n [48, 49], [49, 64], [64, 48], [42, 41], [41, 74], [74, 42],\n [214, 212], [212, 207], [207, 214], [183, 42], [42, 184], [184, 183],\n [210, 169], [169, 211], [211, 210], [140, 170], [170, 176], [176, 140],\n [104, 105], [105, 69], [69, 104], [193, 122], [122, 168], [168, 193],\n [50, 123], [123, 187], [187, 50], [89, 96], [96, 90], [90, 89],\n [66, 65], [65, 107], [107, 66], [179, 89], [89, 180], [180, 179],\n [119, 101], [101, 120], [120, 119], [68, 63], [63, 104], [104, 68],\n [234, 93], [93, 227], [227, 234], [16, 15], [15, 85], [85, 16],\n [209, 129], [129, 49], [49, 209], [15, 14], [14, 86], [86, 15],\n [107, 55], [55, 9], [9, 107], [120, 100], [100, 121], [121, 120],\n [153, 145], [145, 22], [22, 153], [178, 88], [88, 179], [179, 178],\n [197, 6], [6, 196], [196, 197], [89, 88], [88, 96], [96, 89],\n [135, 138], [138, 136], [136, 135], [138, 215], [215, 172], [172, 138],\n [218, 115], [115, 219], [219, 218], [41, 42], [42, 81], [81, 41],\n [5, 195], [195, 51], [51, 5], [57, 43], [43, 61], [61, 57],\n [208, 171], [171, 199], [199, 208], [41, 81], [81, 38], [38, 41],\n [224, 53], [53, 225], [225, 224], [24, 144], [144, 110], [110, 24],\n [105, 52], [52, 66], [66, 105], [118, 229], [229, 117], [117, 118],\n [227, 34], [34, 234], [234, 227], [66, 107], [107, 69], [69, 66],\n [10, 109], [109, 151], [151, 10], [219, 48], [48, 235], [235, 219],\n [183, 62], [62, 191], [191, 183], [142, 129], [129, 126], [126, 142],\n [116, 111], [111, 143], [143, 116], [118, 117], [117, 50], [50, 118],\n [223, 222], [222, 52], [52, 223], [94, 19], [19, 141], [141, 94],\n [222, 221], [221, 65], [65, 222], [196, 3], [3, 197], [197, 196],\n [45, 220], [220, 44], [44, 45], [156, 70], [70, 139], [139, 156],\n [188, 122], [122, 245], [245, 188], [139, 71], [71, 162], [162, 139],\n [149, 170], [170, 150], [150, 149], [122, 188], [188, 196], [196, 122],\n [206, 216], [216, 92], [92, 206], [164, 2], [2, 167], [167, 164],\n [242, 141], [141, 241], [241, 242], [0, 164], [164, 37], [37, 0],\n [11, 72], [72, 12], [12, 11], [12, 38], [38, 13], [13, 12],\n [70, 63], [63, 71], [71, 70], [31, 226], [226, 111], [111, 31],\n [36, 101], [101, 205], [205, 36], [203, 206], [206, 165], [165, 203],\n [126, 209], [209, 217], [217, 126], [98, 165], [165, 97], [97, 98],\n [237, 220], [220, 218], [218, 237], [237, 239], [239, 241], [241, 237],\n [210, 214], [214, 169], [169, 210], [140, 171], [171, 32], [32, 140],\n [241, 125], [125, 237], [237, 241], [179, 86], [86, 178], [178, 179],\n [180, 85], [85, 179], [179, 180], [181, 84], [84, 180], [180, 181],\n [182, 83], [83, 181], [181, 182], [194, 201], [201, 182], [182, 194],\n [177, 137], [137, 132], [132, 177], [184, 76], [76, 183], [183, 184],\n [185, 61], [61, 184], [184, 185], [186, 57], [57, 185], [185, 186],\n [216, 212], [212, 186], [186, 216], [192, 214], [214, 187], [187, 192],\n [139, 34], [34, 156], [156, 139], [218, 79], [79, 237], [237, 218],\n [147, 123], [123, 177], [177, 147], [45, 44], [44, 4], [4, 45],\n [208, 201], [201, 32], [32, 208], [98, 64], [64, 129], [129, 98],\n [192, 213], [213, 138], [138, 192], [235, 59], [59, 219], [219, 235],\n [141, 242], [242, 97], [97, 141], [97, 2], [2, 141], [141, 97],\n [240, 75], [75, 235], [235, 240], [229, 24], [24, 228], [228, 229],\n [31, 25], [25, 226], [226, 31], [230, 23], [23, 229], [229, 230],\n [231, 22], [22, 230], [230, 231], [232, 26], [26, 231], [231, 232],\n [233, 112], [112, 232], [232, 233], [244, 189], [189, 243], [243, 244],\n [189, 221], [221, 190], [190, 189], [222, 28], [28, 221], [221, 222],\n [223, 27], [27, 222], [222, 223], [224, 29], [29, 223], [223, 224],\n [225, 30], [30, 224], [224, 225], [113, 247], [247, 225], [225, 113],\n [99, 60], [60, 240], [240, 99], [213, 147], [147, 215], [215, 213],\n [60, 20], [20, 166], [166, 60], [192, 187], [187, 213], [213, 192],\n [243, 112], [112, 244], [244, 243], [244, 233], [233, 245], [245, 244],\n [245, 128], [128, 188], [188, 245], [188, 114], [114, 174], [174, 188],\n [134, 131], [131, 220], [220, 134], [174, 217], [217, 236], [236, 174],\n [236, 198], [198, 134], [134, 236], [215, 177], [177, 58], [58, 215],\n [156, 143], [143, 124], [124, 156], [25, 110], [110, 7], [7, 25],\n [31, 228], [228, 25], [25, 31], [264, 356], [356, 368], [368, 264],\n [0, 11], [11, 267], [267, 0], [451, 452], [452, 349], [349, 451],\n [267, 302], [302, 269], [269, 267], [350, 357], [357, 277], [277, 350],\n [350, 452], [452, 357], [357, 350], [299, 333], [333, 297], [297, 299],\n [396, 175], [175, 377], [377, 396], [280, 347], [347, 330], [330, 280],\n [269, 303], [303, 270], [270, 269], [151, 9], [9, 337], [337, 151],\n [344, 278], [278, 360], [360, 344], [424, 418], [418, 431], [431, 424],\n [270, 304], [304, 409], [409, 270], [272, 310], [310, 407], [407, 272],\n [322, 270], [270, 410], [410, 322], [449, 450], [450, 347], [347, 449],\n [432, 422], [422, 434], [434, 432], [18, 313], [313, 17], [17, 18],\n [291, 306], [306, 375], [375, 291], [259, 387], [387, 260], [260, 259],\n [424, 335], [335, 418], [418, 424], [434, 364], [364, 416], [416, 434],\n [391, 423], [423, 327], [327, 391], [301, 251], [251, 298], [298, 301],\n [275, 281], [281, 4], [4, 275], [254, 373], [373, 253], [253, 254],\n [375, 307], [307, 321], [321, 375], [280, 425], [425, 411], [411, 280],\n [200, 421], [421, 18], [18, 200], [335, 321], [321, 406], [406, 335],\n [321, 320], [320, 405], [405, 321], [314, 315], [315, 17], [17, 314],\n [423, 426], [426, 266], [266, 423], [396, 377], [377, 369], [369, 396],\n [270, 322], [322, 269], [269, 270], [413, 417], [417, 464], [464, 413],\n [385, 386], [386, 258], [258, 385], [248, 456], [456, 419], [419, 248],\n [298, 284], [284, 333], [333, 298], [168, 417], [417, 8], [8, 168],\n [448, 346], [346, 261], [261, 448], [417, 413], [413, 285], [285, 417],\n [326, 327], [327, 328], [328, 326], [277, 355], [355, 329], [329, 277],\n [309, 392], [392, 438], [438, 309], [381, 382], [382, 256], [256, 381],\n [279, 429], [429, 360], [360, 279], [365, 364], [364, 379], [379, 365],\n [355, 277], [277, 437], [437, 355], [282, 443], [443, 283], [283, 282],\n [281, 275], [275, 363], [363, 281], [395, 431], [431, 369], [369, 395],\n [299, 297], [297, 337], [337, 299], [335, 273], [273, 321], [321, 335],\n [348, 450], [450, 349], [349, 348], [359, 446], [446, 467], [467, 359],\n [283, 293], [293, 282], [282, 283], [250, 458], [458, 462], [462, 250],\n [300, 276], [276, 383], [383, 300], [292, 308], [308, 325], [325, 292],\n [283, 276], [276, 293], [293, 283], [264, 372], [372, 447], [447, 264],\n [346, 352], [352, 340], [340, 346], [354, 274], [274, 19], [19, 354],\n [363, 456], [456, 281], [281, 363], [426, 436], [436, 425], [425, 426],\n [380, 381], [381, 252], [252, 380], [267, 269], [269, 393], [393, 267],\n [421, 200], [200, 428], [428, 421], [371, 266], [266, 329], [329, 371],\n [432, 287], [287, 422], [422, 432], [290, 250], [250, 328], [328, 290],\n [385, 258], [258, 384], [384, 385], [446, 265], [265, 342], [342, 446],\n [386, 387], [387, 257], [257, 386], [422, 424], [424, 430], [430, 422],\n [445, 342], [342, 276], [276, 445], [422, 273], [273, 424], [424, 422],\n [306, 292], [292, 307], [307, 306], [352, 366], [366, 345], [345, 352],\n [268, 271], [271, 302], [302, 268], [358, 423], [423, 371], [371, 358],\n [327, 294], [294, 460], [460, 327], [331, 279], [279, 294], [294, 331],\n [303, 271], [271, 304], [304, 303], [436, 432], [432, 427], [427, 436],\n [304, 272], [272, 408], [408, 304], [395, 394], [394, 431], [431, 395],\n [378, 395], [395, 400], [400, 378], [296, 334], [334, 299], [299, 296],\n [6, 351], [351, 168], [168, 6], [376, 352], [352, 411], [411, 376],\n [307, 325], [325, 320], [320, 307], [285, 295], [295, 336], [336, 285],\n [320, 319], [319, 404], [404, 320], [329, 330], [330, 349], [349, 329],\n [334, 293], [293, 333], [333, 334], [366, 323], [323, 447], [447, 366],\n [316, 15], [15, 315], [315, 316], [331, 358], [358, 279], [279, 331],\n [317, 14], [14, 316], [316, 317], [8, 285], [285, 9], [9, 8],\n [277, 329], [329, 350], [350, 277], [253, 374], [374, 252], [252, 253],\n [319, 318], [318, 403], [403, 319], [351, 6], [6, 419], [419, 351],\n [324, 318], [318, 325], [325, 324], [397, 367], [367, 365], [365, 397],\n [288, 435], [435, 397], [397, 288], [278, 344], [344, 439], [439, 278],\n [310, 272], [272, 311], [311, 310], [248, 195], [195, 281], [281, 248],\n [375, 273], [273, 291], [291, 375], [175, 396], [396, 199], [199, 175],\n [312, 311], [311, 268], [268, 312], [276, 283], [283, 445], [445, 276],\n [390, 373], [373, 339], [339, 390], [295, 282], [282, 296], [296, 295],\n [448, 449], [449, 346], [346, 448], [356, 264], [264, 454], [454, 356],\n [337, 336], [336, 299], [299, 337], [337, 338], [338, 151], [151, 337],\n [294, 278], [278, 455], [455, 294], [308, 292], [292, 415], [415, 308],\n [429, 358], [358, 355], [355, 429], [265, 340], [340, 372], [372, 265],\n [352, 346], [346, 280], [280, 352], [295, 442], [442, 282], [282, 295],\n [354, 19], [19, 370], [370, 354], [285, 441], [441, 295], [295, 285],\n [195, 248], [248, 197], [197, 195], [457, 440], [440, 274], [274, 457],\n [301, 300], [300, 368], [368, 301], [417, 351], [351, 465], [465, 417],\n [251, 301], [301, 389], [389, 251], [394, 395], [395, 379], [379, 394],\n [399, 412], [412, 419], [419, 399], [410, 436], [436, 322], [322, 410],\n [326, 2], [2, 393], [393, 326], [354, 370], [370, 461], [461, 354],\n [393, 164], [164, 267], [267, 393], [268, 302], [302, 12], [12, 268],\n [312, 268], [268, 13], [13, 312], [298, 293], [293, 301], [301, 298],\n [265, 446], [446, 340], [340, 265], [280, 330], [330, 425], [425, 280],\n [322, 426], [426, 391], [391, 322], [420, 429], [429, 437], [437, 420],\n [393, 391], [391, 326], [326, 393], [344, 440], [440, 438], [438, 344],\n [458, 459], [459, 461], [461, 458], [364, 434], [434, 394], [394, 364],\n [428, 396], [396, 262], [262, 428], [274, 354], [354, 457], [457, 274],\n [317, 316], [316, 402], [402, 317], [316, 315], [315, 403], [403, 316],\n [315, 314], [314, 404], [404, 315], [314, 313], [313, 405], [405, 314],\n [313, 421], [421, 406], [406, 313], [323, 366], [366, 361], [361, 323],\n [292, 306], [306, 407], [407, 292], [306, 291], [291, 408], [408, 306],\n [291, 287], [287, 409], [409, 291], [287, 432], [432, 410], [410, 287],\n [427, 434], [434, 411], [411, 427], [372, 264], [264, 383], [383, 372],\n [459, 309], [309, 457], [457, 459], [366, 352], [352, 401], [401, 366],\n [1, 274], [274, 4], [4, 1], [418, 421], [421, 262], [262, 418],\n [331, 294], [294, 358], [358, 331], [435, 433], [433, 367], [367, 435],\n [392, 289], [289, 439], [439, 392], [328, 462], [462, 326], [326, 328],\n [94, 2], [2, 370], [370, 94], [289, 305], [305, 455], [455, 289],\n [339, 254], [254, 448], [448, 339], [359, 255], [255, 446], [446, 359],\n [254, 253], [253, 449], [449, 254], [253, 252], [252, 450], [450, 253],\n [252, 256], [256, 451], [451, 252], [256, 341], [341, 452], [452, 256],\n [414, 413], [413, 463], [463, 414], [286, 441], [441, 414], [414, 286],\n [286, 258], [258, 441], [441, 286], [258, 257], [257, 442], [442, 258],\n [257, 259], [259, 443], [443, 257], [259, 260], [260, 444], [444, 259],\n [260, 467], [467, 445], [445, 260], [309, 459], [459, 250], [250, 309],\n [305, 289], [289, 290], [290, 305], [305, 290], [290, 460], [460, 305],\n [401, 376], [376, 435], [435, 401], [309, 250], [250, 392], [392, 309],\n [376, 411], [411, 433], [433, 376], [453, 341], [341, 464], [464, 453],\n [357, 453], [453, 465], [465, 357], [343, 357], [357, 412], [412, 343],\n [437, 343], [343, 399], [399, 437], [344, 360], [360, 440], [440, 344],\n [420, 437], [437, 456], [456, 420], [360, 420], [420, 363], [363, 360],\n [361, 401], [401, 288], [288, 361], [265, 372], [372, 353], [353, 265],\n [390, 339], [339, 249], [249, 390], [339, 448], [448, 255], [255, 339],\n];\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as coords from './facemeshcoords';\nimport { constants } from '../tfjs/constants';\nimport type { Box, Point } from '../result';\nimport { env } from '../util/env';\n\nexport const createBox = (startEndTensor) => ({ startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]), endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]) });\n\nexport const disposeBox = (t) => tf.dispose([t.startPoint, t.endPoint]);\n\nexport const getBoxSize = (box): [number, number] => [Math.abs(box.endPoint[0] - box.startPoint[0]), Math.abs(box.endPoint[1] - box.startPoint[1])];\n\nexport const getBoxCenter = (box): [number, number, number] => [box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2, 1];\n\nexport const clampBox = (box, input): Box => (box ? [\n Math.trunc(Math.max(0, box.startPoint[0])),\n Math.trunc(Math.max(0, box.startPoint[1])),\n Math.trunc(Math.min((input.shape[2] || 0), box.endPoint[0]) - Math.max(0, box.startPoint[0])),\n Math.trunc(Math.min((input.shape[1] || 0), box.endPoint[1]) - Math.max(0, box.startPoint[1])),\n] : [0, 0, 0, 0]);\n\nexport const getRawBox = (box, input): Box => (box ? [\n box.startPoint[0] / (input.shape[2] || 0),\n box.startPoint[1] / (input.shape[1] || 0),\n (box.endPoint[0] - box.startPoint[0]) / (input.shape[2] || 0),\n (box.endPoint[1] - box.startPoint[1]) / (input.shape[1] || 0),\n] : [0, 0, 0, 0]);\n\nexport const scaleBoxCoordinates = (box, factor) => {\n const startPoint: Point = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint: Point = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const cutAndResize = (box, image, cropSize) => {\n const h = image.shape[1];\n const w = image.shape[2];\n const cutBox = [box.startPoint[1] / h, box.startPoint[0] / w, box.endPoint[1] / h, box.endPoint[0] / w];\n const crop = tf.image.cropAndResize(image, [cutBox], [0], cropSize);\n const norm = tf.div(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n};\n\nexport const enlargeBox = (box, factor) => {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize: [number, number] = [factor * size[0] / 2, factor * size[1] / 2];\n return { startPoint: [center[0] - halfSize[0], center[1] - halfSize[1]] as Point, endPoint: [center[0] + halfSize[0], center[1] + halfSize[1]] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const squarifyBox = (box) => {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const halfSize = Math.max(...size) / 2;\n return { startPoint: [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)] as Point, endPoint: [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)] as Point, landmarks: box.landmarks, confidence: box.confidence };\n};\n\nexport const calculateLandmarksBoundingBox = (landmarks) => {\n const x = landmarks.map((d) => d[0]);\n const y = landmarks.map((d) => d[1]);\n return { startPoint: [Math.min(...x), Math.min(...y)] as Point, endPoint: [Math.max(...x), Math.max(...y)] as Point, landmarks };\n};\n\nexport const fixedRotationMatrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n\nexport const normalizeRadians = (angle) => angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n\nexport const computeRotation = (point1, point2) => normalizeRadians(Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]));\n\nexport const radToDegrees = (rad) => rad * 180 / Math.PI;\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport const dot = (v1: number[], v2: number[]) => {\n let product = 0;\n for (let i = 0; i < v1.length; i++) product += v1[i] * v2[i];\n return product;\n};\n\nexport const getColumnFrom2DArr = (arr, columnIndex) => {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) column.push(arr[i][columnIndex]);\n return column;\n};\n\nexport const multiplyTransformMatrices = (mat1, mat2) => {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n return product;\n};\n\nexport const buildRotationMatrix = (rotation, center) => {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n};\n\nexport const invertTransformMatrix = (matrix) => {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [-dot(rotationComponent[0], translationComponent), -dot(rotationComponent[1], translationComponent)];\n return [rotationComponent[0].concat(invertedTranslation[0]), rotationComponent[1].concat(invertedTranslation[1]), [0, 0, 1]];\n};\n\nexport const rotatePoint = (homogeneousCoordinate, rotationMatrix) => [dot(homogeneousCoordinate, rotationMatrix[0]), dot(homogeneousCoordinate, rotationMatrix[1])];\n\nexport const xyDistanceBetweenPoints = (a, b) => Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n\nexport function generateAnchors(inputSize) {\n const spec = inputSize === 192\n ? { strides: [4], anchors: [1] } // facemesh-detector\n : { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] }; // blazeface\n const anchors: Array<[number, number]> = [];\n for (let i = 0; i < spec.strides.length; i++) {\n const stride = spec.strides[i];\n const gridRows = Math.floor((inputSize + stride - 1) / stride);\n const gridCols = Math.floor((inputSize + stride - 1) / stride);\n const anchorsNum = spec.anchors[i];\n for (let gridY = 0; gridY < gridRows; gridY++) {\n const anchorY = stride * (gridY + 0.5);\n for (let gridX = 0; gridX < gridCols; gridX++) {\n const anchorX = stride * (gridX + 0.5);\n for (let n = 0; n < anchorsNum; n++) anchors.push([anchorX, anchorY]);\n }\n }\n }\n return anchors;\n}\n\nexport function transformRawCoords(coordsRaw, box, angle, rotationMatrix, inputSize) {\n const boxSize = getBoxSize(box);\n const coordsScaled = coordsRaw.map((coord) => ([ // scaled around zero-point\n (boxSize[0] / inputSize) * (coord[0] - (inputSize / 2)),\n (boxSize[1] / inputSize) * (coord[1] - (inputSize / 2)),\n (coord[2] || 0),\n ]));\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n const coordsRotationMatrix = largeAngle ? buildRotationMatrix(angle, [0, 0]) : fixedRotationMatrix;\n const coordsRotated = largeAngle ? coordsScaled.map((coord) => ([...rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = largeAngle ? invertTransformMatrix(rotationMatrix) : fixedRotationMatrix;\n const boxCenter = getBoxCenter(box);\n const offsets = [dot(boxCenter, inverseRotationMatrix[0]), dot(boxCenter, inverseRotationMatrix[1])];\n return coordsRotated.map((coord) => ([\n Math.trunc(coord[0] + offsets[0]),\n Math.trunc(coord[1] + offsets[1]),\n Math.trunc(coord[2] || 0),\n ]));\n}\n\nexport function correctFaceRotation(rotate, box, input, inputSize) {\n const symmetryLine = (box.landmarks.length >= coords.meshLandmarks.count)\n ? coords.meshLandmarks.symmetryLine\n : coords.blazeFaceLandmarks.symmetryLine;\n let angle = 0; // default\n let rotationMatrix = fixedRotationMatrix; // default\n let face; // default\n\n if (rotate && env.kernels.includes('rotatewithoffset')) { // rotateWithOffset is not defined for tfjs-node\n angle = computeRotation(box.landmarks[symmetryLine[0]], box.landmarks[symmetryLine[1]]);\n const largeAngle = angle && (angle !== 0) && (Math.abs(angle) > 0.2);\n if (largeAngle) { // perform rotation only if angle is sufficiently high\n const center: Point = getBoxCenter(box);\n const centerRaw: Point = [center[0] / input.shape[2], center[1] / input.shape[1]];\n const rotated = tf.image.rotateWithOffset(input, angle, 0, centerRaw);\n rotationMatrix = buildRotationMatrix(-angle, center);\n face = cutAndResize(box, rotated, [inputSize, inputSize]);\n tf.dispose(rotated);\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n } else {\n face = cutAndResize(box, input, [inputSize, inputSize]);\n }\n return [angle, rotationMatrix, face];\n}\n\nexport const findFaceCenter = (mesh) => {\n const x = mesh.map((m) => m[0]);\n const y = mesh.map((m) => m[1]);\n // weighted center\n /*\n const sum = (arr: number[]) => arr.reduce((prev, curr) => prev + curr, 0);\n return [sum(x) / mesh.length, sum(y) / mesh.length];\n */\n // absolute center\n return [Math.min(...x) + (Math.max(...x) - Math.min(...x)) / 2, Math.min(...y) + (Math.max(...y) - Math.min(...y)) / 2];\n};\n\nexport const calculateFaceBox = (mesh, previousBox) => {\n const center = findFaceCenter(mesh);\n const boxSize = getBoxSize(previousBox);\n const calculatedBox = {\n startPoint: [center[0] - boxSize[0] / 2, center[1] - boxSize[1] / 2] as Point,\n endPoint: [center[0] + boxSize[0] / 2, center[1] + boxSize[1] / 2] as Point,\n };\n return calculatedBox;\n};\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n * See `facemesh.ts` for entry point\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './facemeshutil';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Config } from '../config';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport type { Point } from '../result';\n\nconst keypointsCount = 6;\nconst faceBoxScaleFactor = 1.4;\nlet model: GraphModel | null;\nlet anchors: Tensor | null = null;\nlet inputSize = 0;\nlet inputSizeT: Tensor | null = null;\n\ntype DetectBox = { startPoint: Point, endPoint: Point, landmarks: Array, confidence: number };\n\nexport const size = () => inputSize;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.detector?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n inputSizeT = tf.scalar(inputSize, 'int32') as Tensor;\n anchors = tf.tensor2d(util.generateAnchors(inputSize)) as Tensor;\n return model;\n}\n\nfunction decodeBoxes(boxOutputs: Tensor) {\n const t: Record = {};\n t.boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n t.centers = tf.add(t.boxStarts, anchors);\n t.boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n t.boxSizesNormalized = tf.div(t.boxSizes, inputSizeT);\n t.centersNormalized = tf.div(t.centers, inputSizeT);\n t.halfBoxSize = tf.div(t.boxSizesNormalized, constants.tf2);\n t.starts = tf.sub(t.centersNormalized, t.halfBoxSize);\n t.ends = tf.add(t.centersNormalized, t.halfBoxSize);\n t.startNormalized = tf.mul(t.starts, inputSizeT);\n t.endNormalized = tf.mul(t.ends, inputSizeT);\n const boxes = tf.concat2d([t.startNormalized, t.endNormalized], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n\nexport async function getBoxes(inputImage: Tensor, config: Config) {\n // sanity check on input\n if ((!inputImage) || (inputImage['isDisposedInternal']) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return [];\n const t: Record = {};\n t.resized = tf.image.resizeBilinear(inputImage, [inputSize, inputSize]);\n t.div = tf.div(t.resized, constants.tf127);\n t.normalized = tf.sub(t.div, constants.tf05);\n const res = model?.execute(t.normalized) as Tensor[];\n if (Array.isArray(res) && res.length > 2) { // pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n t.concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n t.concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n t.concat = tf.concat([t.concat512, t.concat384], 1);\n t.batch = tf.squeeze(t.concat, 0);\n } else if (Array.isArray(res)) { // new facemesh-detection tfhub model\n t.batch = tf.squeeze(res[0]);\n } else { // original blazeface tfhub model\n t.batch = tf.squeeze(res);\n }\n tf.dispose(res);\n t.boxes = decodeBoxes(t.batch);\n t.logits = tf.slice(t.batch, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.logits);\n t.scores = tf.squeeze(t.sigmoid);\n t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, (config.face.detector?.maxDetected || 0), (config.face.detector?.iouThreshold || 0), (config.face.detector?.minConfidence || 0));\n const nms = await t.nms.array() as number[];\n const boxes: Array = [];\n const scores = await t.scores.data();\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > (config.face.detector?.minConfidence || 0)) {\n const b: Record = {};\n b.bbox = tf.slice(t.boxes, [nms[i], 0], [1, -1]);\n b.slice = tf.slice(t.batch, [nms[i], keypointsCount - 1], [1, -1]);\n b.squeeze = tf.squeeze(b.slice);\n b.landmarks = tf.reshape(b.squeeze, [keypointsCount, -1]);\n const points = await b.bbox.data();\n const rawBox = {\n startPoint: [points[0], points[1]] as Point,\n endPoint: [points[2], points[3]] as Point,\n landmarks: (await b.landmarks.array()) as Point[],\n confidence,\n };\n const scaledBox = util.scaleBoxCoordinates(rawBox, [(inputImage.shape[2] || 0) / inputSize, (inputImage.shape[1] || 0) / inputSize]);\n const enlargedBox = util.enlargeBox(scaledBox, config.face['scale'] || faceBoxScaleFactor);\n const squaredBox = util.squarifyBox(enlargedBox);\n boxes.push(squaredBox);\n Object.keys(b).forEach((tensor) => tf.dispose(b[tensor]));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n", "/* eslint-disable no-multi-spaces */\n\nexport const kpt: Array = [\n 'nose', // 0\n 'leftEyeInside', // 1\n 'leftEye', // 2\n 'leftEyeOutside', // 3\n 'rightEyeInside', // 4\n 'rightEye', // 5\n 'rightEyeOutside', // 6\n 'leftEar', // 7\n 'rightEar', // 8\n 'leftMouth', // 9\n 'rightMouth', // 10\n 'leftShoulder', // 11\n 'rightShoulder', // 12\n 'leftElbow', // 13\n 'rightElbow', // 14\n 'leftWrist', // 15\n 'rightWrist', // 16\n 'leftPinky', // 17\n 'rightPinky', // 18\n 'leftIndex', // 19\n 'rightIndex', // 20\n 'leftThumb', // 21\n 'rightThumb', // 22\n 'leftHip', // 23\n 'rightHip', // 24\n 'leftKnee', // 25\n 'rightKnee', // 26\n 'leftAnkle', // 27\n 'rightAnkle', // 28\n 'leftHeel', // 29\n 'rightHeel', // 30\n 'leftFoot', // 31\n 'rightFoot', // 32\n 'bodyCenter', // 33\n 'bodyTop', // 34\n 'leftPalm', // 35 // z-coord not ok\n 'leftHand', // 36 // similar to wrist but z-coord not ok\n 'rightPalm', // 37 // z-coord not ok\n 'rightHand', // 38 // similar to wrist but z-coord not ok\n];\n\nexport const connected: Record = {\n shoulders: ['leftShoulder', 'rightShoulder'],\n hips: ['rightHip', 'leftHip'],\n mouth: ['leftMouth', 'rightMouth'],\n leftLegUpper: ['leftHip', 'leftKnee'],\n leftLegLower: ['leftKnee', 'leftAnkle'],\n leftFoot: ['leftAnkle', 'leftHeel', 'leftFoot'],\n leftTorso: ['leftShoulder', 'leftHip'],\n leftArmUpper: ['leftShoulder', 'leftElbow'],\n leftArmLower: ['leftElbow', 'leftWrist'],\n leftHand: ['leftWrist', 'leftPalm'],\n leftHandPinky: ['leftPalm', 'leftPinky'],\n leftHandIndex: ['leftPalm', 'leftIndex'],\n leftHandThumb: ['leftPalm', 'leftThumb'],\n leftEyeOutline: ['leftEyeInside', 'leftEyeOutside'],\n rightLegUpper: ['rightHip', 'rightKnee'],\n rightLegLower: ['rightKnee', 'rightAnkle'],\n rightFoot: ['rightAnkle', 'rightHeel', 'rightFoot'],\n rightTorso: ['rightShoulder', 'rightHip'],\n rightArmUpper: ['rightShoulder', 'rightElbow'],\n rightArmLower: ['rightElbow', 'rightWrist'],\n rightHand: ['rightWrist', 'rightPalm'],\n rightHandPinky: ['rightPalm', 'rightPinky'],\n rightHandIndex: ['rightPalm', 'rightIndex'],\n rightHandThumb: ['rightPalm', 'rightThumb'],\n rightEyeOutline: ['rightEyeInside', 'rightEyeOutside'],\n};\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../tfjs/types';\nimport type { Box } from '../result';\nimport type { Config } from '../config';\n\ninterface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nconst inputSize = 224;\nlet anchorTensor: { x, y };\nconst numLayers = 5;\nconst strides = [8, 16, 32, 32, 32];\n\nexport async function createAnchors() {\n const anchors: Array<{ x: number, y: number }> = [];\n let layerId = 0;\n while (layerId < numLayers) {\n let anchorCount = 0;\n let lastSameStrideLayer = layerId;\n while (lastSameStrideLayer < strides.length && strides[lastSameStrideLayer] === strides[layerId]) {\n anchorCount += 2;\n lastSameStrideLayer++;\n }\n const stride = strides[layerId];\n const featureMapHeight = Math.ceil(inputSize / stride);\n const featureMapWidth = Math.ceil(inputSize / stride);\n for (let y = 0; y < featureMapHeight; ++y) {\n for (let x = 0; x < featureMapWidth; ++x) {\n for (let anchorId = 0; anchorId < anchorCount; ++anchorId) {\n anchors.push({ x: (x + 0.5) / featureMapWidth, y: (y + 0.5) / featureMapHeight });\n }\n }\n }\n layerId = lastSameStrideLayer;\n }\n anchorTensor = { x: tf.tensor1d(anchors.map((a) => a.x)), y: tf.tensor1d(anchors.map((a) => a.y)) };\n}\n\nconst cropFactor = [5.0, 5.0];\nfunction decodeBoxes(boxesTensor, anchor): Tensor {\n return tf.tidy(() => {\n const split = tf.split(boxesTensor, 12, 1); // first 4 are box data [x,y,w,h] and 4 are keypoints data [x,y] for total of 12\n let xCenter = tf.squeeze(split[0]);\n let yCenter = tf.squeeze(split[1]);\n let width = tf.squeeze(split[2]);\n let height = tf.squeeze(split[3]);\n xCenter = tf.add(tf.div(xCenter, inputSize), anchor.x);\n yCenter = tf.add(tf.div(yCenter, inputSize), anchor.y);\n width = tf.mul(tf.div(width, inputSize), cropFactor[0]);\n height = tf.mul(tf.div(height, inputSize), cropFactor[1]);\n const xMin = tf.sub(xCenter, tf.div(width, 2));\n const yMin = tf.sub(yCenter, tf.div(height, 2));\n const boxes = tf.stack([xMin, yMin, width, height], 1);\n return boxes;\n });\n}\n\nexport async function decode(boxesTensor: Tensor, logitsTensor: Tensor, config: Config, outputSize: [number, number]): Promise {\n const t: Record = {};\n t.boxes = decodeBoxes(boxesTensor, anchorTensor);\n t.scores = tf.sigmoid(logitsTensor);\n t.argmax = tf.argMax(t.scores);\n const i = (await t.argmax.data())[0] as number;\n const scores = await t.scores.data();\n const detected: Array<{ box: Box, boxRaw: Box, score: number }> = [];\n const minScore = (config.body['detector'] && config.body['detector']['minConfidence']) ? config.body['detector']['minConfidence'] : 0;\n if (scores[i] >= minScore) {\n const boxes = await t.boxes.array();\n const boxRaw: Box = boxes[i];\n const box: Box = [boxRaw[0] * outputSize[0], boxRaw[1] * outputSize[1], boxRaw[2] * outputSize[0], boxRaw[3] * outputSize[1]];\n // console.log(box);\n detected.push({ box, boxRaw, score: scores[i] });\n }\n /*\n t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, 1, config.body.detector?.minConfidence || 0.1, config.body.detector?.iouThreshold || 0.1);\n const boxes = t.boxes.arraySync();\n const scores = t.scores.dataSync();\n const nms = t.nms.dataSync();\n const detected: Array = [];\n for (const i of Array.from(nms)) {\n const boxRaw: Box = boxes[i];\n const box: Box = [boxRaw[0] * outputSize[0], boxRaw[0] * outputSize[1], boxRaw[3] * outputSize[0], boxRaw[2] * outputSize[1]];\n detected.push({ box, boxRaw, score: scores[i] });\n }\n */\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return detected;\n}\n", "import type { Point, Box } from '../result';\n\nexport function calc(keypoints: Array, outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const box: Box = [min[0], min[1], max[0] - min[0], max[1] - min[1]];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function square(keypoints: Array, outputSize: [number, number] = [1, 1]) {\n const coords = [keypoints.map((pt) => pt[0]), keypoints.map((pt) => pt[1])]; // all x/y coords\n const min = [Math.min(...coords[0]), Math.min(...coords[1])];\n const max = [Math.max(...coords[0]), Math.max(...coords[1])];\n const center = [(min[0] + max[0]) / 2, (min[1] + max[1]) / 2]; // find center x and y coord of all fingers\n const dist = Math.max(center[0] - min[0], center[1] - min[1], -center[0] + max[0], -center[1] + max[1]); // largest distance from center in any direction\n const box: Box = [Math.trunc(center[0] - dist), Math.trunc(center[1] - dist), Math.trunc(2 * dist), Math.trunc(2 * dist)];\n const boxRaw: Box = [box[0] / outputSize[0], box[1] / outputSize[1], box[2] / outputSize[0], box[3] / outputSize[1]];\n return { box, boxRaw };\n}\n\nexport function scale(box: Box, scaleFact: number) {\n const dist = [box[2] * scaleFact, box[3] * scaleFact];\n const newBox: Box = [\n box[0] - (dist[0] - box[2]) / 2,\n box[1] - (dist[1] - box[3]) / 2,\n dist[0],\n dist[1],\n ];\n return newBox;\n}\n\nexport function crop(box: Box) { // [y1, x1, y2, x2] clamped to 0..1\n const yxBox: Box = [Math.max(0, box[1]), Math.max(0, box[0]), Math.min(1, box[3] + box[1]), Math.min(1, box[2] + box[0])];\n return yxBox;\n}\n", "/**\n * BlazePose model implementation\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { log, now } from '../util/util';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, Box, Point, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport * as coords from './blazeposecoords';\nimport * as detect from './blazeposedetector';\nimport * as box from '../util/box';\n\nconst env = { initial: true };\n// const models: [GraphModel | null, GraphModel | null] = [null, null];\nconst models: { detector: GraphModel | null, landmarks: GraphModel | null } = { detector: null, landmarks: null };\nconst inputSize: { detector: [number, number], landmarks: [number, number] } = { detector: [224, 224], landmarks: [256, 256] };\nlet skipped = Number.MAX_SAFE_INTEGER;\nconst outputNodes: { detector: string[], landmarks: string[] } = {\n landmarks: ['ld_3d', 'activation_segmentation', 'activation_heatmap', 'world_3d', 'output_poseflag'],\n detector: [],\n};\n\nlet cache: BodyResult | null = null;\nlet cropBox: Box | undefined;\nlet padding: [number, number][] = [[0, 0], [0, 0], [0, 0], [0, 0]];\nlet lastTime = 0;\n\nconst sigmoid = (x) => (1 - (1 / (1 + Math.exp(x))));\n\nexport async function loadDetect(config: Config): Promise {\n if (env.initial) models.detector = null;\n if (!models.detector && config.body['detector'] && config.body['detector']['modelPath'] || '') {\n models.detector = await loadModel(config.body['detector']['modelPath']);\n const inputs = Object.values(models.detector.modelSignature['inputs']);\n inputSize.detector[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize.detector[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug && models.detector) log('cached model:', models.detector['modelUrl']);\n await detect.createAnchors();\n return models.detector as GraphModel;\n}\n\nexport async function loadPose(config: Config): Promise {\n if (env.initial) models.landmarks = null;\n if (!models.landmarks) {\n models.landmarks = await loadModel(config.body.modelPath);\n const inputs = Object.values(models.landmarks.modelSignature['inputs']);\n inputSize.landmarks[0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize.landmarks[1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models.landmarks['modelUrl']);\n return models.landmarks;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models.detector) await loadDetect(config);\n if (!models.landmarks) await loadPose(config);\n return [models.detector, models.landmarks];\n}\n\nasync function prepareImage(input: Tensor, size: number): Promise {\n const t: Record = {};\n if (!input.shape || !input.shape[1] || !input.shape[2]) return input;\n let final: Tensor;\n if (cropBox) {\n t.cropped = tf.image.cropAndResize(input, [cropBox], [0], [input.shape[1], input.shape[2]]); // if we have cached box use it to crop input\n }\n if (input.shape[1] !== input.shape[2]) { // only pad if width different than height\n const height: [number, number] = [\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0,\n ];\n const width: [number, number] = [\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0,\n ];\n padding = [\n [0, 0], // dont touch batch\n height, // height before&after\n width, // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(t.cropped || input, padding); // use cropped box if it exists\n t.resize = tf.image.resizeBilinear(t.pad, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else if (input.shape[1] !== size) { // if input needs resizing\n t.resize = tf.image.resizeBilinear(t.cropped || input, [size, size]);\n final = tf.div(t.resize, constants.tf255);\n } else { // if input is already in a correct resolution just normalize it\n final = tf.div(t.cropped || input, constants.tf255);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nfunction rescaleKeypoints(keypoints: Array, outputSize: [number, number]): Array {\n for (const kpt of keypoints) { // first rescale due to padding\n kpt.position = [\n Math.trunc(kpt.position[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0] - padding[2][0]),\n Math.trunc(kpt.position[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1] - padding[1][0]),\n kpt.position[2] as number,\n ];\n kpt.positionRaw = [kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1], 2 * (kpt.position[2] as number) / (outputSize[0] + outputSize[1])];\n }\n if (cropBox) { // second rescale due to cropping\n for (const kpt of keypoints) {\n kpt.positionRaw = [\n kpt.positionRaw[0] + cropBox[1], // correct offset due to crop\n kpt.positionRaw[1] + cropBox[0], // correct offset due to crop\n kpt.positionRaw[2] as number,\n ];\n kpt.position = [\n Math.trunc(kpt.positionRaw[0] * outputSize[0]),\n Math.trunc(kpt.positionRaw[1] * outputSize[1]),\n kpt.positionRaw[2] as number,\n ];\n }\n }\n return keypoints;\n}\n\nasync function fixKeypoints(keypoints: Array) {\n // palm z-coord is incorrect around near-zero so we approximate it\n const leftPalm = keypoints.find((k) => k.part === 'leftPalm') as BodyKeypoint;\n const leftWrist = keypoints.find((k) => k.part === 'leftWrist') as BodyKeypoint;\n const leftIndex = keypoints.find((k) => k.part === 'leftIndex') as BodyKeypoint;\n leftPalm.position[2] = ((leftWrist.position[2] || 0) + (leftIndex.position[2] || 0)) / 2;\n const rightPalm = keypoints.find((k) => k.part === 'rightPalm') as BodyKeypoint;\n const rightWrist = keypoints.find((k) => k.part === 'rightWrist') as BodyKeypoint;\n const rightIndex = keypoints.find((k) => k.part === 'rightIndex') as BodyKeypoint;\n rightPalm.position[2] = ((rightWrist.position[2] || 0) + (rightIndex.position[2] || 0)) / 2;\n}\n\nasync function detectLandmarks(input: Tensor, config: Config, outputSize: [number, number]): Promise {\n /**\n * t.ld: 39 keypoints [x,y,z,score,presence] normalized to input size\n * t.segmentation:\n * t.heatmap:\n * t.world: 39 keypoints [x,y,z] normalized to -1..1\n * t.poseflag: body score\n */\n const t: Record = {};\n [t.ld/* 1,195(39*5) */, t.segmentation/* 1,256,256,1 */, t.heatmap/* 1,64,64,39 */, t.world/* 1,117(39*3) */, t.poseflag/* 1,1 */] = models.landmarks?.execute(input, outputNodes.landmarks) as Tensor[]; // run model\n const poseScore = (await t.poseflag.data())[0];\n const points = await t.ld.data();\n const distances = await t.world.data();\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor])); // dont need tensors after this\n const keypointsRelative: Array = [];\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n const score = sigmoid(points[depth * i + 3]);\n const presence = sigmoid(points[depth * i + 4]);\n const adjScore = Math.trunc(100 * score * presence * poseScore) / 100;\n const positionRaw: Point = [points[depth * i + 0] / inputSize.landmarks[0], points[depth * i + 1] / inputSize.landmarks[1], points[depth * i + 2] + 0];\n const position: Point = [Math.trunc(outputSize[0] * positionRaw[0]), Math.trunc(outputSize[1] * positionRaw[1]), positionRaw[2] as number];\n const distance: Point = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0];\n keypointsRelative.push({ part: coords.kpt[i] as BodyLandmark, positionRaw, position, distance, score: adjScore });\n }\n if (poseScore < (config.body.minConfidence || 0)) return null;\n fixKeypoints(keypointsRelative);\n const keypoints: Array = rescaleKeypoints(keypointsRelative, outputSize); // keypoints were relative to input image which is padded\n const kpts = keypoints.map((k) => k.position);\n const boxes = box.calc(kpts, [outputSize[0], outputSize[1]]); // now find boxes based on rescaled keypoints\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body = { id: 0, score: Math.trunc(100 * poseScore) / 100, box: boxes.box, boxRaw: boxes.boxRaw, keypoints, annotations };\n return body;\n}\n\n/*\ninterface DetectedBox { box: Box, boxRaw: Box, score: number }\n\nfunction rescaleBoxes(boxes: Array, outputSize: [number, number]): Array {\n for (const b of boxes) {\n b.box = [\n Math.trunc(b.box[0] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),\n Math.trunc(b.box[1] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),\n Math.trunc(b.box[2] * (outputSize[0] + padding[2][0] + padding[2][1]) / outputSize[0]),\n Math.trunc(b.box[3] * (outputSize[1] + padding[1][0] + padding[1][1]) / outputSize[1]),\n ];\n b.boxRaw = [b.box[0] / outputSize[0], b.box[1] / outputSize[1], b.box[2] / outputSize[0], b.box[3] / outputSize[1]];\n }\n return boxes;\n}\n\nasync function detectBoxes(input: Tensor, config: Config, outputSize: [number, number]) {\n const t: Record = {};\n t.res = models.detector?.execute(input, ['Identity']) as Tensor; //\n t.logitsRaw = tf.slice(t.res, [0, 0, 0], [1, -1, 1]);\n t.boxesRaw = tf.slice(t.res, [0, 0, 1], [1, -1, -1]);\n t.logits = tf.squeeze(t.logitsRaw);\n t.boxes = tf.squeeze(t.boxesRaw);\n const boxes = await detect.decode(t.boxes, t.logits, config, outputSize);\n rescaleBoxes(boxes, outputSize);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return boxes;\n}\n*/\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const outputSize: [number, number] = [input.shape[2] || 0, input.shape[1] || 0];\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && cache !== null) {\n skipped++;\n } else {\n const t: Record = {};\n /*\n if (config.body['detector'] && config.body['detector']['enabled']) {\n t.detector = await prepareImage(input, 224);\n const boxes = await detectBoxes(t.detector, config, outputSize);\n }\n */\n t.landmarks = await prepareImage(input, 256); // padded and resized\n cache = await detectLandmarks(t.landmarks, config, outputSize);\n /*\n cropBox = [0, 0, 1, 1]; // reset crop coordinates\n if (cache?.boxRaw && config.skipAllowed) {\n const cx = (2.0 * cache.boxRaw[0] + cache.boxRaw[2]) / 2;\n const cy = (2.0 * cache.boxRaw[1] + cache.boxRaw[3]) / 2;\n let size = cache.boxRaw[2] > cache.boxRaw[3] ? cache.boxRaw[2] : cache.boxRaw[3];\n size = (size * 1.0) / 2; // enlarge and half it\n if (cx > 0.1 && cx < 0.9 && cy > 0.1 && cy < 0.9 && size > 0.1) { // only update if box is sane\n const y = 0; // cy - size;\n const x = cx - size;\n cropBox = [y, x, y + 1, x + 1]; // [y0,x0,y1,x1] used for cropping but width/height are not yet implemented so we only reposition image to center of body\n }\n }\n */\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n lastTime = now();\n skipped = 0;\n }\n return cache ? [cache] : [];\n}\n", "/**\n * CoCo Labels used by object detection implementations\n */\nexport const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "/**\n * CenterNet object detection model implementation\n *\n * Based on: [**NanoDet**](https://github.com/RangiLyu/nanodet)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet last: ObjectResult[] = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n // fakeOps(['floormod'], config);\n model = await loadModel(config.object.modelPath);\n const inputs = Object.values(model.modelSignature['inputs']);\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor | null, outputShape: [number, number], config: Config) {\n if (!res) return [];\n const t: Record = {};\n const results: Array = [];\n const detections = await res.array() as number[][][];\n t.squeeze = tf.squeeze(res);\n const arr = tf.split(t.squeeze, 6, 1) as Tensor[]; // x1, y1, x2, y2, score, class\n t.stack = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n t.boxes = tf.squeeze(t.stack);\n t.scores = tf.squeeze(arr[4]);\n t.classes = tf.squeeze(arr[5]);\n tf.dispose([res, ...arr]);\n t.nms = tf.image.nonMaxSuppression(t.boxes, t.scores, config.object.maxDetected, config.object.iouThreshold, (config.object.minConfidence || 0));\n const nms = await t.nms.data();\n let i = 0;\n for (const id of Array.from(nms)) {\n const score = Math.trunc(100 * detections[0][id][4]) / 100;\n const classVal = detections[0][id][5];\n const label = labels[classVal].label as ObjectType;\n const [x, y] = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n ];\n const boxRaw: Box = [\n x,\n y,\n detections[0][id][2] / inputSize - x,\n detections[0][id][3] / inputSize - y,\n ];\n const box: Box = [\n Math.trunc(boxRaw[0] * outputShape[0]),\n Math.trunc(boxRaw[1] * outputShape[1]),\n Math.trunc(boxRaw[2] * outputShape[0]),\n Math.trunc(boxRaw[3] * outputShape[1]),\n ];\n results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [input.shape[2] || 0, input.shape[1] || 0] as [number, number];\n const resize = tf.image.resizeBilinear(input, [inputSize, inputSize]);\n const objectT = config.object.enabled ? model?.execute(resize, ['tower_0/detections']) as Tensor : null;\n lastTime = now();\n tf.dispose(resize);\n\n const obj = await process(objectT, outputSize, config);\n last = obj;\n\n resolve(obj);\n });\n}\n", "export const kpt: Array = [\n 'head',\n 'neck',\n 'rightShoulder',\n 'rightElbow',\n 'rightWrist',\n 'chest',\n 'leftShoulder',\n 'leftElbow',\n 'leftWrist',\n 'bodyCenter',\n 'rightHip',\n 'rightKnee',\n 'rightAnkle',\n 'leftHip',\n 'leftKnee',\n 'leftAnkle',\n];\n\nexport const connected: Record = {\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "/**\n * EfficientPose model implementation\n *\n * Based on: [**EfficientPose**](https://github.com/daniegr/EfficientPose)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport * as coords from './efficientposecoords';\nimport { constants } from '../tfjs/constants';\nimport type { BodyResult, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet lastTime = 0;\nconst cache: BodyResult = { id: 0, keypoints: [], box: [0, 0, 0, 0], boxRaw: [0, 0, 0, 0], score: 0, annotations: {} as Record };\n\n// const keypoints: Array = [];\n// let box: Box = [0, 0, 0, 0];\n// let boxRaw: Box = [0, 0, 0, 0];\n// let score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n// performs argmax and max functions on a 2d tensor\nasync function max2d(inputs, minScore): Promise<[number, number, number]> {\n const [width, height] = inputs.shape;\n const reshaped = tf.reshape(inputs, [height * width]); // combine all data\n const max = tf.max(reshaped, 0);\n const newScore: number = (await max.data())[0]; // get highest score\n if (newScore > minScore) { // skip coordinate calculation is score is too low\n const coordinates = tf.argMax(reshaped, 0);\n const mod = tf.mod(coordinates, width);\n const x = (await mod.data())[0];\n const div = tf.div(coordinates, width);\n const y: number = (await div.data())[0];\n tf.dispose([reshaped, max, coordinates, mod, div]);\n return [x, y, newScore];\n } else {\n tf.dispose([reshaped, max]);\n return [0, 0, newScore];\n }\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n const skipTime = (config.body.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && Object.keys(cache.keypoints).length > 0) {\n skipped++;\n return [cache];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const tensor = tf.tidy(() => {\n if (!model?.inputs[0].shape) return null;\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const enhance = tf.mul(resize, constants.tf2);\n const norm = tf.sub(enhance, constants.tf1);\n return norm;\n });\n let resT;\n if (config.body.enabled) resT = model?.execute(tensor);\n lastTime = now();\n tf.dispose(tensor);\n\n if (resT) {\n cache.keypoints.length = 0;\n const squeeze = tf.squeeze(resT);\n tf.dispose(resT);\n // body parts are basically just a stack of 2d tensors\n const stack = tf.unstack(squeeze, 2);\n tf.dispose(squeeze);\n\n // process each unstacked tensor as a separate body part\n for (let id = 0; id < stack.length; id++) {\n // actual processing to get coordinates and score\n const [x, y, partScore] = await max2d(stack[id], config.body.minConfidence);\n if (partScore > (config.body?.minConfidence || 0)) {\n cache.keypoints.push({\n score: Math.round(100 * partScore) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw: [ // normalized to 0..1\n // @ts-ignore model is not undefined here\n x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],\n ],\n position: [ // normalized to input image size\n // @ts-ignore model is not undefined here\n Math.round(image.shape[2] * x / model.inputs[0].shape[2]), Math.round(image.shape[1] * y / model.inputs[0].shape[1]),\n ],\n });\n }\n }\n stack.forEach((s) => tf.dispose(s));\n }\n cache.score = cache.keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const x = cache.keypoints.map((a) => a.position[0]);\n const y = cache.keypoints.map((a) => a.position[1]);\n cache.box = [\n Math.min(...x),\n Math.min(...y),\n Math.max(...x) - Math.min(...x),\n Math.max(...y) - Math.min(...y),\n ];\n const xRaw = cache.keypoints.map((a) => a.positionRaw[0]);\n const yRaw = cache.keypoints.map((a) => a.positionRaw[1]);\n cache.boxRaw = [\n Math.min(...xRaw),\n Math.min(...yRaw),\n Math.max(...xRaw) - Math.min(...xRaw),\n Math.max(...yRaw) - Math.min(...yRaw),\n ];\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = cache.keypoints.find((kpt) => kpt.part === indexes[i]);\n const pt1 = cache.keypoints.find((kpt) => kpt.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n cache.annotations[name] = pt;\n }\n resolve([cache]);\n });\n}\n", "/**\n * Emotion model implementation\n *\n * [**Oarriaga**](https://github.com/oarriaga/face_classification)\n */\n\nimport type { Emotion } from '../result';\nimport { log, now } from '../util/util';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { env } from '../util/env';\nimport { constants } from '../tfjs/constants';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model: GraphModel | null;\nconst last: Array> = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.emotion?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise> {\n if (!model) return [];\n const skipFrame = skipped < (config.face.emotion?.skipFrames || 0);\n const skipTime = (config.face.emotion?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const obj: Array<{ score: number, emotion: Emotion }> = [];\n if (config.face.emotion?.enabled) {\n const t: Record = {};\n const inputSize = model?.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n t.resize = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n // const box = [[0.15, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const resize = tf.image.cropAndResize(image, box, [0], [inputSize, inputSize]);\n // [t.red, t.green, t.blue] = tf.split(t.resize, 3, 3);\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n // t.redNorm = tf.mul(t.red, rgb[0]);\n // t.greenNorm = tf.mul(t.green, rgb[1]);\n // t.blueNorm = tf.mul(t.blue, rgb[2]);\n // t.grayscale = tf.addN([t.redNorm, t.greenNorm, t.blueNorm]);\n t.channels = tf.mul(t.resize, constants.rgb);\n t.grayscale = tf.sum(t.channels, 3, true);\n t.grayscaleSub = tf.sub(t.grayscale, constants.tf05);\n t.grayscaleMul = tf.mul(t.grayscaleSub, constants.tf2);\n t.emotion = model?.execute(t.grayscaleMul) as Tensor; // result is already in range 0..1, no need for additional activation\n lastTime = now();\n const data = await t.emotion.data();\n for (let i = 0; i < data.length; i++) {\n if (data[i] > (config.face.emotion?.minConfidence || 0)) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] as Emotion });\n }\n obj.sort((a, b) => b.score - a.score);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "/**\n * MobileFaceNet model implementation\n *\n * Based on: [**BecauseofAI MobileFace**](https://github.com/becauseofAI/MobileFace)\n *\n * Obsolete and replaced by `faceres` that performs age/gender/descriptor analysis\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['mobilefacenet'].modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\n/*\n// convert to black&white to avoid colorization impact\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\nconst [red, green, blue] = tf.split(crop, 3, 3);\nconst redNorm = tf.mul(red, rgb[0]);\nconst greenNorm = tf.mul(green, rgb[1]);\nconst blueNorm = tf.mul(blue, rgb[2]);\nconst grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\nconst merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n\n// optional increase image contrast\n// or do it per-channel so mean is done on each channel\n// or do it based on histogram\nconst mean = merge.mean();\nconst factor = 5;\nconst contrast = merge.sub(mean).mul(factor).add(mean);\n*/\n\nexport async function predict(input: Tensor, config: Config, idx, count): Promise {\n if (!model) return [];\n const skipFrame = skipped < (config.face['mobilefacenet']?.skipFrames || 0);\n const skipTime = (config.face['mobilefacenet']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n return new Promise(async (resolve) => {\n let data: Array = [];\n if (config.face['mobilefacenet']?.enabled && model?.inputs[0].shape) {\n const t: Record = {};\n t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model\n // do a tight crop of image and resize it to fit the model\n // const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n t.data = model?.execute(t.crop) as Tensor;\n /*\n // optional normalize outputs with l2 normalization\n const scaled = tf.tidy(() => {\n const l2 = res.norm('euclidean');\n const scale = res.div(l2);\n return scale;\n });\n\n // optional reduce feature vector complexity\n const reshape = tf.reshape(res, [128, 2]); // split 256 vectors into 128 x 2\n const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it\n */\n const output = await t.data.data();\n data = Array.from(output); // convert typed array to simple array\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = data;\n lastCount = count;\n lastTime = now();\n resolve(data);\n });\n}\n", "/**\n * InsightFace model implementation\n *\n * Based on: [**DeepInsight InsightFace**](https://github.com/deepinsight/insightface)\n *\n * Alternative face embedding detection\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst last: Array = [];\nlet lastCount = 0;\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face['insightface'].modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(input: Tensor, config: Config, idx, count): Promise {\n if (!model) return [];\n const skipFrame = skipped < (config.face['insightface']?.skipFrames || 0);\n const skipTime = (config.face['insightface']?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && last[idx]) {\n skipped++;\n return last[idx];\n }\n return new Promise(async (resolve) => {\n let data: Array = [];\n if (config.face['insightface']?.enabled && model?.inputs[0].shape) {\n const t: Record = {};\n t.crop = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); // just resize to fit the embedding model\n // do a tight crop of image and resize it to fit the model\n // const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // t.crop = tf.image.cropAndResize(input, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n t.data = model?.execute(t.crop) as Tensor;\n const output = await t.data.data();\n data = Array.from(output); // convert typed array to simple array\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n last[idx] = data;\n lastCount = count;\n lastTime = now();\n resolve(data);\n });\n}\n", "import * as coords from './facemeshcoords';\nimport * as util from './facemeshutil';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { log } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { Point } from '../result';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\n\nconst irisEnlarge = 2.3;\n\nconst leftOutline = coords.meshAnnotations['leftEyeLower0'];\nconst rightOutline = coords.meshAnnotations['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.iris?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n if (inputSize === -1) inputSize = 64;\n return model;\n}\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates and update the z coordinate to be an average of the original and the new.\nexport function replaceIrisCoords(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.irisIndices.length; i++) {\n const { key, indices } = coords.irisIndices[i];\n const originalIndices = coords.meshAnnotations[`${prefix}${key}`];\n if (!keys || keys.includes(key)) {\n for (let j = 0; j < indices.length; j++) {\n const index = indices[j];\n rawCoords[originalIndices[j]] = [\n newCoords[index][0],\n newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n\nexport const getLeftToRightEyeDepthDifference = (rawCoords) => {\n const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n return leftEyeZ - rightEyeZ;\n};\n\n// Returns a box describing a cropped region around the eye fit for passing to the iris model.\nexport const getEyeBox = (rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, meshSize, flip = false) => {\n const box = util.squarifyBox(util.enlargeBox(util.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), irisEnlarge));\n const boxSize = util.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / meshSize,\n box.startPoint[0] / meshSize, box.endPoint[1] / meshSize,\n box.endPoint[0] / meshSize,\n ]], [0], [inputSize, inputSize]);\n if (flip && env.kernels.includes('flipleftright')) {\n const flipped = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n tf.dispose(crop);\n crop = flipped;\n }\n return { box, boxSize, crop };\n};\n\n// Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\nexport const getEyeCoords = (eyeData, eyeBox, eyeBoxSize, flip = false) => {\n const eyeRawCoords: Array = [];\n for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n const x = eyeData[i * 3];\n const y = eyeData[i * 3 + 1];\n const z = eyeData[i * 3 + 2];\n eyeRawCoords.push([\n (flip ? (1 - (x / inputSize)) : (x / inputSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / inputSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n ]);\n }\n return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n};\n\n// The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\nexport const getAdjustedIrisCoords = (rawCoords, irisCoords, direction) => {\n const upperCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.meshAnnotations[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n return irisCoords.map((coord, i) => {\n let z = averageZ;\n if (i === 2) {\n z = upperCenterZ;\n } else if (i === 4) {\n z = lowerCenterZ;\n }\n return [coord[0], coord[1], z];\n });\n};\n\nexport async function augmentIris(rawCoords, face, config, meshSize) {\n if (!model) {\n if (config.debug) log('face mesh iris detection requested, but model is not loaded');\n return rawCoords;\n }\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], meshSize, true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1], meshSize, true);\n const combined = tf.concat([leftEyeCrop, rightEyeCrop]);\n tf.dispose(leftEyeCrop);\n tf.dispose(rightEyeCrop);\n const eyePredictions = model.execute(combined) as Tensor;\n tf.dispose(combined);\n const eyePredictionsData = await eyePredictions.data();\n tf.dispose(eyePredictions);\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize, false);\n const leftToRightEyeDepthDifference = getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceIrisCoords(rawCoords, leftEyeRawCoords, 'left', null);\n replaceIrisCoords(rawCoords, rightEyeRawCoords, 'right', null);\n // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged so we only update a single contour line above and below the eye.\n } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n replaceIrisCoords(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceIrisCoords(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n const newCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n return newCoords;\n}\n", "// @tensorflow/tfjs-models/face-landmark-detection/src/constants.ts\n// https://github.com/google/mediapipe/mediapipe/python/solutions/face_mesh_connections.py\n\ntype PairArray = Array<[number, number]>;\n\nconst LIPS_CONNECTIONS: PairArray = [\n [61, 146], [146, 91], [91, 181], [181, 84], [84, 17], [17, 314], [314, 405], [405, 321], [321, 375], [375, 291], [61, 185], [185, 40], [40, 39], [39, 37], [37, 0], [0, 267], [267, 269], [269, 270], [270, 409], [409, 291],\n [78, 95], [95, 88], [88, 178], [178, 87], [87, 14], [14, 317], [317, 402], [402, 318], [318, 324], [324, 308], [78, 191], [191, 80], [80, 81], [81, 82], [82, 13], [13, 312], [312, 311], [311, 310], [310, 415], [415, 308],\n];\n\nconst LEFT_EYE_CONNECTIONS: PairArray = [[263, 249], [249, 390], [390, 373], [373, 374], [374, 380], [380, 381], [381, 382], [382, 362], [263, 466], [466, 388], [388, 387], [387, 386], [386, 385], [385, 384], [384, 398], [398, 362]];\n\nconst LEFT_EYEBROW_CONNECTIONS: PairArray = [[276, 283], [283, 282], [282, 295], [295, 285], [300, 293], [293, 334], [334, 296], [296, 336]];\n\nconst LEFT_IRIS_CONNECTIONS: PairArray = [[474, 475], [475, 476], [476, 477], [477, 474]];\n\nconst RIGHT_EYE_CONNECTIONS: PairArray = [[33, 7], [7, 163], [163, 144], [144, 145], [145, 153], [153, 154], [154, 155], [155, 133], [33, 246], [246, 161], [161, 160], [160, 159], [159, 158], [158, 157], [157, 173], [173, 133]];\n\nconst RIGHT_EYEBROW_CONNECTIONS: PairArray = [[46, 53], [53, 52], [52, 65], [65, 55], [70, 63], [63, 105], [105, 66], [66, 107]];\n\nconst RIGHT_IRIS_CONNECTIONS: PairArray = [[469, 470], [470, 471], [471, 472], [472, 469]];\n\nconst FACE_OVAL_CONNECTIONS: PairArray = [\n [10, 338], [338, 297], [297, 332], [332, 284], [284, 251], [251, 389], [389, 356], [356, 454], [454, 323], [323, 361], [361, 288], [288, 397], [397, 365], [365, 379], [379, 378], [378, 400], [400, 377], [377, 152],\n [152, 148], [148, 176], [176, 149], [149, 150], [150, 136], [136, 172], [172, 58], [58, 132], [132, 93], [93, 234], [234, 127], [127, 162], [162, 21], [21, 54], [54, 103], [103, 67], [67, 109], [109, 10],\n];\n\nexport const MEDIAPIPE_FACE_MESH_CONNECTED_KEYPOINTS_PAIRS: PairArray = [\n [127, 34], [34, 139], [139, 127], [11, 0], [0, 37], [37, 11], [232, 231], [231, 120], [120, 232], [72, 37], [37, 39], [39, 72], [128, 121], [121, 47], [47, 128], [232, 121], [121, 128], [128, 232],\n [104, 69], [69, 67], [67, 104], [175, 171], [171, 148], [148, 175], [118, 50], [50, 101], [101, 118], [73, 39], [39, 40], [40, 73], [9, 151], [151, 108], [108, 9], [48, 115], [115, 131], [131, 48],\n [194, 204], [204, 211], [211, 194], [74, 40], [40, 185], [185, 74], [80, 42], [42, 183], [183, 80], [40, 92], [92, 186], [186, 40], [230, 229], [229, 118], [118, 230], [202, 212], [212, 214], [214, 202],\n [83, 18], [18, 17], [17, 83], [76, 61], [61, 146], [146, 76], [160, 29], [29, 30], [30, 160], [56, 157], [157, 173], [173, 56], [106, 204], [204, 194], [194, 106], [135, 214], [214, 192], [192, 135],\n [203, 165], [165, 98], [98, 203], [21, 71], [71, 68], [68, 21], [51, 45], [45, 4], [4, 51], [144, 24], [24, 23], [23, 144], [77, 146], [146, 91], [91, 77], [205, 50], [50, 187], [187, 205],\n [201, 200], [200, 18], [18, 201], [91, 106], [106, 182], [182, 91], [90, 91], [91, 181], [181, 90], [85, 84], [84, 17], [17, 85], [206, 203], [203, 36], [36, 206], [148, 171], [171, 140], [140, 148],\n [92, 40], [40, 39], [39, 92], [193, 189], [189, 244], [244, 193], [159, 158], [158, 28], [28, 159], [247, 246], [246, 161], [161, 247], [236, 3], [3, 196], [196, 236], [54, 68], [68, 104], [104, 54],\n [193, 168], [168, 8], [8, 193], [117, 228], [228, 31], [31, 117], [189, 193], [193, 55], [55, 189], [98, 97], [97, 99], [99, 98], [126, 47], [47, 100], [100, 126], [166, 79], [79, 218], [218, 166],\n [155, 154], [154, 26], [26, 155], [209, 49], [49, 131], [131, 209], [135, 136], [136, 150], [150, 135], [47, 126], [126, 217], [217, 47], [223, 52], [52, 53], [53, 223], [45, 51], [51, 134], [134, 45],\n [211, 170], [170, 140], [140, 211], [67, 69], [69, 108], [108, 67], [43, 106], [106, 91], [91, 43], [230, 119], [119, 120], [120, 230], [226, 130], [130, 247], [247, 226], [63, 53], [53, 52], [52, 63],\n [238, 20], [20, 242], [242, 238], [46, 70], [70, 156], [156, 46], [78, 62], [62, 96], [96, 78], [46, 53], [53, 63], [63, 46], [143, 34], [34, 227], [227, 143], [123, 117], [117, 111], [111, 123],\n [44, 125], [125, 19], [19, 44], [236, 134], [134, 51], [51, 236], [216, 206], [206, 205], [205, 216], [154, 153], [153, 22], [22, 154], [39, 37], [37, 167], [167, 39], [200, 201], [201, 208], [208, 200],\n [36, 142], [142, 100], [100, 36], [57, 212], [212, 202], [202, 57], [20, 60], [60, 99], [99, 20], [28, 158], [158, 157], [157, 28], [35, 226], [226, 113], [113, 35], [160, 159], [159, 27], [27, 160],\n [204, 202], [202, 210], [210, 204], [113, 225], [225, 46], [46, 113], [43, 202], [202, 204], [204, 43], [62, 76], [76, 77], [77, 62], [137, 123], [123, 116], [116, 137], [41, 38], [38, 72], [72, 41],\n [203, 129], [129, 142], [142, 203], [64, 98], [98, 240], [240, 64], [49, 102], [102, 64], [64, 49], [41, 73], [73, 74], [74, 41], [212, 216], [216, 207], [207, 212], [42, 74], [74, 184], [184, 42],\n [169, 170], [170, 211], [211, 169], [170, 149], [149, 176], [176, 170], [105, 66], [66, 69], [69, 105], [122, 6], [6, 168], [168, 122], [123, 147], [147, 187], [187, 123], [96, 77], [77, 90], [90, 96],\n [65, 55], [55, 107], [107, 65], [89, 90], [90, 180], [180, 89], [101, 100], [100, 120], [120, 101], [63, 105], [105, 104], [104, 63], [93, 137], [137, 227], [227, 93], [15, 86], [86, 85], [85, 15],\n [129, 102], [102, 49], [49, 129], [14, 87], [87, 86], [86, 14], [55, 8], [8, 9], [9, 55], [100, 47], [47, 121], [121, 100], [145, 23], [23, 22], [22, 145], [88, 89], [89, 179], [179, 88],\n [6, 122], [122, 196], [196, 6], [88, 95], [95, 96], [96, 88], [138, 172], [172, 136], [136, 138], [215, 58], [58, 172], [172, 215], [115, 48], [48, 219], [219, 115], [42, 80], [80, 81], [81, 42],\n [195, 3], [3, 51], [51, 195], [43, 146], [146, 61], [61, 43], [171, 175], [175, 199], [199, 171], [81, 82], [82, 38], [38, 81], [53, 46], [46, 225], [225, 53], [144, 163], [163, 110], [110, 144],\n [52, 65], [65, 66], [66, 52], [229, 228], [228, 117], [117, 229], [34, 127], [127, 234], [234, 34], [107, 108], [108, 69], [69, 107], [109, 108], [108, 151], [151, 109], [48, 64], [64, 235], [235, 48],\n [62, 78], [78, 191], [191, 62], [129, 209], [209, 126], [126, 129], [111, 35], [35, 143], [143, 111], [117, 123], [123, 50], [50, 117], [222, 65], [65, 52], [52, 222], [19, 125], [125, 141], [141, 19],\n [221, 55], [55, 65], [65, 221], [3, 195], [195, 197], [197, 3], [25, 7], [7, 33], [33, 25], [220, 237], [237, 44], [44, 220], [70, 71], [71, 139], [139, 70], [122, 193], [193, 245], [245, 122],\n [247, 130], [130, 33], [33, 247], [71, 21], [21, 162], [162, 71], [170, 169], [169, 150], [150, 170], [188, 174], [174, 196], [196, 188], [216, 186], [186, 92], [92, 216], [2, 97], [97, 167], [167, 2],\n [141, 125], [125, 241], [241, 141], [164, 167], [167, 37], [37, 164], [72, 38], [38, 12], [12, 72], [38, 82], [82, 13], [13, 38], [63, 68], [68, 71], [71, 63], [226, 35], [35, 111], [111, 226],\n [101, 50], [50, 205], [205, 101], [206, 92], [92, 165], [165, 206], [209, 198], [198, 217], [217, 209], [165, 167], [167, 97], [97, 165], [220, 115], [115, 218], [218, 220], [133, 112], [112, 243], [243, 133],\n [239, 238], [238, 241], [241, 239], [214, 135], [135, 169], [169, 214], [190, 173], [173, 133], [133, 190], [171, 208], [208, 32], [32, 171], [125, 44], [44, 237], [237, 125], [86, 87], [87, 178], [178, 86],\n [85, 86], [86, 179], [179, 85], [84, 85], [85, 180], [180, 84], [83, 84], [84, 181], [181, 83], [201, 83], [83, 182], [182, 201], [137, 93], [93, 132], [132, 137], [76, 62], [62, 183], [183, 76],\n [61, 76], [76, 184], [184, 61], [57, 61], [61, 185], [185, 57], [212, 57], [57, 186], [186, 212], [214, 207], [207, 187], [187, 214], [34, 143], [143, 156], [156, 34], [79, 239], [239, 237], [237, 79],\n [123, 137], [137, 177], [177, 123], [44, 1], [1, 4], [4, 44], [201, 194], [194, 32], [32, 201], [64, 102], [102, 129], [129, 64], [213, 215], [215, 138], [138, 213], [59, 166], [166, 219], [219, 59],\n [242, 99], [99, 97], [97, 242], [2, 94], [94, 141], [141, 2], [75, 59], [59, 235], [235, 75], [24, 110], [110, 228], [228, 24], [25, 130], [130, 226], [226, 25], [23, 24], [24, 229], [229, 23],\n [22, 23], [23, 230], [230, 22], [26, 22], [22, 231], [231, 26], [112, 26], [26, 232], [232, 112], [189, 190], [190, 243], [243, 189], [221, 56], [56, 190], [190, 221], [28, 56], [56, 221], [221, 28],\n [27, 28], [28, 222], [222, 27], [29, 27], [27, 223], [223, 29], [30, 29], [29, 224], [224, 30], [247, 30], [30, 225], [225, 247], [238, 79], [79, 20], [20, 238], [166, 59], [59, 75], [75, 166],\n [60, 75], [75, 240], [240, 60], [147, 177], [177, 215], [215, 147], [20, 79], [79, 166], [166, 20], [187, 147], [147, 213], [213, 187], [112, 233], [233, 244], [244, 112], [233, 128], [128, 245], [245, 233],\n [128, 114], [114, 188], [188, 128], [114, 217], [217, 174], [174, 114], [131, 115], [115, 220], [220, 131], [217, 198], [198, 236], [236, 217], [198, 131], [131, 134], [134, 198], [177, 132], [132, 58], [58, 177],\n [143, 35], [35, 124], [124, 143], [110, 163], [163, 7], [7, 110], [228, 110], [110, 25], [25, 228], [356, 389], [389, 368], [368, 356], [11, 302], [302, 267], [267, 11], [452, 350], [350, 349], [349, 452],\n [302, 303], [303, 269], [269, 302], [357, 343], [343, 277], [277, 357], [452, 453], [453, 357], [357, 452], [333, 332], [332, 297], [297, 333], [175, 152], [152, 377], [377, 175], [347, 348], [348, 330], [330, 347],\n [303, 304], [304, 270], [270, 303], [9, 336], [336, 337], [337, 9], [278, 279], [279, 360], [360, 278], [418, 262], [262, 431], [431, 418], [304, 408], [408, 409], [409, 304], [310, 415], [415, 407], [407, 310],\n [270, 409], [409, 410], [410, 270], [450, 348], [348, 347], [347, 450], [422, 430], [430, 434], [434, 422], [313, 314], [314, 17], [17, 313], [306, 307], [307, 375], [375, 306], [387, 388], [388, 260], [260, 387],\n [286, 414], [414, 398], [398, 286], [335, 406], [406, 418], [418, 335], [364, 367], [367, 416], [416, 364], [423, 358], [358, 327], [327, 423], [251, 284], [284, 298], [298, 251], [281, 5], [5, 4], [4, 281],\n [373, 374], [374, 253], [253, 373], [307, 320], [320, 321], [321, 307], [425, 427], [427, 411], [411, 425], [421, 313], [313, 18], [18, 421], [321, 405], [405, 406], [406, 321], [320, 404], [404, 405], [405, 320],\n [315, 16], [16, 17], [17, 315], [426, 425], [425, 266], [266, 426], [377, 400], [400, 369], [369, 377], [322, 391], [391, 269], [269, 322], [417, 465], [465, 464], [464, 417], [386, 257], [257, 258], [258, 386],\n [466, 260], [260, 388], [388, 466], [456, 399], [399, 419], [419, 456], [284, 332], [332, 333], [333, 284], [417, 285], [285, 8], [8, 417], [346, 340], [340, 261], [261, 346], [413, 441], [441, 285], [285, 413],\n [327, 460], [460, 328], [328, 327], [355, 371], [371, 329], [329, 355], [392, 439], [439, 438], [438, 392], [382, 341], [341, 256], [256, 382], [429, 420], [420, 360], [360, 429], [364, 394], [394, 379], [379, 364],\n [277, 343], [343, 437], [437, 277], [443, 444], [444, 283], [283, 443], [275, 440], [440, 363], [363, 275], [431, 262], [262, 369], [369, 431], [297, 338], [338, 337], [337, 297], [273, 375], [375, 321], [321, 273],\n [450, 451], [451, 349], [349, 450], [446, 342], [342, 467], [467, 446], [293, 334], [334, 282], [282, 293], [458, 461], [461, 462], [462, 458], [276, 353], [353, 383], [383, 276], [308, 324], [324, 325], [325, 308],\n [276, 300], [300, 293], [293, 276], [372, 345], [345, 447], [447, 372], [352, 345], [345, 340], [340, 352], [274, 1], [1, 19], [19, 274], [456, 248], [248, 281], [281, 456], [436, 427], [427, 425], [425, 436],\n [381, 256], [256, 252], [252, 381], [269, 391], [391, 393], [393, 269], [200, 199], [199, 428], [428, 200], [266, 330], [330, 329], [329, 266], [287, 273], [273, 422], [422, 287], [250, 462], [462, 328], [328, 250],\n [258, 286], [286, 384], [384, 258], [265, 353], [353, 342], [342, 265], [387, 259], [259, 257], [257, 387], [424, 431], [431, 430], [430, 424], [342, 353], [353, 276], [276, 342], [273, 335], [335, 424], [424, 273],\n [292, 325], [325, 307], [307, 292], [366, 447], [447, 345], [345, 366], [271, 303], [303, 302], [302, 271], [423, 266], [266, 371], [371, 423], [294, 455], [455, 460], [460, 294], [279, 278], [278, 294], [294, 279],\n [271, 272], [272, 304], [304, 271], [432, 434], [434, 427], [427, 432], [272, 407], [407, 408], [408, 272], [394, 430], [430, 431], [431, 394], [395, 369], [369, 400], [400, 395], [334, 333], [333, 299], [299, 334],\n [351, 417], [417, 168], [168, 351], [352, 280], [280, 411], [411, 352], [325, 319], [319, 320], [320, 325], [295, 296], [296, 336], [336, 295], [319, 403], [403, 404], [404, 319], [330, 348], [348, 349], [349, 330],\n [293, 298], [298, 333], [333, 293], [323, 454], [454, 447], [447, 323], [15, 16], [16, 315], [315, 15], [358, 429], [429, 279], [279, 358], [14, 15], [15, 316], [316, 14], [285, 336], [336, 9], [9, 285],\n [329, 349], [349, 350], [350, 329], [374, 380], [380, 252], [252, 374], [318, 402], [402, 403], [403, 318], [6, 197], [197, 419], [419, 6], [318, 319], [319, 325], [325, 318], [367, 364], [364, 365], [365, 367],\n [435, 367], [367, 397], [397, 435], [344, 438], [438, 439], [439, 344], [272, 271], [271, 311], [311, 272], [195, 5], [5, 281], [281, 195], [273, 287], [287, 291], [291, 273], [396, 428], [428, 199], [199, 396],\n [311, 271], [271, 268], [268, 311], [283, 444], [444, 445], [445, 283], [373, 254], [254, 339], [339, 373], [282, 334], [334, 296], [296, 282], [449, 347], [347, 346], [346, 449], [264, 447], [447, 454], [454, 264],\n [336, 296], [296, 299], [299, 336], [338, 10], [10, 151], [151, 338], [278, 439], [439, 455], [455, 278], [292, 407], [407, 415], [415, 292], [358, 371], [371, 355], [355, 358], [340, 345], [345, 372], [372, 340],\n [346, 347], [347, 280], [280, 346], [442, 443], [443, 282], [282, 442], [19, 94], [94, 370], [370, 19], [441, 442], [442, 295], [295, 441], [248, 419], [419, 197], [197, 248], [263, 255], [255, 359], [359, 263],\n [440, 275], [275, 274], [274, 440], [300, 383], [383, 368], [368, 300], [351, 412], [412, 465], [465, 351], [263, 467], [467, 466], [466, 263], [301, 368], [368, 389], [389, 301], [395, 378], [378, 379], [379, 395],\n [412, 351], [351, 419], [419, 412], [436, 426], [426, 322], [322, 436], [2, 164], [164, 393], [393, 2], [370, 462], [462, 461], [461, 370], [164, 0], [0, 267], [267, 164], [302, 11], [11, 12], [12, 302],\n [268, 12], [12, 13], [13, 268], [293, 300], [300, 301], [301, 293], [446, 261], [261, 340], [340, 446], [330, 266], [266, 425], [425, 330], [426, 423], [423, 391], [391, 426], [429, 355], [355, 437], [437, 429],\n [391, 327], [327, 326], [326, 391], [440, 457], [457, 438], [438, 440], [341, 382], [382, 362], [362, 341], [459, 457], [457, 461], [461, 459], [434, 430], [430, 394], [394, 434], [414, 463], [463, 362], [362, 414],\n [396, 369], [369, 262], [262, 396], [354, 461], [461, 457], [457, 354], [316, 403], [403, 402], [402, 316], [315, 404], [404, 403], [403, 315], [314, 405], [405, 404], [404, 314], [313, 406], [406, 405], [405, 313],\n [421, 418], [418, 406], [406, 421], [366, 401], [401, 361], [361, 366], [306, 408], [408, 407], [407, 306], [291, 409], [409, 408], [408, 291], [287, 410], [410, 409], [409, 287], [432, 436], [436, 410], [410, 432],\n [434, 416], [416, 411], [411, 434], [264, 368], [368, 383], [383, 264], [309, 438], [438, 457], [457, 309], [352, 376], [376, 401], [401, 352], [274, 275], [275, 4], [4, 274], [421, 428], [428, 262], [262, 421],\n [294, 327], [327, 358], [358, 294], [433, 416], [416, 367], [367, 433], [289, 455], [455, 439], [439, 289], [462, 370], [370, 326], [326, 462], [2, 326], [326, 370], [370, 2], [305, 460], [460, 455], [455, 305],\n [254, 449], [449, 448], [448, 254], [255, 261], [261, 446], [446, 255], [253, 450], [450, 449], [449, 253], [252, 451], [451, 450], [450, 252], [256, 452], [452, 451], [451, 256], [341, 453], [453, 452], [452, 341],\n [413, 464], [464, 463], [463, 413], [441, 413], [413, 414], [414, 441], [258, 442], [442, 441], [441, 258], [257, 443], [443, 442], [442, 257], [259, 444], [444, 443], [443, 259], [260, 445], [445, 444], [444, 260],\n [467, 342], [342, 445], [445, 467], [459, 458], [458, 250], [250, 459], [289, 392], [392, 290], [290, 289], [290, 328], [328, 460], [460, 290], [376, 433], [433, 435], [435, 376], [250, 290], [290, 392], [392, 250],\n [411, 416], [416, 433], [433, 411], [341, 463], [463, 464], [464, 341], [453, 464], [464, 465], [465, 453], [357, 465], [465, 412], [412, 357], [343, 412], [412, 399], [399, 343], [360, 363], [363, 440], [440, 360],\n [437, 399], [399, 456], [456, 437], [420, 456], [456, 363], [363, 420], [401, 435], [435, 288], [288, 401], [372, 383], [383, 353], [353, 372], [339, 255], [255, 249], [249, 339], [448, 261], [261, 255], [255, 448],\n [133, 243], [243, 190], [190, 133], [133, 155], [155, 112], [112, 133], [33, 246], [246, 247], [247, 33], [33, 130], [130, 25], [25, 33], [398, 384], [384, 286], [286, 398], [362, 398], [398, 414], [414, 362],\n [362, 463], [463, 341], [341, 362], [263, 359], [359, 467], [467, 263], [263, 249], [249, 255], [255, 263], [466, 467], [467, 260], [260, 466], [75, 60], [60, 166], [166, 75], [238, 239], [239, 79], [79, 238],\n [162, 127], [127, 139], [139, 162], [72, 11], [11, 37], [37, 72], [121, 232], [232, 120], [120, 121], [73, 72], [72, 39], [39, 73], [114, 128], [128, 47], [47, 114], [233, 232], [232, 128], [128, 233],\n [103, 104], [104, 67], [67, 103], [152, 175], [175, 148], [148, 152], [119, 118], [118, 101], [101, 119], [74, 73], [73, 40], [40, 74], [107, 9], [9, 108], [108, 107], [49, 48], [48, 131], [131, 49],\n [32, 194], [194, 211], [211, 32], [184, 74], [74, 185], [185, 184], [191, 80], [80, 183], [183, 191], [185, 40], [40, 186], [186, 185], [119, 230], [230, 118], [118, 119], [210, 202], [202, 214], [214, 210],\n [84, 83], [83, 17], [17, 84], [77, 76], [76, 146], [146, 77], [161, 160], [160, 30], [30, 161], [190, 56], [56, 173], [173, 190], [182, 106], [106, 194], [194, 182], [138, 135], [135, 192], [192, 138],\n [129, 203], [203, 98], [98, 129], [54, 21], [21, 68], [68, 54], [5, 51], [51, 4], [4, 5], [145, 144], [144, 23], [23, 145], [90, 77], [77, 91], [91, 90], [207, 205], [205, 187], [187, 207],\n [83, 201], [201, 18], [18, 83], [181, 91], [91, 182], [182, 181], [180, 90], [90, 181], [181, 180], [16, 85], [85, 17], [17, 16], [205, 206], [206, 36], [36, 205], [176, 148], [148, 140], [140, 176],\n [165, 92], [92, 39], [39, 165], [245, 193], [193, 244], [244, 245], [27, 159], [159, 28], [28, 27], [30, 247], [247, 161], [161, 30], [174, 236], [236, 196], [196, 174], [103, 54], [54, 104], [104, 103],\n [55, 193], [193, 8], [8, 55], [111, 117], [117, 31], [31, 111], [221, 189], [189, 55], [55, 221], [240, 98], [98, 99], [99, 240], [142, 126], [126, 100], [100, 142], [219, 166], [166, 218], [218, 219],\n [112, 155], [155, 26], [26, 112], [198, 209], [209, 131], [131, 198], [169, 135], [135, 150], [150, 169], [114, 47], [47, 217], [217, 114], [224, 223], [223, 53], [53, 224], [220, 45], [45, 134], [134, 220],\n [32, 211], [211, 140], [140, 32], [109, 67], [67, 108], [108, 109], [146, 43], [43, 91], [91, 146], [231, 230], [230, 120], [120, 231], [113, 226], [226, 247], [247, 113], [105, 63], [63, 52], [52, 105],\n [241, 238], [238, 242], [242, 241], [124, 46], [46, 156], [156, 124], [95, 78], [78, 96], [96, 95], [70, 46], [46, 63], [63, 70], [116, 143], [143, 227], [227, 116], [116, 123], [123, 111], [111, 116],\n [1, 44], [44, 19], [19, 1], [3, 236], [236, 51], [51, 3], [207, 216], [216, 205], [205, 207], [26, 154], [154, 22], [22, 26], [165, 39], [39, 167], [167, 165], [199, 200], [200, 208], [208, 199],\n [101, 36], [36, 100], [100, 101], [43, 57], [57, 202], [202, 43], [242, 20], [20, 99], [99, 242], [56, 28], [28, 157], [157, 56], [124, 35], [35, 113], [113, 124], [29, 160], [160, 27], [27, 29],\n [211, 204], [204, 210], [210, 211], [124, 113], [113, 46], [46, 124], [106, 43], [43, 204], [204, 106], [96, 62], [62, 77], [77, 96], [227, 137], [137, 116], [116, 227], [73, 41], [41, 72], [72, 73],\n [36, 203], [203, 142], [142, 36], [235, 64], [64, 240], [240, 235], [48, 49], [49, 64], [64, 48], [42, 41], [41, 74], [74, 42], [214, 212], [212, 207], [207, 214], [183, 42], [42, 184], [184, 183],\n [210, 169], [169, 211], [211, 210], [140, 170], [170, 176], [176, 140], [104, 105], [105, 69], [69, 104], [193, 122], [122, 168], [168, 193], [50, 123], [123, 187], [187, 50], [89, 96], [96, 90], [90, 89],\n [66, 65], [65, 107], [107, 66], [179, 89], [89, 180], [180, 179], [119, 101], [101, 120], [120, 119], [68, 63], [63, 104], [104, 68], [234, 93], [93, 227], [227, 234], [16, 15], [15, 85], [85, 16],\n [209, 129], [129, 49], [49, 209], [15, 14], [14, 86], [86, 15], [107, 55], [55, 9], [9, 107], [120, 100], [100, 121], [121, 120], [153, 145], [145, 22], [22, 153], [178, 88], [88, 179], [179, 178],\n [197, 6], [6, 196], [196, 197], [89, 88], [88, 96], [96, 89], [135, 138], [138, 136], [136, 135], [138, 215], [215, 172], [172, 138], [218, 115], [115, 219], [219, 218], [41, 42], [42, 81], [81, 41],\n [5, 195], [195, 51], [51, 5], [57, 43], [43, 61], [61, 57], [208, 171], [171, 199], [199, 208], [41, 81], [81, 38], [38, 41], [224, 53], [53, 225], [225, 224], [24, 144], [144, 110], [110, 24],\n [105, 52], [52, 66], [66, 105], [118, 229], [229, 117], [117, 118], [227, 34], [34, 234], [234, 227], [66, 107], [107, 69], [69, 66], [10, 109], [109, 151], [151, 10], [219, 48], [48, 235], [235, 219],\n [183, 62], [62, 191], [191, 183], [142, 129], [129, 126], [126, 142], [116, 111], [111, 143], [143, 116], [118, 117], [117, 50], [50, 118], [223, 222], [222, 52], [52, 223], [94, 19], [19, 141], [141, 94],\n [222, 221], [221, 65], [65, 222], [196, 3], [3, 197], [197, 196], [45, 220], [220, 44], [44, 45], [156, 70], [70, 139], [139, 156], [188, 122], [122, 245], [245, 188], [139, 71], [71, 162], [162, 139],\n [149, 170], [170, 150], [150, 149], [122, 188], [188, 196], [196, 122], [206, 216], [216, 92], [92, 206], [164, 2], [2, 167], [167, 164], [242, 141], [141, 241], [241, 242], [0, 164], [164, 37], [37, 0],\n [11, 72], [72, 12], [12, 11], [12, 38], [38, 13], [13, 12], [70, 63], [63, 71], [71, 70], [31, 226], [226, 111], [111, 31], [36, 101], [101, 205], [205, 36], [203, 206], [206, 165], [165, 203],\n [126, 209], [209, 217], [217, 126], [98, 165], [165, 97], [97, 98], [237, 220], [220, 218], [218, 237], [237, 239], [239, 241], [241, 237], [210, 214], [214, 169], [169, 210], [140, 171], [171, 32], [32, 140],\n [241, 125], [125, 237], [237, 241], [179, 86], [86, 178], [178, 179], [180, 85], [85, 179], [179, 180], [181, 84], [84, 180], [180, 181], [182, 83], [83, 181], [181, 182], [194, 201], [201, 182], [182, 194],\n [177, 137], [137, 132], [132, 177], [184, 76], [76, 183], [183, 184], [185, 61], [61, 184], [184, 185], [186, 57], [57, 185], [185, 186], [216, 212], [212, 186], [186, 216], [192, 214], [214, 187], [187, 192],\n [139, 34], [34, 156], [156, 139], [218, 79], [79, 237], [237, 218], [147, 123], [123, 177], [177, 147], [45, 44], [44, 4], [4, 45], [208, 201], [201, 32], [32, 208], [98, 64], [64, 129], [129, 98],\n [192, 213], [213, 138], [138, 192], [235, 59], [59, 219], [219, 235], [141, 242], [242, 97], [97, 141], [97, 2], [2, 141], [141, 97], [240, 75], [75, 235], [235, 240], [229, 24], [24, 228], [228, 229],\n [31, 25], [25, 226], [226, 31], [230, 23], [23, 229], [229, 230], [231, 22], [22, 230], [230, 231], [232, 26], [26, 231], [231, 232], [233, 112], [112, 232], [232, 233], [244, 189], [189, 243], [243, 244],\n [189, 221], [221, 190], [190, 189], [222, 28], [28, 221], [221, 222], [223, 27], [27, 222], [222, 223], [224, 29], [29, 223], [223, 224], [225, 30], [30, 224], [224, 225], [113, 247], [247, 225], [225, 113],\n [99, 60], [60, 240], [240, 99], [213, 147], [147, 215], [215, 213], [60, 20], [20, 166], [166, 60], [192, 187], [187, 213], [213, 192], [243, 112], [112, 244], [244, 243], [244, 233], [233, 245], [245, 244],\n [245, 128], [128, 188], [188, 245], [188, 114], [114, 174], [174, 188], [134, 131], [131, 220], [220, 134], [174, 217], [217, 236], [236, 174], [236, 198], [198, 134], [134, 236], [215, 177], [177, 58], [58, 215],\n [156, 143], [143, 124], [124, 156], [25, 110], [110, 7], [7, 25], [31, 228], [228, 25], [25, 31], [264, 356], [356, 368], [368, 264], [0, 11], [11, 267], [267, 0], [451, 452], [452, 349], [349, 451],\n [267, 302], [302, 269], [269, 267], [350, 357], [357, 277], [277, 350], [350, 452], [452, 357], [357, 350], [299, 333], [333, 297], [297, 299], [396, 175], [175, 377], [377, 396], [280, 347], [347, 330], [330, 280],\n [269, 303], [303, 270], [270, 269], [151, 9], [9, 337], [337, 151], [344, 278], [278, 360], [360, 344], [424, 418], [418, 431], [431, 424], [270, 304], [304, 409], [409, 270], [272, 310], [310, 407], [407, 272],\n [322, 270], [270, 410], [410, 322], [449, 450], [450, 347], [347, 449], [432, 422], [422, 434], [434, 432], [18, 313], [313, 17], [17, 18], [291, 306], [306, 375], [375, 291], [259, 387], [387, 260], [260, 259],\n [424, 335], [335, 418], [418, 424], [434, 364], [364, 416], [416, 434], [391, 423], [423, 327], [327, 391], [301, 251], [251, 298], [298, 301], [275, 281], [281, 4], [4, 275], [254, 373], [373, 253], [253, 254],\n [375, 307], [307, 321], [321, 375], [280, 425], [425, 411], [411, 280], [200, 421], [421, 18], [18, 200], [335, 321], [321, 406], [406, 335], [321, 320], [320, 405], [405, 321], [314, 315], [315, 17], [17, 314],\n [423, 426], [426, 266], [266, 423], [396, 377], [377, 369], [369, 396], [270, 322], [322, 269], [269, 270], [413, 417], [417, 464], [464, 413], [385, 386], [386, 258], [258, 385], [248, 456], [456, 419], [419, 248],\n [298, 284], [284, 333], [333, 298], [168, 417], [417, 8], [8, 168], [448, 346], [346, 261], [261, 448], [417, 413], [413, 285], [285, 417], [326, 327], [327, 328], [328, 326], [277, 355], [355, 329], [329, 277],\n [309, 392], [392, 438], [438, 309], [381, 382], [382, 256], [256, 381], [279, 429], [429, 360], [360, 279], [365, 364], [364, 379], [379, 365], [355, 277], [277, 437], [437, 355], [282, 443], [443, 283], [283, 282],\n [281, 275], [275, 363], [363, 281], [395, 431], [431, 369], [369, 395], [299, 297], [297, 337], [337, 299], [335, 273], [273, 321], [321, 335], [348, 450], [450, 349], [349, 348], [359, 446], [446, 467], [467, 359],\n [283, 293], [293, 282], [282, 283], [250, 458], [458, 462], [462, 250], [300, 276], [276, 383], [383, 300], [292, 308], [308, 325], [325, 292], [283, 276], [276, 293], [293, 283], [264, 372], [372, 447], [447, 264],\n [346, 352], [352, 340], [340, 346], [354, 274], [274, 19], [19, 354], [363, 456], [456, 281], [281, 363], [426, 436], [436, 425], [425, 426], [380, 381], [381, 252], [252, 380], [267, 269], [269, 393], [393, 267],\n [421, 200], [200, 428], [428, 421], [371, 266], [266, 329], [329, 371], [432, 287], [287, 422], [422, 432], [290, 250], [250, 328], [328, 290], [385, 258], [258, 384], [384, 385], [446, 265], [265, 342], [342, 446],\n [386, 387], [387, 257], [257, 386], [422, 424], [424, 430], [430, 422], [445, 342], [342, 276], [276, 445], [422, 273], [273, 424], [424, 422], [306, 292], [292, 307], [307, 306], [352, 366], [366, 345], [345, 352],\n [268, 271], [271, 302], [302, 268], [358, 423], [423, 371], [371, 358], [327, 294], [294, 460], [460, 327], [331, 279], [279, 294], [294, 331], [303, 271], [271, 304], [304, 303], [436, 432], [432, 427], [427, 436],\n [304, 272], [272, 408], [408, 304], [395, 394], [394, 431], [431, 395], [378, 395], [395, 400], [400, 378], [296, 334], [334, 299], [299, 296], [6, 351], [351, 168], [168, 6], [376, 352], [352, 411], [411, 376],\n [307, 325], [325, 320], [320, 307], [285, 295], [295, 336], [336, 285], [320, 319], [319, 404], [404, 320], [329, 330], [330, 349], [349, 329], [334, 293], [293, 333], [333, 334], [366, 323], [323, 447], [447, 366],\n [316, 15], [15, 315], [315, 316], [331, 358], [358, 279], [279, 331], [317, 14], [14, 316], [316, 317], [8, 285], [285, 9], [9, 8], [277, 329], [329, 350], [350, 277], [253, 374], [374, 252], [252, 253],\n [319, 318], [318, 403], [403, 319], [351, 6], [6, 419], [419, 351], [324, 318], [318, 325], [325, 324], [397, 367], [367, 365], [365, 397], [288, 435], [435, 397], [397, 288], [278, 344], [344, 439], [439, 278],\n [310, 272], [272, 311], [311, 310], [248, 195], [195, 281], [281, 248], [375, 273], [273, 291], [291, 375], [175, 396], [396, 199], [199, 175], [312, 311], [311, 268], [268, 312], [276, 283], [283, 445], [445, 276],\n [390, 373], [373, 339], [339, 390], [295, 282], [282, 296], [296, 295], [448, 449], [449, 346], [346, 448], [356, 264], [264, 454], [454, 356], [337, 336], [336, 299], [299, 337], [337, 338], [338, 151], [151, 337],\n [294, 278], [278, 455], [455, 294], [308, 292], [292, 415], [415, 308], [429, 358], [358, 355], [355, 429], [265, 340], [340, 372], [372, 265], [352, 346], [346, 280], [280, 352], [295, 442], [442, 282], [282, 295],\n [354, 19], [19, 370], [370, 354], [285, 441], [441, 295], [295, 285], [195, 248], [248, 197], [197, 195], [457, 440], [440, 274], [274, 457], [301, 300], [300, 368], [368, 301], [417, 351], [351, 465], [465, 417],\n [251, 301], [301, 389], [389, 251], [394, 395], [395, 379], [379, 394], [399, 412], [412, 419], [419, 399], [410, 436], [436, 322], [322, 410], [326, 2], [2, 393], [393, 326], [354, 370], [370, 461], [461, 354],\n [393, 164], [164, 267], [267, 393], [268, 302], [302, 12], [12, 268], [312, 268], [268, 13], [13, 312], [298, 293], [293, 301], [301, 298], [265, 446], [446, 340], [340, 265], [280, 330], [330, 425], [425, 280],\n [322, 426], [426, 391], [391, 322], [420, 429], [429, 437], [437, 420], [393, 391], [391, 326], [326, 393], [344, 440], [440, 438], [438, 344], [458, 459], [459, 461], [461, 458], [364, 434], [434, 394], [394, 364],\n [428, 396], [396, 262], [262, 428], [274, 354], [354, 457], [457, 274], [317, 316], [316, 402], [402, 317], [316, 315], [315, 403], [403, 316], [315, 314], [314, 404], [404, 315], [314, 313], [313, 405], [405, 314],\n [313, 421], [421, 406], [406, 313], [323, 366], [366, 361], [361, 323], [292, 306], [306, 407], [407, 292], [306, 291], [291, 408], [408, 306], [291, 287], [287, 409], [409, 291], [287, 432], [432, 410], [410, 287],\n [427, 434], [434, 411], [411, 427], [372, 264], [264, 383], [383, 372], [459, 309], [309, 457], [457, 459], [366, 352], [352, 401], [401, 366], [1, 274], [274, 4], [4, 1], [418, 421], [421, 262], [262, 418],\n [331, 294], [294, 358], [358, 331], [435, 433], [433, 367], [367, 435], [392, 289], [289, 439], [439, 392], [328, 462], [462, 326], [326, 328], [94, 2], [2, 370], [370, 94], [289, 305], [305, 455], [455, 289],\n [339, 254], [254, 448], [448, 339], [359, 255], [255, 446], [446, 359], [254, 253], [253, 449], [449, 254], [253, 252], [252, 450], [450, 253], [252, 256], [256, 451], [451, 252], [256, 341], [341, 452], [452, 256],\n [414, 413], [413, 463], [463, 414], [286, 441], [441, 414], [414, 286], [286, 258], [258, 441], [441, 286], [258, 257], [257, 442], [442, 258], [257, 259], [259, 443], [443, 257], [259, 260], [260, 444], [444, 259],\n [260, 467], [467, 445], [445, 260], [309, 459], [459, 250], [250, 309], [305, 289], [289, 290], [290, 305], [305, 290], [290, 460], [460, 305], [401, 376], [376, 435], [435, 401], [309, 250], [250, 392], [392, 309],\n [376, 411], [411, 433], [433, 376], [453, 341], [341, 464], [464, 453], [357, 453], [453, 465], [465, 357], [343, 357], [357, 412], [412, 343], [437, 343], [343, 399], [399, 437], [344, 360], [360, 440], [440, 344],\n [420, 437], [437, 456], [456, 420], [360, 420], [420, 363], [363, 360], [361, 401], [401, 288], [288, 361], [265, 372], [372, 353], [353, 265], [390, 339], [339, 249], [249, 390], [339, 448], [448, 255], [255, 339],\n];\n\nfunction connectionsToIndices(connections: PairArray) {\n const indices = connections.map((connection) => connection[0]);\n indices.push(connections[connections.length - 1][1]);\n return indices;\n}\n\nexport const MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR = {\n lips: connectionsToIndices(LIPS_CONNECTIONS),\n leftEye: connectionsToIndices(LEFT_EYE_CONNECTIONS),\n leftEyebrow: connectionsToIndices(LEFT_EYEBROW_CONNECTIONS),\n leftIris: connectionsToIndices(LEFT_IRIS_CONNECTIONS),\n rightEye: connectionsToIndices(RIGHT_EYE_CONNECTIONS),\n rightEyebrow: connectionsToIndices(RIGHT_EYEBROW_CONNECTIONS),\n rightIris: connectionsToIndices(RIGHT_IRIS_CONNECTIONS),\n faceOval: connectionsToIndices(FACE_OVAL_CONNECTIONS),\n};\n\nconst indexLabelPairs: Array<[number, string]> = Object.entries(MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR)\n .map(([label, indices]) => indices.map((index) => [index, label] as [number, string]))\n .flat();\n\nexport const MEDIAPIPE_FACE_MESH_KEYPOINTS = new Map(indexLabelPairs);\n\ntype AssignAverage = number[];\nexport interface LandmarksRefinementConfig {\n indexesMapping: number[]; // Maps indexes of the given set of landmarks to indexes of the resulting set of landmarks. Should be non empty and contain the same amount of indexes as landmarks in the corresponding input\n zRefinement: 'none'|'copy'|AssignAverage; // Z refinement instructions.\n}\n\nexport const LANDMARKS_REFINEMENT_LIPS_CONFIG = [\n 61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291, // Lower outer.\n 185, 40, 39, 37, 0, 267, 269, 270, 409, // Upper outer(excluding corners).\n 78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308, // Lower inner.\n 191, 80, 81, 82, 13, 312, 311, 310, 415, // Upper inner(excluding corners).\n 76, 77, 90, 180, 85, 16, 315, 404, 320, 307, 306, // Lower semi - outer.\n 184, 74, 73, 72, 11, 302, 303, 304, 408, // Upper semi - outer(excluding corners).\n 62, 96, 89, 179, 86, 15, 316, 403, 319, 325, 292, // Lower semi - inner.\n 183, 42, 41, 38, 12, 268, 271, 272, 407, // Upper semi - inner(excluding corners).\n];\n\nexport const LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG = [\n 33, 7, 163, 144, 145, 153, 154, 155, 133, // Lower contour.\n 246, 161, 160, 159, 158, 157, 173, // upper contour (excluding corners).\n 130, 25, 110, 24, 23, 22, 26, 112, 243, // Halo x2 lower contour.\n 247, 30, 29, 27, 28, 56, 190, // Halo x2 upper contour (excluding corners).\n 226, 31, 228, 229, 230, 231, 232, 233, 244, // Halo x3 lower contour.\n 113, 225, 224, 223, 222, 221, 189, // Halo x3 upper contour (excluding corners).\n 35, 124, 46, 53, 52, 65, // Halo x4 upper contour (no lower because of mesh structure) or eyebrow inner contour.\n 143, 111, 117, 118, 119, 120, 121, 128, 245, // Halo x5 lower contour.\n 156, 70, 63, 105, 66, 107, 55, 193, // Halo x5 upper contour (excluding corners) or eyebrow outer contour.\n];\n\nexport const LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG = [\n 263, 249, 390, 373, 374, 380, 381, 382, 362, // Lower contour.\n 466, 388, 387, 386, 385, 384, 398, // Upper contour (excluding corners).\n 359, 255, 339, 254, 253, 252, 256, 341, 463, // Halo x2 lower contour.\n 467, 260, 259, 257, 258, 286, 414, // Halo x2 upper contour (excluding corners).\n 446, 261, 448, 449, 450, 451, 452, 453, 464, // Halo x3 lower contour.\n 342, 445, 444, 443, 442, 441, 413, // Halo x3 upper contour (excluding corners).\n 265, 353, 276, 283, 282, 295, // Halo x4 upper contour (no lower because of mesh structure) or/ eyebrow inner contour.\n 372, 340, 346, 347, 348, 349, 350, 357, 465, // Halo x5 lower contour.\n 383, 300, 293, 334, 296, 336, 285, 417, // Halo x5 upper contour (excluding corners) or eyebrow outer contour.\n];\n\nexport const LANDMARKS_REFINEMENT_LEFT_IRIS_CONFIG = [\n 468, // Center.\n 469, // Iris right edge.\n 470, // Iris top edge.\n 471, // Iris left edge.\n 472, // Iris bottom edge.\n];\n/*\nzRefinement: [\n 33, 7, 163, 144, 145, 153, 154, 155, 133, // Lower contour.\n 246, 161, 160, 159, 158, 157, 173, // Upper contour (excluding corners).\n];\n*/\n\nexport const LANDMARKS_REFINEMENT_RIGHT_IRIS_CONFIG = [\n 473, // Center.\n 474, // Iris right edge.\n 475, // Iris top edge.\n 476, // Iris left edge.\n 477, // Iris bottom edge.\n];\n/*\nzRefinement: [\n 263, 249, 390, 373, 374, 380, 381, 382, 362, // Lower contour.\n 466, 388, 387, 386, 385, 384, 398, // Upper contour (excluding corners).\n];\n*/\n", "import * as constants from './constants';\nimport type { Tensor } from '../tfjs/types';\n\nexport async function augment(rawCoords, results: Tensor[]) {\n const t: Record = { // all attention models produce 2d results so it needs to be later augmented with correct z-coords\n // mesh: results[0], // already have it in rawCoords // output_mesh_identity\n // flag: results[1], // already processed in parent // conv_faceflag\n lips: await results.filter((r) => r.size === 160)[0].data() as Float32Array, // 80 x 2d = 160 // output_lips\n irisL: await results.filter((r) => r.size === 10)[0].data() as Float32Array, // 5 x 2d = 10 // output_right_iris\n eyeL: await results.filter((r) => r.size === 142)[0].data() as Float32Array, // 71 x 2d = 142 // output_right_eye\n irisR: await results.filter((r) => r.size === 10)[1].data() as Float32Array, // 5 x 2d = 10 // output_left_iris\n eyeR: await results.filter((r) => r.size === 142)[1].data() as Float32Array, // 71 x 2d = 142// output_left_eye\n };\n\n // augment iris: adds additional 5 keypoints per eye\n const irisLDepth = constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.length; // get average z-coord for iris\n for (let i = 0; i < t.irisL.length / 2; i++) rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], irisLDepth]);\n const irisRDepth = constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.length; // get average z-coord for iris\n for (let i = 0; i < t.irisR.length / 2; i++) rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], irisRDepth]);\n\n // augment eyes: replaces eye keypoints based on heuristic mapping\n for (let i = 0; i < t.eyeL.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]] = [t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]][2]];\n for (let i = 0; i < t.eyeR.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]] = [t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]][2]];\n\n // augment lips: replaces eye keypoints based on heuristic mapping\n for (let i = 0; i < t.lips.length / 2; i++) rawCoords[constants.LANDMARKS_REFINEMENT_LIPS_CONFIG[i]] = [t.lips[2 * i + 0], t.lips[2 * i + 1], rawCoords[constants.LANDMARKS_REFINEMENT_LIPS_CONFIG[i]][2]];\n\n return rawCoords;\n}\n", "/**\n * BlazeFace, FaceMesh & Iris model implementation\n *\n * Based on:\n * - [**MediaPipe BlazeFace**](https://drive.google.com/file/d/1f39lSzU5Oq-j_OXgS67KfN5wNsoeAZ4V/view)\n * - Facial Spacial Geometry: [**MediaPipe FaceMesh**](https://drive.google.com/file/d/1VFC_wIpw4O7xBOiTgUldl79d9LA-LsnA/view)\n * - Eye Iris Details: [**MediaPipe Iris**](https://drive.google.com/file/d/1bsWbokp9AklH2ANjCfmjqEzzxO1CNbMu/view)\n */\n\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as util from './facemeshutil';\nimport * as coords from './facemeshcoords';\nimport * as iris from './iris';\nimport * as attention from './attention';\nimport { histogramEqualization } from '../image/enhance';\nimport { env } from '../util/env';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { FaceResult, FaceLandmark, Point } from '../result';\nimport type { Config } from '../config';\n\ntype DetectBox = { startPoint: Point, endPoint: Point, landmarks: Array, confidence: number };\n\nconst cache = {\n boxes: [] as DetectBox[],\n skipped: Number.MAX_SAFE_INTEGER,\n timestamp: 0,\n};\n\nlet model: GraphModel | null = null;\nlet inputSize = 0;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n // reset cached boxes\n const skipTime = (config.face.detector?.skipTime || 0) > (now() - cache.timestamp);\n const skipFrame = cache.skipped < (config.face.detector?.skipFrames || 0);\n if (!config.skipAllowed || !skipTime || !skipFrame || cache.boxes.length === 0) {\n cache.boxes = await blazeface.getBoxes(input, config); // get results from blazeface detector\n cache.timestamp = now();\n cache.skipped = 0;\n } else {\n cache.skipped++;\n }\n const faces: Array = [];\n const newCache: Array = [];\n let id = 0;\n for (let i = 0; i < cache.boxes.length; i++) {\n const box = cache.boxes[i];\n let angle = 0;\n let rotationMatrix;\n const face: FaceResult = { // init face result\n id: id++,\n mesh: [],\n meshRaw: [],\n box: [0, 0, 0, 0],\n boxRaw: [0, 0, 0, 0],\n score: 0,\n boxScore: 0,\n faceScore: 0,\n // contoursRaw: [],\n // contours: [],\n annotations: {} as Record,\n };\n\n // optional rotation correction based on detector data only if mesh is disabled otherwise perform it later when we have more accurate mesh data. if no rotation correction this function performs crop\n [angle, rotationMatrix, face.tensor] = util.correctFaceRotation(config.face.detector?.rotation, box, input, config.face.mesh?.enabled ? inputSize : blazeface.size());\n if (config?.filter?.equalization) {\n const equilized = await histogramEqualization(face.tensor as Tensor);\n tf.dispose(face.tensor);\n face.tensor = equilized;\n }\n face.boxScore = Math.round(100 * box.confidence) / 100;\n if (!config.face.mesh?.enabled) { // mesh not enabled, return resuts from detector only\n face.box = util.clampBox(box, input);\n face.boxRaw = util.getRawBox(box, input);\n face.score = face.boxScore;\n face.mesh = box.landmarks.map((pt) => [\n ((box.startPoint[0] + box.endPoint[0])) / 2 + ((box.endPoint[0] + box.startPoint[0]) * pt[0] / blazeface.size()),\n ((box.startPoint[1] + box.endPoint[1])) / 2 + ((box.endPoint[1] + box.startPoint[1]) * pt[1] / blazeface.size()),\n ]);\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.blazeFaceLandmarks)) {\n face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n }\n } else if (!model) { // mesh enabled, but not loaded\n if (config.debug) log('face mesh detection requested, but model is not loaded');\n } else { // mesh enabled\n if (config.face.attention?.enabled && !env.kernels.includes('atan2')) {\n tf.dispose(face.tensor);\n return faces;\n }\n const results = model.execute(face.tensor as Tensor) as Array;\n const confidenceT = results.find((t) => t.shape[t.shape.length - 1] === 1) as Tensor;\n const faceConfidence = await confidenceT.data();\n face.faceScore = Math.round(100 * faceConfidence[0]) / 100;\n\n if (face.faceScore < (config.face.detector?.minConfidence || 1)) { // low confidence in detected mesh\n box.confidence = face.faceScore; // reset confidence of cached box\n if (config.face.mesh?.keepInvalid) {\n face.box = util.clampBox(box, input);\n face.boxRaw = util.getRawBox(box, input);\n face.score = face.boxScore;\n face.mesh = box.landmarks.map((pt) => [\n ((box.startPoint[0] + box.endPoint[0])) / 2 + ((box.endPoint[0] + box.startPoint[0]) * pt[0] / blazeface.size()),\n ((box.startPoint[1] + box.endPoint[1])) / 2 + ((box.endPoint[1] + box.startPoint[1]) * pt[1] / blazeface.size()),\n ]);\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 1), pt[1] / (input.shape[1] || 1), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.blazeFaceLandmarks)) {\n face.annotations[key] = [face.mesh[coords.blazeFaceLandmarks[key] as number]]; // add annotations\n }\n }\n } else {\n const meshT = results.find((t) => t.shape[t.shape.length - 1] === 1404) as Tensor;\n const coordsReshaped = tf.reshape(meshT, [-1, 3]);\n let rawCoords = await coordsReshaped.array();\n tf.dispose(coordsReshaped);\n if (config.face.attention?.enabled) {\n rawCoords = await attention.augment(rawCoords, results); // augment iris results using attention model results\n } else if (config.face.iris?.enabled) {\n rawCoords = await iris.augmentIris(rawCoords, face.tensor, config, inputSize); // run iris model and augment results\n }\n face.mesh = util.transformRawCoords(rawCoords, box, angle, rotationMatrix, inputSize); // get processed mesh\n face.meshRaw = face.mesh.map((pt) => [pt[0] / (input.shape[2] || 0), pt[1] / (input.shape[1] || 0), (pt[2] || 0) / inputSize]);\n for (const key of Object.keys(coords.meshAnnotations)) face.annotations[key] = coords.meshAnnotations[key].map((index) => face.mesh[index]); // add annotations\n face.score = face.faceScore;\n const calculatedBox = { ...util.calculateFaceBox(face.mesh, box), confidence: box.confidence, landmarks: box.landmarks };\n face.box = util.clampBox(calculatedBox, input);\n face.boxRaw = util.getRawBox(calculatedBox, input);\n /*\n const contoursT = results.find((t) => t.shape[t.shape.length - 1] === 266) as Tensor;\n const contoursData = contoursT && await contoursT.data(); // 133 x 2d points\n face.contoursRaw = [];\n for (let j = 0; j < contoursData.length / 2; j++) face.contoursRaw.push([contoursData[2 * j + 0] / inputSize, contoursData[2 * j + 1] / inputSize]);\n face.contours = face.contoursRaw.map((c) => [Math.trunc((input.shape[2] || 1) * c[0]), Math.trunc((input.shape[1] || 1) * c[1])]);\n */\n newCache.push(calculatedBox);\n }\n tf.dispose(results);\n }\n if (face.score > (config.face.detector?.minConfidence || 1)) faces.push(face);\n else tf.dispose(face.tensor);\n }\n cache.boxes = newCache; // reset cache\n return faces;\n}\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n // @ts-ignore private property\n if (config?.face?.attention?.enabled && model?.signature) {\n // @ts-ignore private property\n if (Object.keys(model?.signature?.outputs || {}).length < 6) model = null;\n }\n if (!model) {\n if (config.face.attention?.enabled) model = await loadModel(config.face.attention?.modelPath);\n else model = await loadModel(config.face.mesh?.modelPath);\n } else if (config.debug) {\n log('cached model:', model['modelUrl']);\n }\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n return model;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "/**\n * FaceRes model implementation\n *\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n *\n * Based on: [**HSE-FaceRes**](https://github.com/HSE-asavchenko/HSE_FaceRec_tf)\n */\n\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport type { Gender, Race } from '../result';\n\nexport type FaceRes = { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] };\n\nlet model: GraphModel | null;\nconst last: Array<{\n age: number,\n gender: Gender,\n genderScore: number,\n descriptor: number[],\n}> = [];\n\nlet lastTime = 0;\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.description?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport function enhance(input): Tensor {\n const tensor = (input.image || input.tensor || input) as Tensor; // input received from detector is already normalized to 0..1, input is also assumed to be straightened\n if (!model?.inputs[0].shape) return tensor; // model has no shape so no point continuing\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const norm = tf.mul(crop, constants.tf255);\n tf.dispose(crop);\n return norm;\n /*\n // do a tight crop of image and resize it to fit the model\n const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n const crop = (tensor.shape.length === 3)\n ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n */\n /*\n // convert to black&white to avoid colorization impact\n const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const [red, green, blue] = tf.split(crop, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n */\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return { age: 0, gender: 'unknown', genderScore: 0, descriptor: [] };\n const skipFrame = skipped < (config.face.description?.skipFrames || 0);\n const skipTime = (config.face.description?.skipTime || 0) > (now() - lastTime);\n if (config.skipAllowed && skipFrame && skipTime && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const obj = {\n age: 0,\n gender: 'unknown',\n genderScore: 0,\n descriptor: [],\n };\n\n if (config.face.description?.enabled) {\n const enhanced = enhance(image);\n const resT = model?.execute(enhanced) as Tensor[];\n lastTime = now();\n tf.dispose(enhanced);\n const genderT = await resT.find((t) => t.shape[1] === 1) as Tensor;\n const gender = await genderT.data();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > (config.face.description?.minConfidence || 0)) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderScore = Math.min(0.99, confidence);\n }\n const argmax = tf.argMax(resT.find((t) => t.shape[1] === 100), 1);\n const age = (await argmax.data())[0];\n tf.dispose(argmax);\n const ageT = resT.find((t) => t.shape[1] === 100) as Tensor;\n const all = await ageT.data();\n obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n const desc = resT.find((t) => t.shape[1] === 1024);\n // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n const descriptor = desc ? await desc.data() : [];\n obj.descriptor = Array.from(descriptor);\n resT.forEach((t) => tf.dispose(t));\n }\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport type { Point } from '../result';\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]] as Point;\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]] as Point;\n const palmLandmarks = box.palmLandmarks.map((coord) => {\n const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n return scaledCoord;\n });\n return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]] as Point;\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [centers[0] - halfSize, centers[1] - halfSize] as Point;\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n const boxSize = [\n box.endPoint[0] - box.startPoint[0],\n box.endPoint[1] - box.startPoint[1],\n ];\n const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]] as Point;\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]] as Point;\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n", "/**\n * HandPose model implementation constants\n * See `handpose.ts` for entry point\n */\n\nexport const anchors = [\n { x: 0.015625, y: 0.015625 },\n { x: 0.015625, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.046875, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.078125, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.109375, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.140625, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.171875, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.203125, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.234375, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.265625, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.296875, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.328125, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.359375, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.390625, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.421875, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.453125, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.484375, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.515625, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.546875, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.578125, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.609375, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.640625, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.671875, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.703125, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.734375, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.765625, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.796875, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.828125, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.859375, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.890625, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.921875, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.953125, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.984375, y: 0.015625 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.015625, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.046875, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.078125, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.109375, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.140625, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.171875, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.203125, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.234375, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.265625, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.296875, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.328125, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.359375, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.390625, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.421875, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.453125, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.484375, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.515625, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.546875, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.578125, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.609375, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.640625, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.671875, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.703125, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.734375, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.765625, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.796875, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.828125, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.859375, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.890625, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.921875, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.953125, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.984375, y: 0.046875 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.015625, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.046875, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.078125, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.109375, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.140625, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.171875, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.203125, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.234375, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.265625, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.296875, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.328125, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.359375, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.390625, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.421875, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.453125, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.484375, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.515625, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.546875, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.578125, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.609375, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.640625, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.671875, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.703125, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.734375, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.765625, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.796875, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.828125, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.859375, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.890625, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.921875, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.953125, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.984375, y: 0.078125 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.015625, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.046875, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.078125, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.109375, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.140625, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.171875, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.203125, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.234375, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.265625, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.296875, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.328125, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.359375, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.390625, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.421875, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.453125, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.484375, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.515625, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.546875, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.578125, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.609375, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.640625, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.671875, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.703125, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.734375, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.765625, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.796875, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.828125, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.859375, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.890625, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.921875, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.953125, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.984375, y: 0.109375 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.015625, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.046875, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.078125, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.109375, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.140625, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.171875, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.203125, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.234375, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.265625, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.296875, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.328125, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.359375, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.390625, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.421875, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.453125, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.484375, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.515625, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.546875, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.578125, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.609375, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.640625, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.671875, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.703125, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.734375, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.765625, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.796875, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.828125, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.859375, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.890625, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.921875, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.953125, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.984375, y: 0.140625 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.015625, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.046875, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.078125, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.109375, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.140625, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.171875, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.203125, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.234375, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.265625, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.296875, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.328125, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.359375, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.390625, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.421875, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.453125, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.484375, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.515625, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.546875, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.578125, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.609375, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.640625, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.671875, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.703125, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.734375, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.765625, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.796875, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.828125, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.859375, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.890625, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.921875, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.953125, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.984375, y: 0.171875 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.015625, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.046875, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.078125, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.109375, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.140625, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.171875, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.203125, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.234375, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.265625, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.296875, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.328125, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.359375, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.390625, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.421875, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.453125, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.484375, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.515625, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.546875, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.578125, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.609375, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.640625, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.671875, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.703125, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.734375, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.765625, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.796875, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.828125, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.859375, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.890625, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.921875, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.953125, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.984375, y: 0.203125 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.015625, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.046875, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.078125, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.109375, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.140625, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.171875, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.203125, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.234375, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.265625, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.296875, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.328125, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.359375, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.390625, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.421875, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.453125, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.484375, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.515625, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.546875, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.578125, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.609375, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.640625, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.671875, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.703125, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.734375, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.765625, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.796875, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.828125, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.859375, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.890625, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.921875, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.953125, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.984375, y: 0.234375 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.015625, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.046875, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.078125, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.109375, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.140625, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.171875, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.203125, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.234375, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.265625, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.296875, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.328125, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.359375, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.390625, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.421875, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.453125, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.484375, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.515625, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.546875, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.578125, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.609375, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.640625, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.671875, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.703125, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.734375, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.765625, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.796875, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.828125, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.859375, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.890625, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.921875, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.953125, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.984375, y: 0.265625 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.015625, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.046875, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.078125, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.109375, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.140625, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.171875, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.203125, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.234375, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.265625, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.296875, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.328125, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.359375, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.390625, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.421875, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.453125, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.484375, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.515625, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.546875, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.578125, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.609375, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.640625, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.671875, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.703125, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.734375, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.765625, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.796875, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.828125, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.859375, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.890625, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.921875, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.953125, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.984375, y: 0.296875 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.015625, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.046875, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.078125, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.109375, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.140625, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.171875, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.203125, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.234375, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.265625, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.296875, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.328125, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.359375, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.390625, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.421875, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.453125, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.484375, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.515625, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.546875, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.578125, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.609375, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.640625, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.671875, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.703125, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.734375, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.765625, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.796875, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.828125, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.859375, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.890625, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.921875, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.953125, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.984375, y: 0.328125 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.015625, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.046875, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.078125, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.109375, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.140625, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.171875, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.203125, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.234375, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.265625, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.296875, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.328125, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.359375, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.390625, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.421875, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.453125, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.484375, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.515625, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.546875, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.578125, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.609375, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.640625, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.671875, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.703125, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.734375, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.765625, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.796875, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.828125, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.859375, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.890625, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.921875, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.953125, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.984375, y: 0.359375 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.015625, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.046875, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.078125, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.109375, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.140625, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.171875, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.203125, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.234375, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.265625, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.296875, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.328125, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.359375, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.390625, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.421875, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.453125, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.484375, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.515625, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.546875, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.578125, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.609375, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.640625, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.671875, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.703125, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.734375, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.765625, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.796875, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.828125, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.859375, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.890625, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.921875, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.953125, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.984375, y: 0.390625 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.015625, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.046875, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.078125, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.109375, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.140625, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.171875, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.203125, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.234375, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.265625, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.296875, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.328125, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.359375, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.390625, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.421875, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.453125, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.484375, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.515625, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.546875, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.578125, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.609375, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.640625, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.671875, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.703125, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.734375, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.765625, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.796875, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.828125, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.859375, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.890625, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.921875, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.953125, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.984375, y: 0.421875 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.015625, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.046875, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.078125, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.109375, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.140625, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.171875, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.203125, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.234375, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.265625, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.296875, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.328125, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.359375, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.390625, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.421875, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.453125, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.484375, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.515625, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.546875, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.578125, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.609375, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.640625, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.671875, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.703125, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.734375, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.765625, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.796875, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.828125, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.859375, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.890625, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.921875, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.953125, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.984375, y: 0.453125 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.015625, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.046875, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.078125, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.109375, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.140625, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.171875, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.203125, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.234375, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.265625, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.296875, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.328125, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.359375, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.390625, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.421875, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.453125, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.484375, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.515625, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.546875, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.578125, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.609375, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.640625, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.671875, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.703125, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.734375, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.765625, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.796875, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.828125, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.859375, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.890625, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.921875, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.953125, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.984375, y: 0.484375 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.015625, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.046875, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.078125, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.109375, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.140625, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.171875, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.203125, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.234375, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.265625, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.296875, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.328125, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.359375, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.390625, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.421875, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.453125, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.484375, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.515625, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.546875, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.578125, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.609375, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.640625, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.671875, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.703125, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.734375, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.765625, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.796875, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.828125, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.859375, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.890625, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.921875, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.953125, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.984375, y: 0.515625 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.015625, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.046875, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.078125, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.109375, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.140625, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.171875, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.203125, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.234375, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.265625, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.296875, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.328125, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.359375, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.390625, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.421875, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.453125, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.484375, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.515625, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.546875, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.578125, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.609375, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.640625, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.671875, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.703125, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.734375, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.765625, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.796875, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.828125, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.859375, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.890625, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.921875, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.953125, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.984375, y: 0.546875 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.015625, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.046875, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.078125, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.109375, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.140625, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.171875, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.203125, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.234375, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.265625, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.296875, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.328125, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.359375, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.390625, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.421875, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.453125, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.484375, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.515625, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.546875, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.578125, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.609375, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.640625, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.671875, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.703125, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.734375, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.765625, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.796875, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.828125, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.859375, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.890625, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.921875, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.953125, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.984375, y: 0.578125 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.015625, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.046875, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.078125, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.109375, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.140625, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.171875, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.203125, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.234375, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.265625, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.296875, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.328125, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.359375, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.390625, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.421875, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.453125, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.484375, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.515625, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.546875, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.578125, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.609375, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.640625, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.671875, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.703125, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.734375, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.765625, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.796875, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.828125, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.859375, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.890625, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.921875, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.953125, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.984375, y: 0.609375 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.015625, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.046875, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.078125, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.109375, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.140625, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.171875, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.203125, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.234375, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.265625, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.296875, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.328125, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.359375, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.390625, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.421875, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.453125, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.484375, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.515625, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.546875, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.578125, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.609375, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.640625, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.671875, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.703125, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.734375, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.765625, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.796875, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.828125, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.859375, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.890625, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.921875, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.953125, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.984375, y: 0.640625 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.015625, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.046875, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.078125, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.109375, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.140625, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.171875, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.203125, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.234375, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.265625, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.296875, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.328125, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.359375, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.390625, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.421875, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.453125, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.484375, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.515625, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.546875, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.578125, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.609375, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.640625, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.671875, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.703125, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.734375, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.765625, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.796875, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.828125, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.859375, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.890625, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.921875, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.953125, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.984375, y: 0.671875 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.015625, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.046875, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.078125, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.109375, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.140625, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.171875, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.203125, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.234375, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.265625, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.296875, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.328125, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.359375, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.390625, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.421875, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.453125, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.484375, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.515625, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.546875, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.578125, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.609375, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.640625, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.671875, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.703125, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.734375, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.765625, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.796875, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.828125, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.859375, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.890625, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.921875, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.953125, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.984375, y: 0.703125 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.015625, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.046875, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.078125, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.109375, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.140625, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.171875, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.203125, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.234375, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.265625, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.296875, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.328125, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.359375, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.390625, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.421875, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.453125, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.484375, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.515625, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.546875, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.578125, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.609375, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.640625, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.671875, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.703125, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.734375, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.765625, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.796875, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.828125, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.859375, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.890625, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.921875, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.953125, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.984375, y: 0.734375 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.015625, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.046875, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.078125, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.109375, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.140625, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.171875, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.203125, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.234375, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.265625, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.296875, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.328125, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.359375, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.390625, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.421875, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.453125, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.484375, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.515625, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.546875, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.578125, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.609375, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.640625, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.671875, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.703125, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.734375, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.765625, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.796875, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.828125, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.859375, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.890625, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.921875, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.953125, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.984375, y: 0.765625 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.015625, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.046875, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.078125, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.109375, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.140625, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.171875, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.203125, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.234375, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.265625, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.296875, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.328125, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.359375, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.390625, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.421875, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.453125, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.484375, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.515625, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.546875, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.578125, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.609375, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.640625, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.671875, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.703125, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.734375, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.765625, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.796875, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.828125, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.859375, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.890625, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.921875, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.953125, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.984375, y: 0.796875 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.015625, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.046875, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.078125, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.109375, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.140625, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.171875, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.203125, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.234375, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.265625, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.296875, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.328125, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.359375, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.390625, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.421875, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.453125, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.484375, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.515625, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.546875, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.578125, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.609375, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.640625, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.671875, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.703125, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.734375, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.765625, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.796875, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.828125, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.859375, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.890625, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.921875, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.953125, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.984375, y: 0.828125 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.015625, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.046875, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.078125, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.109375, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.140625, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.171875, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.203125, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.234375, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.265625, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.296875, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.328125, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.359375, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.390625, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.421875, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.453125, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.484375, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.515625, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.546875, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.578125, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.609375, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.640625, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.671875, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.703125, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.734375, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.765625, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.796875, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.828125, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.859375, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.890625, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.921875, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.953125, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.984375, y: 0.859375 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.015625, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.046875, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.078125, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.109375, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.140625, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.171875, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.203125, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.234375, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.265625, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.296875, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.328125, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.359375, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.390625, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.421875, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.453125, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.484375, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.515625, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.546875, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.578125, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.609375, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.640625, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.671875, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.703125, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.734375, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.765625, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.796875, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.828125, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.859375, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.890625, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.921875, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.953125, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.984375, y: 0.890625 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.015625, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.046875, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.078125, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.109375, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.140625, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.171875, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.203125, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.234375, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.265625, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.296875, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.328125, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.359375, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.390625, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.421875, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.453125, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.484375, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.515625, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.546875, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.578125, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.609375, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.640625, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.671875, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.703125, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.734375, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.765625, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.796875, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.828125, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.859375, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.890625, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.921875, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.953125, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.984375, y: 0.921875 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.015625, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.046875, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.078125, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.109375, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.140625, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.171875, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.203125, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.234375, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.265625, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.296875, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.328125, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.359375, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.390625, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.421875, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.453125, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.484375, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.515625, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.546875, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.578125, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.609375, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.640625, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.671875, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.703125, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.734375, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.765625, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.796875, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.828125, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.859375, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.890625, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.921875, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.953125, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.984375, y: 0.953125 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.015625, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.046875, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.078125, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.109375, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.140625, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.171875, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.203125, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.234375, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.265625, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.296875, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.328125, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.359375, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.390625, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.421875, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.453125, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.484375, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.515625, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.546875, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.578125, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.609375, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.640625, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.671875, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.703125, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.734375, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.765625, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.796875, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.828125, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.859375, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.890625, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.921875, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.953125, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.984375, y: 0.984375 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.03125, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.09375, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.15625, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.21875, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.28125, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.34375, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.40625, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.46875, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.53125, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.59375, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.65625, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.71875, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.78125, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.84375, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.90625, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.96875, y: 0.03125 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.03125, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.09375, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.15625, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.21875, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.28125, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.34375, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.40625, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.46875, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.53125, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.59375, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.65625, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.71875, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.78125, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.84375, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.90625, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.96875, y: 0.09375 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.03125, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.09375, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.15625, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.21875, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.28125, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.34375, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.40625, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.46875, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.53125, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.59375, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.65625, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.71875, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.78125, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.84375, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.90625, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.96875, y: 0.15625 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.03125, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.09375, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.15625, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.21875, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.28125, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.34375, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.40625, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.46875, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.53125, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.59375, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.65625, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.71875, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.78125, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.84375, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.90625, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.96875, y: 0.21875 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.03125, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.09375, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.15625, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.21875, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.28125, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.34375, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.40625, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.46875, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.53125, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.59375, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.65625, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.71875, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.78125, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.84375, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.90625, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.96875, y: 0.28125 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.03125, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.09375, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.15625, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.21875, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.28125, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.34375, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.40625, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.46875, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.53125, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.59375, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.65625, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.71875, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.78125, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.84375, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.90625, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.96875, y: 0.34375 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.03125, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.09375, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.15625, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.21875, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.28125, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.34375, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.40625, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.46875, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.53125, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.59375, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.65625, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.71875, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.78125, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.84375, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.90625, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.96875, y: 0.40625 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.03125, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.09375, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.15625, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.21875, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.28125, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.34375, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.40625, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.46875, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.53125, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.59375, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.65625, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.71875, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.78125, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.84375, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.90625, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.96875, y: 0.46875 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.03125, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.09375, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.15625, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.21875, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.28125, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.34375, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.40625, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.46875, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.53125, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.59375, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.65625, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.71875, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.78125, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.84375, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.90625, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.96875, y: 0.53125 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.03125, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.09375, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.15625, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.21875, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.28125, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.34375, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.40625, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.46875, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.53125, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.59375, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.65625, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.71875, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.78125, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.84375, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.90625, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.96875, y: 0.59375 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.03125, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.09375, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.15625, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.21875, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.28125, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.34375, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.40625, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.46875, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.53125, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.59375, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.65625, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.71875, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.78125, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.84375, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.90625, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.96875, y: 0.65625 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.03125, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.09375, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.15625, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.21875, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.28125, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.34375, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.40625, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.46875, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.53125, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.59375, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.65625, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.71875, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.78125, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.84375, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.90625, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.96875, y: 0.71875 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.03125, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.09375, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.15625, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.21875, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.28125, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.34375, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.40625, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.46875, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.53125, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.59375, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.65625, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.71875, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.78125, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.84375, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.90625, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.96875, y: 0.78125 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.03125, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.09375, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.15625, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.21875, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.28125, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.34375, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.40625, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.46875, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.53125, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.59375, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.65625, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.71875, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.78125, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.84375, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.90625, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.96875, y: 0.84375 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.03125, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.09375, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.15625, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.21875, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.28125, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.34375, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.40625, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.46875, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.53125, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.59375, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.65625, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.71875, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.78125, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.84375, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.90625, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.96875, y: 0.90625 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.03125, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.09375, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.15625, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.21875, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.28125, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.34375, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.40625, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.46875, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.53125, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.59375, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.65625, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.71875, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.78125, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.84375, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.90625, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.96875, y: 0.96875 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.0625, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.1875, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.3125, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.4375, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.5625, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.6875, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.8125, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.9375, y: 0.0625 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.0625, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.1875, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.3125, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.4375, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.5625, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.6875, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.8125, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.9375, y: 0.1875 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.0625, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.1875, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.3125, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.4375, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.5625, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.6875, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.8125, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.9375, y: 0.3125 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.0625, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.1875, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.3125, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.4375, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.5625, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.6875, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.8125, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.9375, y: 0.4375 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.0625, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.1875, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.3125, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.4375, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.5625, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.6875, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.8125, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.9375, y: 0.5625 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.0625, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.1875, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.3125, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.4375, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.5625, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.6875, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.8125, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.9375, y: 0.6875 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.0625, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.1875, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.3125, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.4375, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.5625, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.6875, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.8125, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.9375, y: 0.8125 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.0625, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.1875, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.3125, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.4375, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.5625, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.6875, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.8125, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n { x: 0.9375, y: 0.9375 },\n];\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport * as anchors from './handposeanchors';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Point } from '../result';\n\nexport class HandDetector {\n model: GraphModel;\n anchors: number[][];\n anchorsTensor: Tensor;\n inputSize: number;\n inputSizeTensor: Tensor;\n doubleInputSizeTensor: Tensor;\n\n constructor(model) {\n this.model = model;\n this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n this.anchorsTensor = tf.tensor2d(this.anchors);\n this.inputSize = (this.model && this.model.inputs && this.model.inputs[0].shape) ? this.model.inputs[0].shape[2] : 0;\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n const t: Record = {};\n t.boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n t.boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n t.div = tf.div(t.boxOffsets, this.inputSizeTensor);\n t.boxCenterPoints = tf.add(t.div, this.anchorsTensor);\n t.halfBoxSizes = tf.div(t.boxSizes, this.doubleInputSizeTensor);\n t.sub = tf.sub(t.boxCenterPoints, t.halfBoxSizes);\n t.startPoints = tf.mul(t.sub, this.inputSizeTensor);\n t.add = tf.add(t.boxCenterPoints, t.halfBoxSizes);\n t.endPoints = tf.mul(t.add, this.inputSizeTensor);\n const res = tf.concat2d([t.startPoints, t.endPoints], 1);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n const t: Record = {};\n t.reshape = tf.reshape(rawPalmLandmarks, [-1, 7, 2]);\n t.div = tf.div(t.reshape, this.inputSizeTensor);\n t.landmarks = tf.add(t.div, this.anchors[index]);\n const res = tf.mul(t.landmarks, this.inputSizeTensor);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return res;\n }\n\n async predict(input, config): Promise<{ startPoint: Point; endPoint: Point, palmLandmarks: Point[]; confidence: number }[]> {\n const t: Record = {};\n t.resize = tf.image.resizeBilinear(input, [this.inputSize, this.inputSize]);\n t.div = tf.div(t.resize, constants.tf127);\n t.image = tf.sub(t.div, constants.tf1);\n t.batched = this.model.execute(t.image) as Tensor;\n t.predictions = tf.squeeze(t.batched);\n t.slice = tf.slice(t.predictions, [0, 0], [-1, 1]);\n t.sigmoid = tf.sigmoid(t.slice);\n t.scores = tf.squeeze(t.sigmoid);\n const scores = await t.scores.data();\n t.boxes = tf.slice(t.predictions, [0, 1], [-1, 4]);\n t.norm = this.normalizeBoxes(t.boxes);\n // box detection is flaky so we look for 3x boxes than we need results\n t.nms = tf.image.nonMaxSuppression(t.norm, t.scores, 3 * config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const nms = await t.nms.array() as Array;\n const hands: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number }> = [];\n for (const index of nms) {\n const p: Record = {};\n p.box = tf.slice(t.norm, [index, 0], [1, -1]);\n p.slice = tf.slice(t.predictions, [index, 5], [1, 14]);\n p.norm = this.normalizeLandmarks(p.slice, index);\n p.palmLandmarks = tf.reshape(p.norm, [-1, 2]);\n const box = await p.box.data();\n const startPoint = box.slice(0, 2) as unknown as Point;\n const endPoint = box.slice(2, 4) as unknown as Point;\n const palmLandmarks = await p.palmLandmarks.array();\n const hand = { startPoint, endPoint, palmLandmarks, confidence: scores[index] };\n const scaled = util.scaleBoxCoordinates(hand, [input.shape[2] / this.inputSize, input.shape[1] / this.inputSize]);\n hands.push(scaled);\n Object.keys(p).forEach((tensor) => tf.dispose(p[tensor]));\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return hands;\n }\n}\n", "/**\n * HandPose model implementation\n * See `handpose.ts` for entry point\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as util from './handposeutil';\nimport type * as detector from './handposedetector';\nimport { constants } from '../tfjs/constants';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport { env } from '../util/env';\nimport { now } from '../util/util';\nimport type { Point } from '../result';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\nlet lastTime = 0;\n\nexport class HandPipeline {\n handDetector: detector.HandDetector;\n handPoseModel: GraphModel;\n inputSize: number;\n storedBoxes: Array<{ startPoint: Point; endPoint: Point; palmLandmarks: Point[]; confidence: number } | null>;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, handPoseModel) {\n this.handDetector = handDetector;\n this.handPoseModel = handPoseModel;\n this.inputSize = this.handPoseModel && this.handPoseModel.inputs[0].shape ? this.handPoseModel.inputs[0].shape[2] : 0;\n this.storedBoxes = [];\n this.skipped = Number.MAX_SAFE_INTEGER;\n this.detectedHands = 0;\n }\n\n // eslint-disable-next-line class-methods-use-this\n calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint };\n }\n\n getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n return util.enlargeBox(util.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = util.enlargeBox(util.squarifyBox(boundingBox), handBoxEnlargeFactor);\n boxAroundHand.palmLandmarks = [];\n for (let i = 0; i < palmLandmarkIds.length; i++) {\n boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n }\n return boxAroundHand;\n }\n\n transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n const boxSize = util.getBoxSize(box2);\n const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n const coordsScaled = rawCoords.map((coord) => [\n scaleFactor[0] * (coord[0] - this.inputSize / 2),\n scaleFactor[1] * (coord[1] - this.inputSize / 2),\n scaleFactor[2] * coord[2],\n ]);\n const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n const coordsRotated = coordsScaled.map((coord) => {\n const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n return [...rotated, coord[2]];\n });\n const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n const boxCenter = [...util.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n Math.trunc(coord[0] + originalBoxCenter[0]),\n Math.trunc(coord[1] + originalBoxCenter[1]),\n Math.trunc(coord[2]),\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames\n let boxes;\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = this.skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n boxes = await this.handDetector.predict(image, config);\n this.skipped = 0;\n }\n if (config.skipAllowed) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n this.detectedHands = 0;\n this.storedBoxes = [...boxes];\n // for (const possible of boxes) this.storedBoxes.push(possible);\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n const hands: Array<{ landmarks: Point[], confidence: number, boxConfidence: number, fingerConfidence: number, box: { topLeft: Point, bottomRight: Point } }> = [];\n\n // go through working set of boxes\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const currentBox = this.storedBoxes[i];\n if (!currentBox) continue;\n if (config.hand.landmarks) {\n const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n const palmCenter = util.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation && env.kernels.includes('rotatewithoffset') ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n const croppedInput = util.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = tf.div(croppedInput, constants.tf255);\n tf.dispose(croppedInput);\n tf.dispose(rotatedImage);\n const [confidenceT, keypoints] = this.handPoseModel.execute(handImage) as Array;\n lastTime = now();\n tf.dispose(handImage);\n const confidence = (await confidenceT.data())[0];\n tf.dispose(confidenceT);\n if (confidence >= config.hand.minConfidence / 4) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = await keypointsReshaped.array();\n tf.dispose(keypoints);\n tf.dispose(keypointsReshaped);\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = { ...nextBoundingBox, confidence };\n const result = {\n landmarks: coords,\n confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n tf.dispose(keypoints);\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = util.enlargeBox(util.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n boxConfidence: currentBox.confidence,\n fingerConfidence: 0,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n landmarks: [],\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n if (hands.length > config.hand.maxDetected) hands.length = config.hand.maxDetected;\n return hands;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nexport const Finger = {\n thumb: 0,\n index: 1,\n middle: 2,\n ring: 3,\n pinky: 4,\n all: [0, 1, 2, 3, 4], // just for convenience\n nameMapping: { 0: 'thumb', 1: 'index', 2: 'middle', 3: 'ring', 4: 'pinky' },\n // Describes mapping of joints based on the 21 points returned by handpose.\n // [0] Palm\n // [1-4] Thumb\n // [5-8] Index\n // [9-12] Middle\n // [13-16] Ring\n // [17-20] Pinky\n pointsMapping: {\n 0: [[0, 1], [1, 2], [2, 3], [3, 4]],\n 1: [[0, 5], [5, 6], [6, 7], [7, 8]],\n 2: [[0, 9], [9, 10], [10, 11], [11, 12]],\n 3: [[0, 13], [13, 14], [14, 15], [15, 16]],\n 4: [[0, 17], [17, 18], [18, 19], [19, 20]],\n },\n getName: (value) => Finger.nameMapping[value],\n getPoints: (value) => Finger.pointsMapping[value],\n};\n\nexport const FingerCurl = {\n none: 0,\n half: 1,\n full: 2,\n nameMapping: { 0: 'none', 1: 'half', 2: 'full' },\n getName: (value) => FingerCurl.nameMapping[value],\n};\n\nexport const FingerDirection = {\n verticalUp: 0,\n verticalDown: 1,\n horizontalLeft: 2,\n horizontalRight: 3,\n diagonalUpRight: 4,\n diagonalUpLeft: 5,\n diagonalDownRight: 6,\n diagonalDownLeft: 7,\n nameMapping: { 0: 'verticalUp', 1: 'verticalDown', 2: 'horizontalLeft', 3: 'horizontalRight', 4: 'diagonalUpRight', 5: 'diagonalUpLeft', 6: 'diagonalDownRight', 7: 'diagonalDownLeft' },\n getName: (value) => FingerDirection.nameMapping[value],\n};\n\nexport class FingerGesture {\n name;\n curls;\n directions;\n weights;\n weightsRelative;\n\n constructor(name) {\n // name (should be unique)\n this.name = name;\n this.curls = {};\n this.directions = {};\n this.weights = [1.0, 1.0, 1.0, 1.0, 1.0];\n this.weightsRelative = [1.0, 1.0, 1.0, 1.0, 1.0];\n }\n\n curl(finger, curl, confidence) {\n if (typeof this.curls[finger] === 'undefined') this.curls[finger] = [];\n this.curls[finger].push([curl, confidence]);\n }\n\n direction(finger, position, confidence) {\n if (!this.directions[finger]) this.directions[finger] = [];\n this.directions[finger].push([position, confidence]);\n }\n\n weight(finger, weight) {\n this.weights[finger] = weight;\n // recalculate relative weights\n const total = this.weights.reduce((a, b) => a + b, 0);\n this.weightsRelative = this.weights.map((el) => el * 5 / total);\n }\n\n matchAgainst(detectedCurls, detectedDirections) {\n let confidence = 0.0;\n // look at the detected curl of each finger and compare with\n // the expected curl of this finger inside current gesture\n for (const fingerIdx in detectedCurls) {\n const detectedCurl = detectedCurls[fingerIdx];\n const expectedCurls = this.curls[fingerIdx];\n if (typeof expectedCurls === 'undefined') {\n // no curl description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible curl of this specific finger\n for (const [expectedCurl, score] of expectedCurls) {\n if (detectedCurl === expectedCurl) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n // same for detected direction of each finger\n for (const fingerIdx in detectedDirections) {\n const detectedDirection = detectedDirections[fingerIdx];\n const expectedDirections = this.directions[fingerIdx];\n if (typeof expectedDirections === 'undefined') {\n // no direction description available for this finger\n // add default confidence of \"1\"\n confidence += this.weightsRelative[fingerIdx];\n continue;\n }\n // compare to each possible direction of this specific finger\n for (const [expectedDirection, score] of expectedDirections) {\n if (detectedDirection === expectedDirection) {\n confidence += score * this.weightsRelative[fingerIdx];\n break;\n }\n }\n }\n return confidence / 10;\n }\n}\n", "/**\n * FingerPose algorithm implementation\n * See `fingerpose.ts` for entry point\n */\n\nimport { Finger, FingerCurl, FingerDirection, FingerGesture } from './fingerdef';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { thumb, index, middle, ring, pinky } = Finger;\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { none, half, full } = FingerCurl;\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nexport const { verticalUp, verticalDown, horizontalLeft, horizontalRight, diagonalUpRight, diagonalUpLeft, diagonalDownRight, diagonalDownLeft } = FingerDirection;\n\n// describe thumbs up gesture \uD83D\uDC4D\nconst ThumbsUp = new FingerGesture('thumbs up');\nThumbsUp.curl(thumb, none, 1.0);\nThumbsUp.direction(thumb, verticalUp, 1.0);\nThumbsUp.direction(thumb, diagonalUpLeft, 0.25);\nThumbsUp.direction(thumb, diagonalUpRight, 0.25);\nfor (const finger of [Finger.index, Finger.middle, Finger.ring, Finger.pinky]) {\n ThumbsUp.curl(finger, full, 1.0);\n ThumbsUp.direction(finger, horizontalLeft, 1.0);\n ThumbsUp.direction(finger, horizontalRight, 1.0);\n}\n\n// describe Victory gesture \u270C\uFE0F\nconst Victory = new FingerGesture('victory');\nVictory.curl(thumb, half, 0.5);\nVictory.curl(thumb, none, 0.5);\nVictory.direction(thumb, verticalUp, 1.0);\nVictory.direction(thumb, diagonalUpLeft, 1.0);\nVictory.curl(index, none, 1.0);\nVictory.direction(index, verticalUp, 0.75);\nVictory.direction(index, diagonalUpLeft, 1.0);\nVictory.curl(middle, none, 1.0);\nVictory.direction(middle, verticalUp, 1.0);\nVictory.direction(middle, diagonalUpLeft, 0.75);\nVictory.curl(ring, full, 1.0);\nVictory.direction(ring, verticalUp, 0.2);\nVictory.direction(ring, diagonalUpLeft, 1.0);\nVictory.direction(ring, horizontalLeft, 0.2);\nVictory.curl(pinky, full, 1.0);\nVictory.direction(pinky, verticalUp, 0.2);\nVictory.direction(pinky, diagonalUpLeft, 1.0);\nVictory.direction(pinky, horizontalLeft, 0.2);\nVictory.weight(index, 2);\nVictory.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst Point = new FingerGesture('point');\nPoint.curl(thumb, full, 1.0);\nPoint.curl(index, none, 0.5);\nPoint.curl(middle, full, 0.5);\nPoint.curl(ring, full, 0.5);\nPoint.curl(pinky, full, 0.5);\nPoint.weight(index, 2);\nPoint.weight(middle, 2);\n\n// describe Point gesture \u270C\uFE0F\nconst MiddleFinger = new FingerGesture('middle finger');\nMiddleFinger.curl(thumb, none, 1.0);\nMiddleFinger.curl(index, full, 0.5);\nMiddleFinger.curl(middle, full, 0.5);\nMiddleFinger.curl(ring, full, 0.5);\nMiddleFinger.curl(pinky, full, 0.5);\nMiddleFinger.weight(index, 2);\nMiddleFinger.weight(middle, 2);\n\n// describe Open Palm gesture \u270C\uFE0F\nconst OpenPalm = new FingerGesture('open palm');\nOpenPalm.curl(thumb, none, 0.75);\nOpenPalm.curl(index, none, 0.75);\nOpenPalm.curl(middle, none, 0.75);\nOpenPalm.curl(ring, none, 0.75);\nOpenPalm.curl(pinky, none, 0.75);\n\nexport default [ThumbsUp, Victory, Point, MiddleFinger, OpenPalm];\n", "/**\n * FingerPose algorithm implementation constants\n *\n * Based on: [**FingerPose***](https://github.com/andypotato/fingerpose)\n */\n\nimport { Finger, FingerCurl, FingerDirection } from './fingerdef';\nimport Gestures from '../hand/fingergesture';\n\nconst minConfidence = 0.7;\nconst options = {\n // curl estimation\n HALF_CURL_START_LIMIT: 60.0,\n NO_CURL_START_LIMIT: 130.0,\n // direction estimation\n DISTANCE_VOTE_POWER: 1.1,\n SINGLE_ANGLE_VOTE_POWER: 0.9,\n TOTAL_ANGLE_VOTE_POWER: 1.6,\n};\n\nfunction calculateSlope(point1x, point1y, point2x, point2y) {\n const value = (point1y - point2y) / (point1x - point2x);\n let slope = Math.atan(value) * 180 / Math.PI;\n if (slope <= 0) slope = -slope;\n else if (slope > 0) slope = 180 - slope;\n return slope;\n}\n\n// point1, point2 are 2d or 3d point arrays (xy[z])\n// returns either a single scalar (2d) or array of two slopes (3d)\nfunction getSlopes(point1, point2) {\n if (!point1 || !point2) return [0, 0];\n const slopeXY = calculateSlope(point1[0], point1[1], point2[0], point2[1]);\n if (point1.length === 2) return slopeXY;\n const slopeYZ = calculateSlope(point1[1], point1[2], point2[1], point2[2]);\n return [slopeXY, slopeYZ];\n}\n\nfunction angleOrientationAt(angle, weightageAt = 1.0) {\n let isVertical = 0;\n let isDiagonal = 0;\n let isHorizontal = 0;\n if (angle >= 75.0 && angle <= 105.0) isVertical = 1 * weightageAt;\n else if (angle >= 25.0 && angle <= 155.0) isDiagonal = 1 * weightageAt;\n else isHorizontal = 1 * weightageAt;\n return [isVertical, isDiagonal, isHorizontal];\n}\n\nfunction estimateFingerCurl(startPoint, midPoint, endPoint) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const start_mid_z_dist = startPoint[2] - midPoint[2];\n const start_end_z_dist = startPoint[2] - endPoint[2];\n const mid_end_z_dist = midPoint[2] - endPoint[2];\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist + start_mid_z_dist * start_mid_z_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist + start_end_z_dist * start_end_z_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist + mid_end_z_dist * mid_end_z_dist);\n let cos_in = (mid_end_dist * mid_end_dist + start_mid_dist * start_mid_dist - start_end_dist * start_end_dist) / (2 * mid_end_dist * start_mid_dist);\n if (cos_in > 1.0) cos_in = 1.0;\n else if (cos_in < -1.0) cos_in = -1.0;\n let angleOfCurve = Math.acos(cos_in);\n angleOfCurve = (57.2958 * angleOfCurve) % 180;\n let fingerCurl;\n if (angleOfCurve > options.NO_CURL_START_LIMIT) fingerCurl = FingerCurl.none;\n else if (angleOfCurve > options.HALF_CURL_START_LIMIT) fingerCurl = FingerCurl.half;\n else fingerCurl = FingerCurl.full;\n return fingerCurl;\n}\n\nfunction estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n if (max_dist_x === Math.abs(start_end_x_dist)) {\n if (start_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else if (max_dist_x === Math.abs(start_mid_x_dist)) {\n if (start_mid_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n } else {\n if (mid_end_x_dist > 0) estimatedDirection = FingerDirection.horizontalLeft;\n else estimatedDirection = FingerDirection.horizontalRight;\n }\n return estimatedDirection;\n}\n\nfunction estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) {\n let estimatedDirection;\n if (max_dist_y === Math.abs(start_end_y_dist)) {\n if (start_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else if (max_dist_y === Math.abs(start_mid_y_dist)) {\n if (start_mid_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n } else {\n if (mid_end_y_dist < 0) estimatedDirection = FingerDirection.verticalDown;\n else estimatedDirection = FingerDirection.verticalUp;\n }\n return estimatedDirection;\n}\n\nfunction estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) {\n let estimatedDirection;\n const reqd_vertical_direction = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n const reqd_horizontal_direction = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n if (reqd_vertical_direction === FingerDirection.verticalUp) {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalUpLeft;\n else estimatedDirection = FingerDirection.diagonalUpRight;\n } else {\n if (reqd_horizontal_direction === FingerDirection.horizontalLeft) estimatedDirection = FingerDirection.diagonalDownLeft;\n else estimatedDirection = FingerDirection.diagonalDownRight;\n }\n return estimatedDirection;\n}\n\nfunction calculateFingerDirection(startPoint, midPoint, endPoint, fingerSlopes) {\n const start_mid_x_dist = startPoint[0] - midPoint[0];\n const start_end_x_dist = startPoint[0] - endPoint[0];\n const mid_end_x_dist = midPoint[0] - endPoint[0];\n const start_mid_y_dist = startPoint[1] - midPoint[1];\n const start_end_y_dist = startPoint[1] - endPoint[1];\n const mid_end_y_dist = midPoint[1] - endPoint[1];\n const max_dist_x = Math.max(Math.abs(start_mid_x_dist), Math.abs(start_end_x_dist), Math.abs(mid_end_x_dist));\n const max_dist_y = Math.max(Math.abs(start_mid_y_dist), Math.abs(start_end_y_dist), Math.abs(mid_end_y_dist));\n let voteVertical = 0.0;\n let voteDiagonal = 0.0;\n let voteHorizontal = 0.0;\n const start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 0.00001);\n if (start_end_x_y_dist_ratio > 1.5) voteVertical += options.DISTANCE_VOTE_POWER;\n else if (start_end_x_y_dist_ratio > 0.66) voteDiagonal += options.DISTANCE_VOTE_POWER;\n else voteHorizontal += options.DISTANCE_VOTE_POWER;\n const start_mid_dist = Math.sqrt(start_mid_x_dist * start_mid_x_dist + start_mid_y_dist * start_mid_y_dist);\n const start_end_dist = Math.sqrt(start_end_x_dist * start_end_x_dist + start_end_y_dist * start_end_y_dist);\n const mid_end_dist = Math.sqrt(mid_end_x_dist * mid_end_x_dist + mid_end_y_dist * mid_end_y_dist);\n const max_dist = Math.max(start_mid_dist, start_end_dist, mid_end_dist);\n let calc_start_point_x = startPoint[0];\n let calc_start_point_y = startPoint[1];\n let calc_end_point_x = endPoint[0];\n let calc_end_point_y = endPoint[1];\n if (max_dist === start_mid_dist) {\n calc_end_point_x = endPoint[0];\n calc_end_point_y = endPoint[1];\n } else if (max_dist === mid_end_dist) {\n calc_start_point_x = midPoint[0];\n calc_start_point_y = midPoint[1];\n }\n const calcStartPoint = [calc_start_point_x, calc_start_point_y];\n const calcEndPoint = [calc_end_point_x, calc_end_point_y];\n const totalAngle = getSlopes(calcStartPoint, calcEndPoint);\n const votes = angleOrientationAt(totalAngle, options.TOTAL_ANGLE_VOTE_POWER);\n voteVertical += votes[0];\n voteDiagonal += votes[1];\n voteHorizontal += votes[2];\n for (const fingerSlope of fingerSlopes) {\n const fingerVotes = angleOrientationAt(fingerSlope, options.SINGLE_ANGLE_VOTE_POWER);\n voteVertical += fingerVotes[0];\n voteDiagonal += fingerVotes[1];\n voteHorizontal += fingerVotes[2];\n }\n // in case of tie, highest preference goes to Vertical,\n // followed by horizontal and then diagonal\n let estimatedDirection;\n if (voteVertical === Math.max(voteVertical, voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateVerticalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y);\n } else if (voteHorizontal === Math.max(voteDiagonal, voteHorizontal)) {\n estimatedDirection = estimateHorizontalDirection(start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n } else {\n estimatedDirection = estimateDiagonalDirection(start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y, start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x);\n }\n return estimatedDirection;\n}\n\nfunction estimate(landmarks) {\n // step 1: calculate slopes\n const slopesXY: Array = [];\n const slopesYZ: Array = [];\n const fingerCurls: Array = [];\n const fingerDirections: Array = [];\n if (!landmarks) return { curls: fingerCurls, directions: fingerDirections };\n\n // step 1: calculate slopes\n for (const finger of Finger.all) {\n const points = Finger.getPoints(finger);\n const slopeAtXY: Array = [];\n const slopeAtYZ: Array = [];\n for (const point of points) {\n const point1 = landmarks[point[0]];\n const point2 = landmarks[point[1]];\n // calculate single slope\n const slopes = getSlopes(point1, point2);\n const slopeXY = slopes[0];\n const slopeYZ = slopes[1];\n slopeAtXY.push(slopeXY);\n slopeAtYZ.push(slopeYZ);\n }\n slopesXY.push(slopeAtXY);\n slopesYZ.push(slopeAtYZ);\n }\n\n // step 2: calculate orientations\n for (const finger of Finger.all) {\n // start finger predictions from palm - except for thumb\n const pointIndexAt = (finger === Finger.thumb) ? 1 : 0;\n const fingerPointsAt = Finger.getPoints(finger);\n const startPoint = landmarks[fingerPointsAt[pointIndexAt][0]];\n const midPoint = landmarks[fingerPointsAt[pointIndexAt + 1][1]];\n const endPoint = landmarks[fingerPointsAt[3][1]];\n // check if finger is curled\n const fingerCurled = estimateFingerCurl(startPoint, midPoint, endPoint);\n const fingerPosition = calculateFingerDirection(startPoint, midPoint, endPoint, slopesXY[finger].slice(pointIndexAt));\n fingerCurls[finger] = fingerCurled;\n fingerDirections[finger] = fingerPosition;\n }\n return { curls: fingerCurls, directions: fingerDirections };\n}\n\nexport function analyze(keypoints) { // get estimations of curl / direction for each finger\n if (!keypoints || keypoints.length === 0) return null;\n const estimatorRes = estimate(keypoints);\n const landmarks = {};\n for (const fingerIdx of Finger.all) {\n landmarks[Finger.getName(fingerIdx)] = {\n curl: FingerCurl.getName(estimatorRes.curls[fingerIdx]),\n direction: FingerDirection.getName(estimatorRes.directions[fingerIdx]),\n };\n }\n return landmarks;\n}\n\nexport function match(keypoints) { // compare gesture description to each known gesture\n const poses: Array<{ name: string, confidence: number }> = [];\n if (!keypoints || keypoints.length === 0) return poses;\n const estimatorRes = estimate(keypoints);\n for (const gesture of Gestures) {\n const confidence = gesture.matchAgainst(estimatorRes.curls, estimatorRes.directions);\n if (confidence >= minConfidence) poses.push({ name: gesture.name, confidence });\n }\n return poses;\n}\n", "/**\n * HandPose model implementation\n *\n * Based on: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n */\n\nimport { log } from '../util/util';\nimport * as handdetector from './handposedetector';\nimport * as handpipeline from './handposepipeline';\nimport * as fingerPose from './fingerpose';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, Box, Point } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palm: [0],\n};\n\nlet handDetectorModel: GraphModel | null;\nlet handPoseModel: GraphModel | null;\nlet handPipeline: handpipeline.HandPipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array = [];\n for (let i = 0; i < predictions.length; i++) {\n const annotations = {};\n if (predictions[i].landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n const keypoints = predictions[i].landmarks as unknown as Array;\n let box: Box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n let boxRaw: Box = [0, 0, 0, 0];\n if (keypoints && keypoints.length > 0) { // if we have landmarks, calculate box based on landmarks\n for (const pt of keypoints) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)];\n } else { // otherwise use box from prediction\n box = predictions[i].box ? [\n Math.trunc(Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.max(0, predictions[i].box.topLeft[1])),\n Math.trunc(Math.min((input.shape[2] || 0), predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])),\n Math.trunc(Math.min((input.shape[1] || 0), predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])),\n ] : [0, 0, 0, 0];\n boxRaw = [\n (predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n ];\n }\n const landmarks = fingerPose.analyze(keypoints);\n hands.push({\n id: i,\n score: Math.round(100 * predictions[i].confidence) / 100,\n boxScore: Math.round(100 * predictions[i].boxConfidence) / 100,\n fingerScore: Math.round(100 * predictions[i].fingerConfidence) / 100,\n label: 'hand',\n box,\n boxRaw,\n keypoints,\n annotations: annotations as HandResult['annotations'],\n landmarks: landmarks as HandResult['landmarks'],\n });\n }\n return hands;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (env.initial) {\n handDetectorModel = null;\n handPoseModel = null;\n }\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? loadModel(config.hand.detector?.modelPath) : null,\n config.hand.landmarks ? loadModel(config.hand.skeleton?.modelPath) : null,\n ]);\n } else {\n if (config.debug) log('cached model:', handDetectorModel['modelUrl']);\n if (config.debug) log('cached model:', handPoseModel['modelUrl']);\n }\n const handDetector = new handdetector.HandDetector(handDetectorModel);\n handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "/** TFJS custom backend registration */\n\nimport type { Human } from '../human';\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\nimport * as models from '../models';\nimport type { AnyCanvas } from '../exports';\n// import { env } from '../env';\n\nexport const config = {\n name: 'humangl',\n priority: 999,\n canvas: null,\n gl: null,\n extensions: [],\n webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: false,\n desynchronized: true,\n },\n};\n\nfunction extensions(): void {\n /*\n https://www.khronos.org/registry/webgl/extensions/\n https://webglreport.com/?v=2\n */\n const gl = config.gl;\n if (!gl) return;\n config.extensions = gl.getSupportedExtensions() as string[];\n // gl.getExtension('KHR_parallel_shader_compile');\n}\n\n/**\n * Registers custom WebGL2 backend to be used by Human library\n *\n * @returns void\n */\nexport async function register(instance: Human): Promise {\n // force backend reload if gl context is not valid\n if (instance.config.backend !== 'humangl') return;\n if ((config.name in tf.engine().registry) && (!config.gl || !config.gl.getParameter(config.gl.VERSION))) {\n log('error: humangl backend invalid context');\n models.reset(instance);\n /*\n log('resetting humangl backend');\n await tf.removeBackend(config.name);\n await register(instance); // re-register\n */\n }\n if (!tf.findBackend(config.name)) {\n try {\n config.canvas = await image.canvas(100, 100);\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas?.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;\n const glv2 = config.gl.getParameter(config.gl.VERSION).includes('2.0');\n if (!glv2) {\n log('override: using fallback webgl backend as webgl 2.0 is not detected');\n instance.config.backend = 'webgl';\n return;\n }\n if (config.canvas) {\n config.canvas.addEventListener('webglcontextlost', async (e) => {\n log('error: humangl:', e.type);\n log('possible browser memory leak using webgl or conflict with multiple backend registrations');\n instance.emit('error');\n throw new Error('backend error: webgl context lost');\n // log('resetting humangl backend');\n // env.initial = true;\n // models.reset(instance);\n // await tf.removeBackend(config.name);\n // await register(instance); // re-register\n });\n config.canvas.addEventListener('webglcontextrestored', (e) => {\n log('error: humangl context restored:', e);\n });\n config.canvas.addEventListener('webglcontextcreationerror', (e) => {\n log('error: humangl context create:', e);\n });\n }\n } catch (err) {\n log('error: cannot get WebGL context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('error: cannot register WebGL backend:', err);\n return;\n }\n try {\n const kernels = tf.getKernelsForBackend('webgl');\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = { ...kernelConfig, backendName: config.name };\n tf.registerKernel(newKernelConfig);\n });\n } catch (err) {\n log('error: cannot update WebGL backend registration:', err);\n return;\n }\n const current = tf.backend().getGPGPUContext ? tf.backend().getGPGPUContext().gl : null;\n if (current) {\n log(`humangl webgl version:${current.getParameter(current.VERSION)} renderer:${current.getParameter(current.RENDERER)}`);\n } else {\n log('error: no current gl context:', current, config.gl);\n return;\n }\n try {\n if (tf.env().flagRegistry['WEBGL_VERSION']) tf.env().set('WEBGL_VERSION', 2);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n extensions();\n log('backend registered:', config.name);\n }\n}\n", "/** TFJS backend initialization and customization */\n\nimport type { Human } from '../human';\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as humangl from './humangl';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as constants from './constants';\n\nfunction registerCustomOps() {\n if (!env.kernels.includes('mod')) {\n const kernelMod = {\n kernelName: 'Mod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.sub(op.inputs.a, tf.mul(tf.div(op.inputs.a, op.inputs.b), op.inputs.b))),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('mod');\n }\n if (!env.kernels.includes('floormod')) {\n const kernelMod = {\n kernelName: 'FloorMod',\n backendName: tf.getBackend(),\n kernelFunc: (op) => tf.tidy(() => tf.floorDiv(op.inputs.a / op.inputs.b) * op.inputs.b + tf.mod(op.inputs.a, op.inputs.b)),\n };\n tf.registerKernel(kernelMod);\n env.kernels.push('floormod');\n }\n}\n\nexport async function check(instance: Human, force = false) {\n instance.state = 'backend';\n if (force || env.initial || (instance.config.backend && (instance.config.backend.length > 0) && (tf.getBackend() !== instance.config.backend))) {\n const timeStamp = now();\n\n if (instance.config.backend && instance.config.backend.length > 0) {\n // detect web worker\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && instance.config.debug) {\n if (instance.config.debug) log('running inside web worker');\n }\n\n // force browser vs node backend\n if (env.browser && instance.config.backend === 'tensorflow') {\n if (instance.config.debug) log('override: backend set to tensorflow while running in browser');\n instance.config.backend = 'humangl';\n }\n if (env.node && (instance.config.backend === 'webgl' || instance.config.backend === 'humangl')) {\n if (instance.config.debug) log(`override: backend set to ${instance.config.backend} while running in nodejs`);\n instance.config.backend = 'tensorflow';\n }\n\n // handle webgpu\n if (env.browser && instance.config.backend === 'webgpu') {\n if (typeof navigator === 'undefined' || typeof navigator['gpu'] === 'undefined') {\n log('override: backend set to webgpu but browser does not support webgpu');\n instance.config.backend = 'humangl';\n } else {\n const adapter = await navigator['gpu'].requestAdapter();\n if (instance.config.debug) log('enumerated webgpu adapter:', adapter);\n if (!adapter) {\n log('override: backend set to webgpu but browser reports no available gpu');\n instance.config.backend = 'humangl';\n } else {\n // @ts-ignore requestAdapterInfo is not in tslib\n // eslint-disable-next-line no-undef\n const adapterInfo = 'requestAdapterInfo' in adapter ? await (adapter as GPUAdapter).requestAdapterInfo() : undefined;\n // if (adapter.features) adapter.features.forEach((feature) => log('webgpu features:', feature));\n log('webgpu adapter info:', adapterInfo);\n }\n }\n }\n\n // check available backends\n if (instance.config.backend === 'humangl') await humangl.register(instance);\n const available = Object.keys(tf.engine().registryFactory);\n if (instance.config.debug) log('available backends:', available);\n\n if (!available.includes(instance.config.backend)) {\n log(`error: backend ${instance.config.backend} not found in registry`);\n instance.config.backend = env.node ? 'tensorflow' : 'webgl';\n if (instance.config.debug) log(`override: setting backend ${instance.config.backend}`);\n }\n\n if (instance.config.debug) log('setting backend:', instance.config.backend);\n\n // customize wasm\n if (instance.config.backend === 'wasm') {\n if (tf.env().flagRegistry['CANVAS2D_WILL_READ_FREQUENTLY']) tf.env().set('CANVAS2D_WILL_READ_FREQUENTLY', true);\n if (instance.config.debug) log('wasm path:', instance.config.wasmPath);\n if (typeof tf?.setWasmPaths !== 'undefined') await tf.setWasmPaths(instance.config.wasmPath, instance.config.wasmPlatformFetch);\n else throw new Error('backend error: attempting to use wasm backend but wasm path is not set');\n const simd = await tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (instance.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (instance.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n try {\n await tf.setBackend(instance.config.backend);\n await tf.ready();\n constants.init();\n } catch (err) {\n log('error: cannot set backend:', instance.config.backend, err);\n return false;\n }\n }\n\n // customize humangl\n if (tf.getBackend() === 'humangl') {\n if (tf.env().flagRegistry['CHECK_COMPUTATION_FOR_ERRORS']) tf.env().set('CHECK_COMPUTATION_FOR_ERRORS', false);\n if (tf.env().flagRegistry['WEBGL_CPU_FORWARD']) tf.env().set('WEBGL_CPU_FORWARD', true);\n if (tf.env().flagRegistry['WEBGL_USE_SHAPES_UNIFORMS']) tf.env().set('WEBGL_USE_SHAPES_UNIFORMS', true);\n if (tf.env().flagRegistry['CPU_HANDOFF_SIZE_THRESHOLD']) tf.env().set('CPU_HANDOFF_SIZE_THRESHOLD', 256);\n if (tf.env().flagRegistry['WEBGL_EXP_CONV']) tf.env().set('WEBGL_EXP_CONV', true); // \n if (tf.env().flagRegistry['USE_SETTIMEOUTCUSTOM']) tf.env().set('USE_SETTIMEOUTCUSTOM', true); // \n // if (tf.env().flagRegistry['WEBGL_PACK_DEPTHWISECONV']) tf.env().set('WEBGL_PACK_DEPTHWISECONV', false);\n // if (if (tf.env().flagRegistry['WEBGL_FORCE_F16_TEXTURES']) && !instance.config.object.enabled) tf.env().set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n if (typeof instance.config['deallocate'] !== 'undefined' && instance.config['deallocate']) { // hidden param\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n tf.env().set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n if (tf.backend().getGPGPUContext) {\n const gl = await tf.backend().getGPGPUContext().gl;\n if (instance.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n }\n\n // customize webgpu\n if (tf.getBackend() === 'webgpu') {\n // if (tf.env().flagRegistry['WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD']) tf.env().set('WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD', 512);\n // if (tf.env().flagRegistry['WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE']) tf.env().set('WEBGPU_DEFERRED_SUBMIT_BATCH_SIZE', 0);\n // if (tf.env().flagRegistry['WEBGPU_CPU_FORWARD']) tf.env().set('WEBGPU_CPU_FORWARD', true);\n }\n\n // wait for ready\n tf.enableProdMode();\n await tf.ready();\n\n instance.performance.initBackend = Math.trunc(now() - timeStamp);\n instance.config.backend = tf.getBackend();\n\n await env.updateBackend(); // update env on backend init\n registerCustomOps();\n // await env.updateBackend(); // update env on backend init\n }\n return true;\n}\n\n// register fake missing tfjs ops\nexport function fakeOps(kernelNames: Array, config) {\n // if (config.debug) log('registerKernel:', kernelNames);\n for (const kernelName of kernelNames) {\n const kernelConfig = {\n kernelName,\n backendName: config.backend,\n kernelFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // setupFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n // disposeFunc: () => { if (config.debug) log('kernelFunc', kernelName, config.backend); },\n };\n tf.registerKernel(kernelConfig);\n }\n env.kernels = tf.getKernelsForBackend(tf.getBackend()).map((kernel) => kernel.kernelName.toLowerCase()); // re-scan registered ops\n}\n", "/**\n * HandTrack model implementation\n *\n * Based on:\n * - Hand Detection & Skeleton: [**MediaPipe HandPose**](https://drive.google.com/file/d/1sv4sSb9BSNVZhLzxXJ0jBv9DqD-4jnAz/view)\n * - Hand Tracking: [**HandTracking**](https://github.com/victordibia/handtracking)\n */\n\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { HandResult, HandType, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as fingerPose from './fingerpose';\nimport { fakeOps } from '../tfjs/backend';\nimport { constants } from '../tfjs/constants';\n\nconst models: [GraphModel | null, GraphModel | null] = [null, null];\nconst modelOutputNodes = ['StatefulPartitionedCall/Postprocessor/Slice', 'StatefulPartitionedCall/Postprocessor/ExpandDims_1'];\n\nconst inputSize = [[0, 0], [0, 0]];\n\nconst classes = ['hand', 'fist', 'pinch', 'point', 'face', 'tip', 'pinchtip'];\nconst faceIndex = 4;\n\nconst boxExpandFact = 1.6;\nconst maxDetectorResolution = 512;\nconst detectorExpandFact = 1.4;\n\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastTime = 0;\nlet outputSize: [number, number] = [0, 0];\n\ntype HandDetectResult = {\n id: number,\n score: number,\n box: Box,\n boxRaw: Box,\n label: HandType,\n}\n\nconst cache: {\n boxes: Array,\n hands: Array;\n} = {\n boxes: [],\n hands: [],\n};\n\nconst fingerMap = {\n /*\n thumb: [0, 1, 2, 3, 4],\n index: [0, 5, 6, 7, 8],\n middle: [0, 9, 10, 11, 12],\n ring: [0, 13, 14, 15, 16],\n pinky: [0, 17, 18, 19, 20],\n palm: [0],\n */\n thumb: [1, 2, 3, 4],\n index: [5, 6, 7, 8],\n middle: [9, 10, 11, 12],\n ring: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n base: [0],\n palm: [0, 17, 13, 9, 5, 1, 0],\n};\n\nexport async function loadDetect(config: Config): Promise {\n // HandTrack Model: Original: TFJS Port: \n if (env.initial) models[0] = null;\n if (!models[0]) {\n // handtrack model has some kernel ops defined in model but those are never referenced and non-existent in tfjs\n // ideally need to prune the model itself\n fakeOps(['tensorlistreserve', 'enter', 'tensorlistfromtensor', 'merge', 'loopcond', 'switch', 'exit', 'tensorliststack', 'nextiteration', 'tensorlistsetitem', 'tensorlistgetitem', 'reciprocal', 'shape', 'split', 'where'], config);\n models[0] = await loadModel(config.hand.detector?.modelPath);\n const inputs = Object.values(models[0].modelSignature['inputs']);\n inputSize[0][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[0][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[0]['modelUrl']);\n return models[0];\n}\n\nexport async function loadSkeleton(config: Config): Promise {\n if (env.initial) models[1] = null;\n if (!models[1]) {\n models[1] = await loadModel(config.hand.skeleton?.modelPath);\n const inputs = Object.values(models[1].modelSignature['inputs']);\n inputSize[1][0] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[1].size) : 0;\n inputSize[1][1] = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', models[1]['modelUrl']);\n return models[1];\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n if (!models[0]) await loadDetect(config);\n if (!models[1]) await loadSkeleton(config);\n return models;\n}\n\nasync function detectHands(input: Tensor, config: Config): Promise {\n const hands: HandDetectResult[] = [];\n if (!input || !models[0]) return hands;\n const t: Record = {};\n const ratio = (input.shape[2] || 1) / (input.shape[1] || 1);\n const height = Math.min(Math.round((input.shape[1] || 0) / 8) * 8, maxDetectorResolution); // use dynamic input size but cap at 512\n const width = Math.round(height * ratio / 8) * 8;\n t.resize = tf.image.resizeBilinear(input, [height, width]); // todo: resize with padding\n t.cast = tf.cast(t.resize, 'int32');\n [t.rawScores, t.rawBoxes] = await models[0].executeAsync(t.cast, modelOutputNodes) as Tensor[];\n t.boxes = tf.squeeze(t.rawBoxes, [0, 2]);\n t.scores = tf.squeeze(t.rawScores, [0]);\n const classScores: Array = tf.unstack(t.scores, 1); // unstack scores based on classes\n tf.dispose(classScores[faceIndex]);\n classScores.splice(faceIndex, 1); // remove faces\n t.filtered = tf.stack(classScores, 1); // restack\n tf.dispose(classScores);\n // t.filtered = t.scores;\n t.max = tf.max(t.filtered, 1); // max overall score\n t.argmax = tf.argMax(t.filtered, 1); // class index of max overall score\n let id = 0;\n t.nms = tf.image.nonMaxSuppression(t.boxes, t.max, (config.hand.maxDetected || 0) + 1, config.hand.iouThreshold || 0, config.hand.minConfidence || 1);\n const nms = await t.nms.data();\n const scores = await t.max.data();\n const classNum = await t.argmax.data();\n for (const nmsIndex of Array.from(nms)) { // generates results for each class\n const boxSlice = tf.slice(t.boxes, nmsIndex, 1);\n const boxYX = await boxSlice.data();\n tf.dispose(boxSlice);\n const boxData: Box = [boxYX[1], boxYX[0], boxYX[3] - boxYX[1], boxYX[2] - boxYX[0]]; // yx box reshaped to standard box\n const boxRaw: Box = box.scale(boxData, detectorExpandFact);\n const boxFull: Box = [Math.trunc(boxData[0] * outputSize[0]), Math.trunc(boxData[1] * outputSize[1]), Math.trunc(boxData[2] * outputSize[0]), Math.trunc(boxData[3] * outputSize[1])];\n const score = scores[nmsIndex];\n const label = classes[classNum[nmsIndex]] as HandType;\n const hand: HandDetectResult = { id: id++, score, box: boxFull, boxRaw, label };\n hands.push(hand);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n hands.sort((a, b) => b.score - a.score);\n if (hands.length > (config.hand.maxDetected || 1)) hands.length = (config.hand.maxDetected || 1);\n return hands;\n}\n\nasync function detectFingers(input: Tensor, h: HandDetectResult, config: Config): Promise {\n const hand: HandResult = { // initial values inherited from hand detect\n id: h.id,\n score: Math.round(100 * h.score) / 100,\n boxScore: Math.round(100 * h.score) / 100,\n fingerScore: 0,\n box: h.box,\n boxRaw: h.boxRaw,\n label: h.label,\n keypoints: [],\n landmarks: {} as HandResult['landmarks'],\n annotations: {} as HandResult['annotations'],\n };\n if (input && models[1] && config.hand.landmarks && h.score > (config.hand.minConfidence || 0)) {\n const t: Record = {};\n const boxCrop = [h.boxRaw[1], h.boxRaw[0], h.boxRaw[3] + h.boxRaw[1], h.boxRaw[2] + h.boxRaw[0]] as Box;\n t.crop = tf.image.cropAndResize(input, [boxCrop], [0], [inputSize[1][0], inputSize[1][1]], 'bilinear');\n t.div = tf.div(t.crop, constants.tf255);\n [t.score, t.keypoints] = models[1].execute(t.div, ['Identity_1', 'Identity']) as Tensor[];\n const rawScore = (await t.score.data())[0];\n const score = (100 - Math.trunc(100 / (1 + Math.exp(rawScore)))) / 100; // reverse sigmoid value\n if (score >= (config.hand.minConfidence || 0)) {\n hand.fingerScore = score;\n t.reshaped = tf.reshape(t.keypoints, [-1, 3]);\n const coordsData: Point[] = await t.reshaped.array() as Point[];\n const coordsRaw: Point[] = coordsData.map((kpt) => [kpt[0] / inputSize[1][1], kpt[1] / inputSize[1][0], (kpt[2] || 0)]);\n const coordsNorm: Point[] = coordsRaw.map((kpt) => [kpt[0] * h.boxRaw[2], kpt[1] * h.boxRaw[3], (kpt[2] || 0)]);\n hand.keypoints = (coordsNorm).map((kpt) => [outputSize[0] * (kpt[0] + h.boxRaw[0]), outputSize[1] * (kpt[1] + h.boxRaw[1]), (kpt[2] || 0)]);\n hand.landmarks = fingerPose.analyze(hand.keypoints) as HandResult['landmarks']; // calculate finger gestures\n for (const key of Object.keys(fingerMap)) { // map keypoints to per-finger annotations\n hand.annotations[key] = fingerMap[key].map((index: number) => (hand.landmarks && hand.keypoints[index] ? hand.keypoints[index] : null));\n }\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n return hand;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!models[0] || !models[1] || !models[0]?.inputs[0].shape || !models[1]?.inputs[0].shape) return []; // something is wrong with the model\n outputSize = [input.shape[2] || 0, input.shape[1] || 0];\n skipped++; // increment skip frames\n const skipTime = (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.hand.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.hands; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const skipTimeExtended = 3 * (config.hand.skipTime || 0) > (now() - lastTime);\n const skipFrameExtended = skipped < 3 * (config.hand.skipFrames || 0);\n if (config.skipAllowed && cache.hands.length === config.hand.maxDetected) { // we have all detected hands so we're definitely skipping\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else if (config.skipAllowed && skipTimeExtended && skipFrameExtended && cache.hands.length > 0) { // we have some cached results: maybe not enough but anyhow continue for bit longer\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n } else { // finally rerun detector\n cache.boxes = await detectHands(input, config);\n lastTime = now();\n cache.hands = await Promise.all(cache.boxes.map((handBox) => detectFingers(input, handBox, config)));\n skipped = 0;\n }\n\n const oldCache = [...cache.boxes];\n cache.boxes.length = 0; // reset cache\n if (config.cacheSensitivity > 0) {\n for (let i = 0; i < cache.hands.length; i++) {\n const boxKpt = box.square(cache.hands[i].keypoints, outputSize);\n if (boxKpt.box[2] / (input.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input.shape[1] || 1) > 0.05 && cache.hands[i].fingerScore && cache.hands[i].fingerScore > (config.hand.minConfidence || 0)) {\n const boxScale = box.scale(boxKpt.box, boxExpandFact);\n const boxScaleRaw = box.scale(boxKpt.boxRaw, boxExpandFact);\n // const boxCrop = box.crop(boxScaleRaw);\n cache.boxes.push({ ...oldCache[i], box: boxScale, boxRaw: boxScaleRaw });\n }\n }\n }\n for (let i = 0; i < cache.hands.length; i++) { // replace detected boxes with calculated boxes in final output\n const bbox = box.calc(cache.hands[i].keypoints, outputSize);\n cache.hands[i].box = bbox.box;\n cache.hands[i].boxRaw = bbox.boxRaw;\n }\n resolve(cache.hands);\n });\n}\n", "/**\n * Anti-spoofing model implementation\n */\n\nimport { log, now } from '../util/util';\nimport { loadModel } from '../tfjs/load';\nimport type { Config } from '../config';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nconst cached: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet lastCount = 0;\nlet lastTime = 0;\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) model = await loadModel(config.face.liveness?.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx: number, count: number): Promise {\n if (!model) return 0;\n const skipTime = (config.face.liveness?.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.face.liveness?.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (lastCount === count) && cached[idx]) {\n skipped++;\n return cached[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model?.inputs[0].shape ? model.inputs[0].shape[2] : 0, model?.inputs[0].shape ? model.inputs[0].shape[1] : 0], false);\n const res = model?.execute(resize) as Tensor;\n const num = (await res.data())[0];\n cached[idx] = Math.round(100 * num) / 100;\n lastCount = count;\n lastTime = now();\n tf.dispose([resize, res]);\n resolve(cached[idx]);\n });\n}\n", "export const kpt: Array = [ // used to create part labels\n 'nose',\n 'leftEye',\n 'rightEye',\n 'leftEar',\n 'rightEar',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n];\n\nexport const horizontal: Array = [ // used to fix left vs right\n ['leftEye', 'rightEye'],\n ['leftEar', 'rightEar'],\n ['leftShoulder', 'rightShoulder'],\n ['leftElbow', 'rightElbow'],\n ['leftWrist', 'rightWrist'],\n ['leftHip', 'rightHip'],\n ['leftKnee', 'rightKnee'],\n ['leftAnkle', 'rightAnkle'],\n];\n\nexport const vertical: Array = [ // used to remove unlikely keypoint positions\n ['leftKnee', 'leftShoulder'],\n ['rightKnee', 'rightShoulder'],\n ['leftAnkle', 'leftKnee'],\n ['rightAnkle', 'rightKnee'],\n];\n\nexport const relative: Array = [ // used to match relative body parts\n [['leftHip', 'rightHip'], ['leftShoulder', 'rightShoulder']],\n [['leftElbow', 'rightElbow'], ['leftShoulder', 'rightShoulder']],\n];\n\nexport const connected: Record = { // used to create body outline in annotations\n leftLeg: ['leftHip', 'leftKnee', 'leftAnkle'],\n rightLeg: ['rightHip', 'rightKnee', 'rightAnkle'],\n torso: ['leftShoulder', 'rightShoulder', 'rightHip', 'leftHip', 'leftShoulder'],\n leftArm: ['leftShoulder', 'leftElbow', 'leftWrist'],\n rightArm: ['rightShoulder', 'rightElbow', 'rightWrist'],\n head: [],\n};\n", "import type { BodyKeypoint, BodyResult } from '../result';\nimport * as box from '../util/box';\nimport * as coords from './movenetcoords';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { Tensor } from '../tfjs/types';\n\nconst maxJitter = 0.005; // default allowed jitter is within 0.5%\n\nconst cache: {\n keypoints: Array,\n padding: [number, number][];\n} = {\n keypoints: [],\n padding: [[0, 0], [0, 0], [0, 0], [0, 0]],\n};\n\nexport function bodyParts(body: BodyResult) { // model sometimes mixes up left vs right keypoints so we fix them\n for (const pair of coords.horizontal) { // fix body parts left vs right\n const left = body.keypoints.findIndex((kp) => kp.part === pair[0]);\n const right = body.keypoints.findIndex((kp) => kp.part === pair[1]);\n if (body.keypoints[left] && body.keypoints[right]) {\n if (body.keypoints[left].position[0] < body.keypoints[right].position[0]) {\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n }\n for (const pair of coords.vertical) { // remove body parts with improbable vertical position\n const lower = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const higher = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n if (body.keypoints[lower] && body.keypoints[higher]) {\n if (body.keypoints[lower].position[1] < body.keypoints[higher].position[1]) {\n body.keypoints.splice(lower, 1);\n }\n }\n }\n for (const [pair, compare] of coords.relative) { // rearrange body parts according to their relative position\n const left = body.keypoints.findIndex((kp) => (kp && kp.part === pair[0]));\n const right = body.keypoints.findIndex((kp) => (kp && kp.part === pair[1]));\n const leftTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[0]));\n const rightTo = body.keypoints.findIndex((kp) => (kp && kp.part === compare[1]));\n if (!body.keypoints[leftTo] || !body.keypoints[rightTo]) continue; // only if we have both compare points\n const distanceLeft = body.keypoints[left] ? [\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[left].position[0]),\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[left].position[0]),\n ] : [0, 0];\n const distanceRight = body.keypoints[right] ? [\n Math.abs(body.keypoints[rightTo].position[0] - body.keypoints[right].position[0]),\n Math.abs(body.keypoints[leftTo].position[0] - body.keypoints[right].position[0]),\n ] : [0, 0];\n if (distanceLeft[0] > distanceLeft[1] || distanceRight[0] > distanceRight[1]) { // should flip keypoints\n const tmp = body.keypoints[left];\n body.keypoints[left] = body.keypoints[right];\n body.keypoints[right] = tmp;\n }\n }\n}\n\nexport function jitter(keypoints: Array): Array {\n for (let i = 0; i < keypoints.length; i++) {\n if (keypoints[i] && cache.keypoints[i]) {\n const diff = [Math.abs(keypoints[i].positionRaw[0] - cache.keypoints[i].positionRaw[0]), Math.abs(keypoints[i].positionRaw[1] - cache.keypoints[i].positionRaw[1])];\n if (diff[0] < maxJitter && diff[1] < maxJitter) {\n keypoints[i] = cache.keypoints[i]; // below jitter so replace keypoint\n } else {\n cache.keypoints[i] = keypoints[i]; // above jitter so update cache\n }\n } else {\n cache.keypoints[i] = keypoints[i]; // cache for keypoint doesnt exist so create it here\n }\n }\n return keypoints;\n}\n\nexport function padInput(input: Tensor, inputSize: number): Tensor {\n const t: Record = {};\n if (!input.shape || !input.shape[1] || !input.shape[2]) return input;\n cache.padding = [\n [0, 0], // dont touch batch\n [input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0, input.shape[2] > input.shape[1] ? Math.trunc((input.shape[2] - input.shape[1]) / 2) : 0], // height before&after\n [input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0, input.shape[1] > input.shape[2] ? Math.trunc((input.shape[1] - input.shape[2]) / 2) : 0], // width before&after\n [0, 0], // dont touch rbg\n ];\n t.pad = tf.pad(input, cache.padding);\n t.resize = tf.image.resizeBilinear(t.pad, [inputSize, inputSize]);\n const final = tf.cast(t.resize, 'int32');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return final;\n}\n\nexport function rescaleBody(body: BodyResult, outputSize: [number, number]): BodyResult {\n body.keypoints = body.keypoints.filter((kpt) => kpt && kpt.position); // filter invalid keypoints\n for (const kpt of body.keypoints) {\n kpt.position = [\n kpt.position[0] * (outputSize[0] + cache.padding[2][0] + cache.padding[2][1]) / outputSize[0] - cache.padding[2][0],\n kpt.position[1] * (outputSize[1] + cache.padding[1][0] + cache.padding[1][1]) / outputSize[1] - cache.padding[1][0],\n ];\n kpt.positionRaw = [\n kpt.position[0] / outputSize[0], kpt.position[1] / outputSize[1],\n ];\n }\n const rescaledBoxes = box.calc(body.keypoints.map((pt) => pt.position), outputSize);\n body.box = rescaledBoxes.box;\n body.boxRaw = rescaledBoxes.boxRaw;\n return body;\n}\n", "/**\n * MoveNet model implementation\n *\n * Based on: [**MoveNet**](https://blog.tensorflow.org/2021/05/next-generation-pose-detection-with-movenet-and-tensorflowjs.html)\n */\n\nimport { log, now } from '../util/util';\nimport * as box from '../util/box';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as coords from './movenetcoords';\nimport * as fix from './movenetfix';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyKeypoint, BodyResult, BodyLandmark, BodyAnnotation, Box, Point } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { fakeOps } from '../tfjs/backend';\nimport { env } from '../util/env';\n\nlet model: GraphModel | null;\nlet inputSize = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n// const boxExpandFact = 1.5; // increase to 150%\n\nconst cache: {\n boxes: Array, // unused\n bodies: Array;\n last: number,\n} = {\n boxes: [],\n bodies: [],\n last: 0,\n};\n\nexport async function load(config: Config): Promise {\n if (env.initial) model = null;\n if (!model) {\n fakeOps(['size'], config);\n model = await loadModel(config.body.modelPath);\n } else if (config.debug) log('cached model:', model['modelUrl']);\n inputSize = model.inputs[0].shape ? model.inputs[0].shape[2] : 0;\n if (inputSize < 64) inputSize = 256;\n return model;\n}\n\nasync function parseSinglePose(res, config, image) {\n const kpt = res[0][0];\n const keypoints: Array = [];\n let score = 0;\n for (let id = 0; id < kpt.length; id++) {\n score = kpt[id][2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[id][1], kpt[id][0]];\n keypoints.push({\n score: Math.round(100 * score) / 100,\n part: coords.kpt[id] as BodyLandmark,\n positionRaw,\n position: [ // normalized to input image size\n Math.round((image.shape[2] || 0) * positionRaw[0]),\n Math.round((image.shape[1] || 0) * positionRaw[1]),\n ],\n });\n }\n }\n score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n const bodies: Array = [];\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n const annotations: Record = {};\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id: 0, score, box: newBox.box, boxRaw: newBox.boxRaw, keypoints, annotations };\n fix.bodyParts(body);\n bodies.push(body);\n return bodies;\n}\n\nasync function parseMultiPose(res, config, image) {\n const bodies: Array = [];\n for (let id = 0; id < res[0].length; id++) {\n const kpt = res[0][id];\n const totalScore = Math.round(100 * kpt[51 + 4]) / 100;\n if (totalScore > config.body.minConfidence) {\n const keypoints: Array = [];\n for (let i = 0; i < 17; i++) {\n const score = kpt[3 * i + 2];\n if (score > config.body.minConfidence) {\n const positionRaw: Point = [kpt[3 * i + 1], kpt[3 * i + 0]];\n keypoints.push({\n part: coords.kpt[i] as BodyLandmark,\n score: Math.round(100 * score) / 100,\n positionRaw,\n position: [Math.round((image.shape[2] || 0) * positionRaw[0]), Math.round((image.shape[1] || 0) * positionRaw[1])],\n });\n }\n }\n const newBox = box.calc(keypoints.map((pt) => pt.position), [image.shape[2], image.shape[1]]);\n // movenet-multipose has built-in box details\n // const boxRaw: Box = [kpt[51 + 1], kpt[51 + 0], kpt[51 + 3] - kpt[51 + 1], kpt[51 + 2] - kpt[51 + 0]];\n // const box: Box = [Math.trunc(boxRaw[0] * (image.shape[2] || 0)), Math.trunc(boxRaw[1] * (image.shape[1] || 0)), Math.trunc(boxRaw[2] * (image.shape[2] || 0)), Math.trunc(boxRaw[3] * (image.shape[1] || 0))];\n const annotations: Record = {} as Record;\n for (const [name, indexes] of Object.entries(coords.connected)) {\n const pt: Array = [];\n for (let i = 0; i < indexes.length - 1; i++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[i]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]);\n if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n const body: BodyResult = { id, score: totalScore, box: newBox.box, boxRaw: newBox.boxRaw, keypoints: [...keypoints], annotations };\n fix.bodyParts(body);\n bodies.push(body);\n }\n }\n bodies.sort((a, b) => b.score - a.score);\n if (bodies.length > config.body.maxDetected) bodies.length = config.body.maxDetected;\n return bodies;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n if (!model || !model?.inputs[0].shape) return []; // something is wrong with the model\n if (!config.skipAllowed) cache.boxes.length = 0; // allowed to use cache or not\n skipped++; // increment skip frames\n const skipTime = (config.body.skipTime || 0) > (now() - cache.last);\n const skipFrame = skipped < (config.body.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame) {\n return cache.bodies; // return cached results without running anything\n }\n return new Promise(async (resolve) => {\n const t: Record = {};\n skipped = 0;\n // run detection on squared input and cached boxes\n /*\n cache.bodies = []; // reset bodies result\n if (cache.boxes.length >= (config.body.maxDetected || 0)) { // if we have enough cached boxes run detection using cache\n for (let i = 0; i < cache.boxes.length; i++) { // run detection based on cached boxes\n t.crop = tf.image.cropAndResize(input, [cache.boxes[i]], [0], [inputSize, inputSize], 'bilinear');\n t.cast = tf.cast(t.crop, 'int32');\n // t.input = prepareImage(input);\n t.res = model?.execute(t.cast) as Tensor;\n const res = await t.res.array();\n const newBodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, cache.boxes[i]) : await parseMultiPose(res, config, input, cache.boxes[i]);\n cache.bodies = cache.bodies.concat(newBodies);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n }\n if (cache.bodies.length !== config.body.maxDetected) { // did not find enough bodies based on cached boxes so run detection on full frame\n t.input = prepareImage(input);\n t.res = model?.execute(t.input) as Tensor;\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17) ? await parseSinglePose(res, config, input, [0, 0, 1, 1]) : await parseMultiPose(res, config, input, [0, 0, 1, 1]);\n for (const body of cache.bodies) rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n }\n cache.boxes.length = 0; // reset cache\n for (let i = 0; i < cache.bodies.length; i++) {\n if (cache.bodies[i].keypoints.length > (coords.kpt.length / 2)) { // only update cache if we detected at least half keypoints\n const scaledBox = box.scale(cache.bodies[i].boxRaw, boxExpandFact);\n const cropBox = box.crop(scaledBox);\n cache.boxes.push(cropBox);\n }\n }\n */\n\n // run detection on squared input and no cached boxes\n t.input = fix.padInput(input, inputSize);\n t.res = model?.execute(t.input) as Tensor;\n cache.last = now();\n const res = await t.res.array();\n cache.bodies = (t.res.shape[2] === 17)\n ? await parseSinglePose(res, config, input)\n : await parseMultiPose(res, config, input);\n for (const body of cache.bodies) {\n fix.rescaleBody(body, [input.shape[2] || 1, input.shape[1] || 1]);\n fix.jitter(body.keypoints);\n }\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n\n resolve(cache.bodies);\n });\n}\n", "/**\n * NanoDet object detection model implementation\n *\n * Based on: [**MB3-CenterNet**](https://github.com/610265158/mobilenetv3_centernet)\n */\n\nimport { log, now } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport { constants } from '../tfjs/constants';\nimport { labels } from './labels';\nimport type { ObjectResult, ObjectType, Box } from '../result';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\n\nlet model: GraphModel;\nlet last: Array = [];\nlet lastTime = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\nlet inputSize = 0;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) {\n model = await loadModel(config.object.modelPath);\n const inputs = Object.values(model.modelSignature['inputs']);\n inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : 0;\n } else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nasync function process(res: Tensor[], outputShape: [number, number], config: Config) {\n let id = 0;\n let results: Array = [];\n for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n // find scores, boxes, classes\n const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) === labels.length)));\n const scores = await scoresT.array(); // optionally use exponential scores or just as-is\n const featuresT = tf.squeeze(res.find((a: Tensor) => (a.shape[1] === (baseSize ** 2) && (a.shape[2] || 0) < labels.length)));\n const boxesMaxT = 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 boxIdxT = boxesMaxT.argMax(2); // what we need is indexes of features with highest scores, not values itself\n const boxIdx = await boxIdxT.array(); // what we need is indexes of features with highest scores, not values itself\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > (config.object.minConfidence || 0) && j !== 61) {\n const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n const boxOffset = boxIdx[i].map((a: number) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n const [x, y] = [\n cx - (scaleBox / strideSize * boxOffset[0]),\n cy - (scaleBox / strideSize * boxOffset[1]),\n ];\n const [w, h] = [\n cx + (scaleBox / strideSize * boxOffset[2]) - x,\n cy + (scaleBox / strideSize * boxOffset[3]) - y,\n ];\n let boxRaw: Box = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))) as Box; // fix out-of-bounds coords\n const box = [ // results normalized to input image pixels\n boxRaw[0] * outputShape[0],\n boxRaw[1] * outputShape[1],\n boxRaw[2] * outputShape[0],\n boxRaw[3] * outputShape[1],\n ];\n const result = {\n id: id++,\n // strideSize,\n score: Math.round(100 * score) / 100,\n class: j + 1,\n label: labels[j].label as ObjectType,\n // center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n // centerRaw: [cx, cy],\n box: box.map((a) => Math.trunc(a)) as Box,\n boxRaw,\n };\n results.push(result);\n }\n }\n }\n tf.dispose([scoresT, featuresT, boxesMaxT, boxIdxT]);\n }\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 = tf.image.nonMaxSuppression(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = await nms.data();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((_val, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise {\n const skipTime = (config.object.skipTime || 0) > (now() - lastTime);\n const skipFrame = skipped < (config.object.skipFrames || 0);\n if (config.skipAllowed && skipTime && skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n if (!env.kernels.includes('mod') || !env.kernels.includes('sparsetodense')) return last;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2] || 0, image.shape[1] || 0];\n const resizeT = tf.image.resizeBilinear(image, [inputSize, inputSize], false);\n const normT = tf.div(resizeT, constants.tf255);\n const transposeT = tf.transpose(normT, [0, 3, 1, 2]);\n\n let objectT;\n if (config.object.enabled) objectT = model.execute(transposeT);\n lastTime = now();\n\n const obj = await process(objectT as Tensor[], outputSize as [number, number], config);\n last = obj;\n tf.dispose([resizeT, normT, transposeT, ...objectT]);\n resolve(obj);\n });\n}\n", "/**\n * PoseNet body detection model implementation constants\n * See `posenet.ts` for entry point\n */\n\nimport type { Point, BodyResult, BodyAnnotation, BodyLandmark } from '../result';\n\nexport const partNames = [\n 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n result[jointName] = i;\n return result;\n}, {});\n\nconst connectedPartNames = [\n ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n ['rightKnee', 'rightAnkle'],\n];\n\nexport function eitherPointDoesntMeetConfidence(a: number, b: number, minConfidence: number) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence: number) {\n return connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints): [number, number, number, number] {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]): Array {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i): BodyResult => ({\n id: i,\n score: pose.score,\n boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score: score as number,\n part: part as BodyLandmark,\n position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)] as Point,\n positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight] as Point,\n })),\n annotations: {} as Record,\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: Array; // don't touch\n numberOfElements: number;\n getElementValue: unknown; // function call\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n // @ts-ignore getter is of unknown type\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + count),\n };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n const { heatmapY, heatmapX, id: keypoint } = part;\n const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n return {\n x: part.heatmapX * outputStride + x,\n y: part.heatmapY * outputStride + y,\n };\n}\n\nexport function fillArray(element, size) {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = element;\n }\n return result;\n}\n\nexport function clamp(a, min, max) {\n if (a < min) return min;\n if (a > max) return max;\n return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n const dy = y2 - y1;\n const dx = x2 - x1;\n return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "/**\n * PoseNet body detection model implementation\n *\n * Based on: [**PoseNet**](https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5)\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport type { BodyResult, BodyLandmark, Box } from '../result';\nimport type { Tensor, GraphModel } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport * as utils from './posenetutils';\n\nlet model: GraphModel;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n const getDisplacement = (point) => ({\n y: displacements.get(point.y, point.x, edgeId),\n x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n });\n const getStridedIndexNearPoint = (point, height, width) => ({\n y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n });\n\n const [height, width] = scores.shape;\n // Nearest neighbor interpolation for the source->target displacements.\n const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n const displacement = getDisplacement(sourceKeypointIndices);\n const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n let targetKeypoint = displacedPoint;\n for (let i = 0; i < offsetRefineStep; i++) {\n const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n targetKeypoint = utils.addVectors(\n { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n { x: offsetPoint.x, y: offsetPoint.y },\n );\n }\n const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n return { position: targetKeypoint, part: utils.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = utils.poseChain.map(([parentJoinName, childJoinName]) => ([utils.partIds[parentJoinName], utils.partIds[childJoinName]]));\n const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n const numParts = scores.shape[2]; // [21,21,17]\n const numEdges = edgesFwd.length;\n const keypoints = new Array(numParts);\n // Start a new detection instance at the position of the root.\n const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n keypoints[root.part.id] = {\n score: root.score,\n part: utils.partNames[root.part.id] as BodyLandmark,\n position: rootPoint,\n };\n // Decode the part positions upwards in the tree, following the backward displacements.\n for (let edge = numEdges - 1; edge >= 0; --edge) {\n const sourceId = edgesFwd[edge];\n const targetId = edgesBwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n }\n }\n // Decode the part positions downwards in the tree, following the forward displacements.\n for (let edge = 0; edge < numEdges; ++edge) {\n const sourceId = edgesBwd[edge];\n const targetId = edgesFwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n }\n }\n return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n const [height, width] = scores.shape;\n let localMaximum = true;\n const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n localMaximum = false;\n break;\n }\n }\n if (!localMaximum) break;\n }\n return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n const [height, width, numKeypoints] = scores.shape;\n const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n const score = scores.get(heatmapY, heatmapX, keypointId);\n // Only consider parts with score greater or equal to threshold as root candidates.\n if (score < minConfidence) continue;\n // Only consider keypoints whose score is maximum in a local window.\n if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n }\n }\n }\n return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n return poses.some(({ keypoints }) => {\n const correspondingKeypoint = keypoints[keypointId]?.position;\n if (!correspondingKeypoint) return false;\n return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n if (!withinRadius(existingPoses, position, keypointId)) result += score;\n return result;\n }, 0.0);\n return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n const poses: Array<{ keypoints, box: Box, score: number }> = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n // @ts-ignore this one is tree walk\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n // @ts-ignore this one is tree walk\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise {\n /** posenet is mostly obsolete\n * caching is not implemented\n */\n const res = tf.tidy(() => {\n if (!model.inputs[0].shape) return [];\n const resized = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = tf.sub(tf.div(tf.cast(resized, 'float32'), 127.5), 1.0);\n const results: Array = model.execute(normalized, poseNetOutputs) as Array;\n const results3d = results.map((y) => tf.squeeze(y, [0]));\n results3d[1] = tf.sigmoid(results3d[1]); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor: Tensor) => tensor.buffer()));\n for (const t of res) tf.dispose(t);\n\n const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n if (!model.inputs[0].shape) return [];\n const scaled = utils.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as BodyResult[];\n return scaled;\n}\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.body.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n", "/**\n * Image segmentation for body detection model\n *\n * Based on:\n * - [**MediaPipe Meet**](https://drive.google.com/file/d/1lnP1bRi9CSqQQXUHa13159vLELYDgDu0/preview)\n * - [**MediaPipe Selfie**](https://drive.google.com/file/d/1dCfozqknMa068vVsO2j_1FgZkW_e3VWv/preview)\n */\n\nimport { log } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { loadModel } from '../tfjs/load';\nimport * as image from '../image/image';\nimport { constants } from '../tfjs/constants';\nimport type { GraphModel, Tensor } from '../tfjs/types';\nimport type { Config } from '../config';\nimport { env } from '../util/env';\nimport type { Input, AnyCanvas } from '../exports';\n\nlet model: GraphModel;\nlet busy = false;\n\nexport async function load(config: Config): Promise {\n if (!model || env.initial) model = await loadModel(config.segmentation.modelPath);\n else if (config.debug) log('cached model:', model['modelUrl']);\n return model;\n}\n\nexport async function process(input: Input, background: Input | undefined, config: Config)\n: Promise<{ data: Array | Tensor, canvas: AnyCanvas | null, alpha: AnyCanvas | null }> {\n if (busy) return { data: [], canvas: null, alpha: null };\n busy = true;\n if (!model) await load(config);\n const inputImage = await image.process(input, config);\n const width = inputImage.tensor?.shape[2] || 0;\n const height = inputImage.tensor?.shape[1] || 0;\n if (!inputImage.tensor) return { data: [], canvas: null, alpha: null };\n const t: Record = {};\n\n t.resize = tf.image.resizeBilinear(inputImage.tensor, [model.inputs[0].shape ? model.inputs[0].shape[1] : 0, model.inputs[0].shape ? model.inputs[0].shape[2] : 0], false);\n tf.dispose(inputImage.tensor);\n t.norm = tf.div(t.resize, constants.tf255);\n t.res = model.execute(t.norm) as Tensor;\n\n t.squeeze = tf.squeeze(t.res, 0); // meet.shape:[1,256,256,1], selfie.shape:[1,144,256,2]\n if (t.squeeze.shape[2] === 2) {\n t.softmax = tf.softmax(t.squeeze); // model meet has two channels for fg and bg\n [t.bg, t.fg] = tf.unstack(t.softmax, 2);\n t.expand = tf.expandDims(t.fg, 2);\n t.pad = tf.expandDims(t.expand, 0);\n t.crop = tf.image.cropAndResize(t.pad, [[0, 0, 0.5, 0.5]], [0], [width, height]);\n // running sofmax before unstack creates 2x2 matrix so we only take upper-left quadrant\n // otherwise run softmax after unstack and use standard resize\n // resizeOutput = tf.image.resizeBilinear(expand, [input.tensor?.shape[1], input.tensor?.shape[2]]);\n t.data = tf.squeeze(t.crop, 0);\n } else {\n t.data = tf.image.resizeBilinear(t.squeeze, [height, width]); // model selfie has a single channel that we can use directly\n }\n const data = Array.from(await t.data.data()) as number[];\n\n if (env.node && !env.Canvas && (typeof ImageData === 'undefined')) {\n if (config.debug) log('canvas support missing');\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n return { data, canvas: null, alpha: null }; // running in nodejs so return alpha array as-is\n }\n\n const alphaCanvas = image.canvas(width, height);\n // @ts-ignore browser is not defined in tfjs-node\n if (tf.browser) await tf.browser.toPixels(t.data, alphaCanvas);\n const alphaCtx = alphaCanvas.getContext('2d') as CanvasRenderingContext2D;\n if (config.segmentation.blur && config.segmentation.blur > 0) alphaCtx.filter = `blur(${config.segmentation.blur}px)`; // use css filter for bluring, can be done with gaussian blur manually instead\n const alphaData = alphaCtx.getImageData(0, 0, width, height);\n\n const compositeCanvas = image.canvas(width, height);\n const compositeCtx = compositeCanvas.getContext('2d') as CanvasRenderingContext2D;\n if (inputImage.canvas) compositeCtx.drawImage(inputImage.canvas, 0, 0);\n compositeCtx.globalCompositeOperation = 'darken'; // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation // best options are: darken, color-burn, multiply\n if (config.segmentation.blur && config.segmentation.blur > 0) compositeCtx.filter = `blur(${config.segmentation.blur}px)`; // use css filter for bluring, can be done with gaussian blur manually instead\n compositeCtx.drawImage(alphaCanvas, 0, 0);\n compositeCtx.globalCompositeOperation = 'source-over'; // reset composite operation\n compositeCtx.filter = 'none'; // reset css filter\n const compositeData = compositeCtx.getImageData(0, 0, width, height);\n for (let i = 0; i < width * height; i++) compositeData.data[4 * i + 3] = alphaData.data[4 * i + 0]; // copy original alpha value to new composite canvas\n compositeCtx.putImageData(compositeData, 0, 0);\n\n let mergedCanvas: AnyCanvas | null = null;\n if (background && compositeCanvas) { // draw background with segmentation as overlay if background is present\n mergedCanvas = image.canvas(width, height);\n const bgImage = await image.process(background, config);\n tf.dispose(bgImage.tensor);\n const ctxMerge = mergedCanvas.getContext('2d') as CanvasRenderingContext2D;\n ctxMerge.drawImage(bgImage.canvas as HTMLCanvasElement, 0, 0, mergedCanvas.width, mergedCanvas.height);\n ctxMerge.drawImage(compositeCanvas, 0, 0);\n }\n\n Object.keys(t).forEach((tensor) => tf.dispose(t[tensor]));\n busy = false;\n // return { data, canvas: mergedCanvas || compositeCanvas, alpha: alphaCanvas };\n return { data, canvas: compositeCanvas, alpha: alphaCanvas };\n}\n", "import { log, join } from '../util/util';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport type { GraphModel } from './types';\nimport type { Config } from '../config';\nimport * as modelsDefs from '../../models/models.json';\nimport { validateModel } from '../models';\n\nconst options = {\n cacheModels: true,\n cacheSupported: true,\n verbose: true,\n debug: false,\n modelBasePath: '',\n};\n\nexport type ModelInfo = {\n name: string,\n inCache: boolean,\n sizeDesired: number,\n sizeFromManifest: number,\n sizeLoadedWeights: number,\n}\n\nexport const modelStats: Record = {};\n\nasync function httpHandler(url, init?): Promise {\n if (options.debug) log('load model fetch:', url, init);\n return fetch(url, init);\n}\n\nexport function setModelLoadOptions(config: Config) {\n options.cacheModels = config.cacheModels;\n options.verbose = config.debug;\n options.modelBasePath = config.modelBasePath;\n}\n\nexport async function loadModel(modelPath: string | undefined): Promise {\n let modelUrl = join(options.modelBasePath, modelPath || '');\n if (!modelUrl.toLowerCase().endsWith('.json')) modelUrl += '.json';\n const modelPathSegments = modelUrl.includes('/') ? modelUrl.split('/') : modelUrl.split('\\\\');\n const shortModelName = modelPathSegments[modelPathSegments.length - 1].replace('.json', '');\n const cachedModelName = 'indexeddb://' + shortModelName; // generate short model name for cache\n modelStats[shortModelName] = {\n name: shortModelName,\n sizeFromManifest: 0,\n sizeLoadedWeights: 0,\n sizeDesired: modelsDefs[shortModelName],\n inCache: false,\n };\n options.cacheSupported = (typeof window !== 'undefined') && (typeof window.localStorage !== 'undefined') && (typeof window.indexedDB !== 'undefined'); // check if running in browser and if indexedb is available\n let cachedModels = {};\n try {\n cachedModels = (options.cacheSupported && options.cacheModels) ? await tf.io.listModels() : {}; // list all models already in cache // this fails for webview although localStorage is defined\n } catch {\n options.cacheSupported = false;\n }\n modelStats[shortModelName].inCache = (options.cacheSupported && options.cacheModels) && Object.keys(cachedModels).includes(cachedModelName); // is model found in cache\n const tfLoadOptions = typeof fetch === 'undefined' ? {} : { fetchFunc: (url, init?) => httpHandler(url, init) };\n const model: GraphModel = new tf.GraphModel(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions) as unknown as GraphModel; // create model prototype and decide if load from cache or from original modelurl\n let loaded = false;\n try {\n // @ts-ignore private function\n model.findIOHandler(); // decide how to actually load a model\n if (options.debug) log('model load handler:', model['handler']);\n // @ts-ignore private property\n const artifacts = await model.handler.load(); // load manifest\n modelStats[shortModelName].sizeFromManifest = artifacts?.weightData?.byteLength || 0;\n model.loadSync(artifacts); // load weights\n // @ts-ignore private property\n modelStats[shortModelName].sizeLoadedWeights = model?.artifacts?.weightData?.byteLength || 0;\n if (options.verbose) log('load model:', model['modelUrl'], { bytes: modelStats[shortModelName].sizeLoadedWeights }, options);\n loaded = true;\n } catch (err) {\n log('error loading model:', modelUrl, err);\n }\n if (loaded && options.cacheModels && options.cacheSupported && !modelStats[shortModelName].inCache) { // save model to cache\n try {\n const saveResult = await model.save(cachedModelName);\n log('model saved:', cachedModelName, saveResult);\n } catch (err) {\n log('error saving model:', modelUrl, err);\n }\n }\n validateModel(null, model, `${modelPath}`);\n return model;\n}\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { mergeDeep, now } from '../util/util';\nimport { env } from '../util/env';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport { face } from './face';\nimport { body } from './body';\nimport { hand } from './hand';\nimport { object } from './object';\nimport { gesture } from './gesture';\nimport type { Result, PersonResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\nlet drawTime = 0;\n\nexport { options } from './options';\nexport { face } from './face';\nexport { body } from './body';\nexport { hand } from './hand';\nexport { object } from './object';\nexport { gesture } from './gesture';\n\n/** draw combined person results instead of individual detection result objects */\nexport async function person(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n\n for (let i = 0; i < result.length; i++) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `person #${i}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\n/** draw processed canvas */\nexport async function canvas(input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) {\n if (!input || !output) return;\n const ctx = getCanvasContext(output);\n if (!ctx) return;\n ctx.drawImage(input, 0, 0);\n}\n\n/** meta-function that performs draw for: canvas, face, body, hand */\nexport async function all(inCanvas: AnyCanvas, result: Result, drawOptions?: Partial) {\n if (!result || !result.performance || !result || !inCanvas) return null;\n const timeStamp = now();\n const localOptions = mergeDeep(options, drawOptions);\n const promise = Promise.all([\n face(inCanvas, result.face, localOptions),\n body(inCanvas, result.body, localOptions),\n hand(inCanvas, result.hand, localOptions),\n object(inCanvas, result.object, localOptions),\n gesture(inCanvas, result.gesture, localOptions), // gestures do not have buffering\n // person(inCanvas, result.persons, localOptions); // already included above\n ]);\n drawTime = env.perfadd ? drawTime + Math.round(now() - timeStamp) : Math.round(now() - timeStamp);\n result.performance.draw = drawTime;\n return promise;\n}\n", "import { log } from '../util/util';\nimport type { AnyCanvas } from '../exports';\nimport type { Point } from '../result';\nimport type { DrawOptions } from './options';\n\nexport const getCanvasContext = (input: AnyCanvas) => {\n if (!input) log('draw error: invalid canvas');\n else if (!input.getContext) log('draw error: canvas context not defined');\n else {\n const ctx = input.getContext('2d');\n if (!ctx) log('draw error: cannot get canvas context');\n else return ctx;\n }\n return null;\n};\n\nexport const rad2deg = (theta: number) => Math.round((theta * 180) / Math.PI);\n\nexport const colorDepth = (z: number | undefined, opt: DrawOptions): string => { // performance optimization needed\n if (!opt.useDepth || typeof z === 'undefined') return opt.color;\n const rgb = Uint8ClampedArray.from([127 + (2 * z), 127 - (2 * z), 255]);\n return `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${opt.alpha})`;\n};\n\nexport function point(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, z: number | undefined, localOptions: DrawOptions) {\n ctx.fillStyle = colorDepth(z, localOptions);\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nexport function rect(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number, width: number, height: number, localOptions: DrawOptions) {\n ctx.beginPath();\n ctx.lineWidth = localOptions.lineWidth;\n if (localOptions.useCurves) {\n const cx = (x + x + width) / 2;\n const cy = (y + y + height) / 2;\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nexport function lines(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n ctx.strokeStyle = colorDepth(pt[2] || 0, localOptions);\n ctx.lineTo(Math.trunc(pt[0]), Math.trunc(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport function curves(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, points: Point[], localOptions: DrawOptions) {\n if (points.length < 2) return;\n ctx.lineWidth = localOptions.lineWidth;\n if (!localOptions.useCurves || points.length <= 2) {\n lines(ctx, points, localOptions);\n return;\n }\n ctx.moveTo(points[0][0], points[0][1]);\n for (let i = 0; i < points.length - 2; i++) {\n const xc = (points[i][0] + points[i + 1][0]) / 2;\n const yc = (points[i][1] + points[i + 1][1]) / 2;\n ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n }\n ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport function arrow(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, from: Point, to: Point, radius = 5) {\n let angle;\n let x;\n let y;\n ctx.beginPath();\n ctx.moveTo(from[0], from[1]);\n ctx.lineTo(to[0], to[1]);\n angle = Math.atan2(to[1] - from[1], to[0] - from[0]);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.moveTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n angle += (1.0 / 3.0) * (2 * Math.PI);\n x = radius * Math.cos(angle) + to[0];\n y = radius * Math.sin(angle) + to[1];\n ctx.lineTo(x, y);\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n}\n", "/** Draw Options\n * - Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n */\nexport type DrawOptions = {\n /** draw line color */\n color: string,\n /** alpha value used for lines */\n alpha: number,\n /** label color */\n labelColor: string,\n /** label shadow color */\n shadowColor: string,\n /** label font */\n font: string,\n /** line spacing between labels */\n lineHeight: number,\n /** line width for drawn lines */\n lineWidth: number,\n /** size of drawn points */\n pointSize: number,\n /** draw rounded boxes by n pixels */\n roundRect: number,\n /** should points be drawn? */\n drawPoints: boolean,\n /** should labels be drawn? */\n drawLabels: boolean,\n /** should face attention keypoints be highlighted */\n drawAttention: boolean;\n /** should detected gestures be drawn? */\n drawGestures: boolean,\n /** should draw boxes around detection results? */\n drawBoxes: boolean,\n /** should draw polygons from detection points? */\n drawPolygons: boolean,\n /** should draw gaze arrows? */\n drawGaze: boolean,\n /** should fill polygons? */\n fillPolygons: boolean,\n /** use z-coordinate when available */\n useDepth: boolean,\n /** should lines be curved? */\n useCurves: boolean,\n}\n\n/** currently set draw options {@link DrawOptions} */\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n alpha: 0.5,\n font: 'small-caps 16px \"Segoe UI\"',\n lineHeight: 18,\n lineWidth: 4,\n pointSize: 2,\n roundRect: 8,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawAttention: true,\n drawGestures: true,\n drawPolygons: true,\n drawGaze: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n};\n", "import { TRI468 as triangulation } from '../face/facemeshcoords';\nimport { mergeDeep } from '../util/util';\nimport { getCanvasContext, rad2deg, rect, point, lines, arrow } from './primitives';\nimport { options } from './options';\nimport * as facemeshConstants from '../face/constants';\nimport type { FaceResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\nlet opt: DrawOptions;\n\nfunction drawLabels(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawLabels) {\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face: ${Math.trunc(100 * f.score)}%`);\n if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`distance: ${f.iris}`);\n if (f.real) labels.push(`real: ${Math.trunc(100 * f.real)}%`);\n if (f.live) labels.push(`live: ${Math.trunc(100 * f.live)}%`);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n if (emotion.length > 3) emotion.length = 3;\n labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.gaze) {\n if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}\u00B0 yaw:${rad2deg(f.rotation.angle.yaw)}\u00B0 pitch:${rad2deg(f.rotation.angle.pitch)}\u00B0`);\n if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\u00B0`);\n }\n if (labels.length === 0) labels.push('face');\n ctx.fillStyle = opt.color;\n for (let i = labels.length - 1; i >= 0; i--) {\n const x = Math.max(f.box[0], 0);\n const y = i * opt.lineHeight + f.box[1];\n if (opt.shadowColor && opt.shadowColor !== '') {\n ctx.fillStyle = opt.shadowColor;\n ctx.fillText(labels[i], x + 5, y + 16);\n }\n ctx.fillStyle = opt.labelColor;\n ctx.fillText(labels[i], x + 4, y + 15);\n }\n }\n}\n\nfunction drawIrisElipse(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris'] && f.annotations['leftEyeIris'][0]) {\n ctx.strokeStyle = opt.useDepth ? 'rgba(255, 200, 255, 0.3)' : opt.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 (opt.fillPolygons) {\n ctx.fillStyle = opt.useDepth ? 'rgba(255, 255, 200, 0.3)' : opt.color;\n ctx.fill();\n }\n }\n if (f.annotations && f.annotations['rightEyeIris'] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = opt.useDepth ? 'rgba(255, 200, 255, 0.3)' : opt.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 (opt.fillPolygons) {\n ctx.fillStyle = opt.useDepth ? 'rgba(255, 255, 200, 0.3)' : opt.color;\n ctx.fill();\n }\n }\n}\n\nfunction drawGazeSpheres(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawGaze && f.rotation?.angle && typeof Path2D !== 'undefined') {\n ctx.strokeStyle = 'pink';\n const valX = (f.box[0] + f.box[2] / 2) - (f.box[3] * rad2deg(f.rotation.angle.yaw) / 90);\n const valY = (f.box[1] + f.box[3] / 2) + (f.box[2] * rad2deg(f.rotation.angle.pitch) / 90);\n const pathV = new Path2D(`\n M ${f.box[0] + f.box[2] / 2} ${f.box[1]}\n C\n ${valX} ${f.box[1]},\n ${valX} ${f.box[1] + f.box[3]},\n ${f.box[0] + f.box[2] / 2} ${f.box[1] + f.box[3]}\n `);\n const pathH = new Path2D(`\n M ${f.box[0]} ${f.box[1] + f.box[3] / 2}\n C \n ${f.box[0]} ${valY},\n ${f.box[0] + f.box[2]} ${valY},\n ${f.box[0] + f.box[2]} ${f.box[1] + f.box[3] / 2}\n `);\n ctx.stroke(pathH);\n ctx.stroke(pathV);\n }\n}\n\nfunction drawGazeArrows(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawGaze && f.rotation?.gaze?.strength && f.rotation?.gaze?.bearing && f.annotations['leftEyeIris'] && f.annotations['rightEyeIris'] && f.annotations['leftEyeIris'][0] && f.annotations['rightEyeIris'][0]) {\n ctx.strokeStyle = 'pink';\n ctx.fillStyle = 'pink';\n const leftGaze = [\n f.annotations['leftEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['leftEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]], [leftGaze[0], leftGaze[1]], 4);\n const rightGaze = [\n f.annotations['rightEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n f.annotations['rightEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n ];\n arrow(ctx, [f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]], [rightGaze[0], rightGaze[1]], 4);\n }\n}\n\nfunction drawFacePolygons(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawPolygons && f.mesh.length >= 468) {\n ctx.lineWidth = 1;\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [triangulation[i * 3 + 0], triangulation[i * 3 + 1], triangulation[i * 3 + 2]].map((index) => f.mesh[index]);\n lines(ctx, points, opt);\n }\n drawIrisElipse(f, ctx);\n }\n /*\n if (opt.drawPolygons && f.contours.length > 1) {\n ctx.lineWidth = 5;\n lines(ctx, f.contours, opt);\n }\n ctx.lineWidth = 1;\n */\n}\n\nfunction drawFacePoints(f: FaceResult, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n if (opt.drawPoints && f.mesh.length >= 468) {\n for (let i = 0; i < f.mesh.length; i++) {\n point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2], opt);\n if (opt.drawAttention) {\n if (facemeshConstants.LANDMARKS_REFINEMENT_LIPS_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) + 127, opt);\n if (facemeshConstants.LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) - 127, opt);\n if (facemeshConstants.LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.includes(i)) point(ctx, f.mesh[i][0], f.mesh[i][1], (f.mesh[i][2] as number) - 127, opt);\n }\n }\n }\n}\n\nfunction drawFaceBoxes(f: FaceResult, ctx) {\n if (opt.drawBoxes) {\n rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], opt);\n }\n}\n\n/** draw detected faces */\nexport async function face(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n opt = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.font = opt.font;\n ctx.strokeStyle = opt.color;\n ctx.fillStyle = opt.color;\n for (const f of result) {\n drawFaceBoxes(f, ctx);\n drawLabels(f, ctx);\n if (f.mesh && f.mesh.length > 0) {\n drawFacePoints(f, ctx);\n drawFacePolygons(f, ctx);\n drawGazeSpheres(f, ctx);\n drawGazeArrows(f, ctx);\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, curves, colorDepth } from './primitives';\nimport { options } from './options';\nimport type { BodyResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected bodies */\nexport async function body(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n }\n if (localOptions.drawPoints && result[i].keypoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n if (!result[i].keypoints[pt].score || (result[i].keypoints[pt].score === 0)) continue;\n ctx.fillStyle = colorDepth(result[i].keypoints[pt].position[2], localOptions);\n point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n }\n }\n if (localOptions.drawLabels && result[i].keypoints) {\n ctx.font = localOptions.font;\n for (const pt of result[i].keypoints) {\n if (!pt.score || (pt.score === 0)) continue;\n ctx.fillStyle = colorDepth(pt.position[2], localOptions);\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) {\n for (const part of Object.values(result[i].annotations)) {\n for (const connected of part) curves(ctx, connected, localOptions);\n }\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect, point, colorDepth } from './primitives';\nimport { options } from './options';\nimport type { HandResult } from '../result';\nimport type { AnyCanvas, DrawOptions, Point } from '../exports';\n\n/** draw detected hands */\nexport async function hand(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); // can use h.label\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(`hand:${Math.trunc(100 * h.score)}%`, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); // can use h.label\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.keypoints && h.keypoints.length > 0) {\n for (const pt of h.keypoints) {\n ctx.fillStyle = colorDepth(pt[2], localOptions);\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels && h.annotations) {\n const addHandLabel = (part: Array, title: string) => {\n if (!part || part.length === 0 || !part[0]) return;\n const z = part[part.length - 1][2] || -256;\n ctx.fillStyle = colorDepth(z, localOptions);\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['index'], 'index');\n addHandLabel(h.annotations['middle'], 'middle');\n addHandLabel(h.annotations['ring'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palm'], 'palm');\n }\n if (localOptions.drawPolygons && h.annotations) {\n const addHandLine = (part: Array) => {\n if (!part || part.length === 0 || !part[0]) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n const z = part[i][2] || 0;\n ctx.strokeStyle = colorDepth(i * z, localOptions);\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['index']);\n addHandLine(h.annotations['middle']);\n addHandLine(h.annotations['ring']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palm);\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext, rect } from './primitives';\nimport { options } from './options';\nimport type { ObjectResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected objects */\nexport async function object(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${h.label} ${Math.round(100 * h.score)}%`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n }\n}\n", "import { mergeDeep } from '../util/util';\nimport { getCanvasContext } from './primitives';\nimport { options } from './options';\nimport type { GestureResult } from '../result';\nimport type { AnyCanvas, DrawOptions } from '../exports';\n\n/** draw detected gestures */\nexport async function gesture(inCanvas: AnyCanvas, result: Array, drawOptions?: Partial) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (localOptions.drawGestures) {\n const ctx = getCanvasContext(inCanvas);\n if (!ctx) return;\n ctx.font = localOptions.font;\n ctx.fillStyle = localOptions.color;\n let i = 1;\n for (let j = 0; j < result.length; j++) {\n let where: unknown[] = []; // what&where is a record\n let what: unknown[] = []; // what&where is a record\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && ((what[1] as string).length > 0)) {\n const who = where[1] as number > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${who}: ${what[1]}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n i += 1;\n }\n }\n }\n}\n", "import type { Tensor } from '../tfjs/types';\nimport type { FaceResult } from '../result';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { meshAnnotations } from './facemeshcoords';\n\nconst expandFact = 0.1;\nconst alpha = 0.5;\n\n// point inclusion in polygon based on https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\nfunction insidePoly(x: number, y: number, polygon: Array<{ x: number, y: number }>): boolean {\n let inside = false;\n let j = polygon.length - 1;\n for (let i = 0; i < polygon.length; j = i++) {\n if (((polygon[i].y > y) !== (polygon[j].y > y)) && (x < (polygon[j].x - polygon[i].x) * (y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)) inside = !inside;\n }\n return inside;\n}\n\nexport async function mask(face: FaceResult): Promise {\n if (!face.tensor) return face.tensor;\n if (!face.mesh || face.mesh.length < 100) return face.tensor;\n const width = face.tensor.shape[2] || 0;\n const height = face.tensor.shape[1] || 0;\n const buffer = await face.tensor.buffer();\n let silhouette: Array<{ x: number, y: number }> = [];\n for (const pt of meshAnnotations.silhouette) silhouette.push({ x: (face.mesh[pt][0] - face.box[0]) / face.box[2], y: (face.mesh[pt][1] - face.box[1]) / face.box[3] }); // add all silhouette points scaled to local box\n if (expandFact && expandFact > 0) silhouette = silhouette.map((pt) => ({ x: pt.x > 0.5 ? pt.x + expandFact : pt.x - expandFact, y: pt.y > 0.5 ? pt.y + expandFact : pt.y - expandFact })); // expand silhouette\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n const inside = insidePoly(x / width, y / width, silhouette);\n if (!inside) {\n buffer.set(alpha * buffer.get(0, y, x, 0), 0, y, x, 0);\n buffer.set(alpha * buffer.get(0, y, x, 1), 0, y, x, 1);\n buffer.set(alpha * buffer.get(0, y, x, 2), 0, y, x, 2);\n }\n }\n }\n const output = buffer.toTensor();\n tf.dispose(buffer);\n return output;\n}\n", "import type { Point, FaceResult } from '../result';\n\ntype Vector = [number, number, number];\n\nconst calculateGaze = (face: FaceResult): { bearing: number, strength: number } => {\n const radians = (pt1: Point, pt2: Point) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\n if (!face.annotations['rightEyeIris'] || !face.annotations['leftEyeIris']) return { bearing: 0, strength: 0 };\n\n const offsetIris = [0, -0.1]; // iris center may not align with average of eye extremes\n const eyeRatio = 1; // factor to normalize changes x vs y\n\n const left = (face.mesh[33][2] || 0) > (face.mesh[263][2] || 0); // pick left or right eye depending which one is closer bazed on outsize point z axis\n const irisCenter = left ? face.mesh[473] : face.mesh[468];\n const eyeCenter = left // eye center is average of extreme points on x axis for both x and y, ignoring y extreme points as eyelids naturally open/close more when gazing up/down so relative point is less precise\n ? [(face.mesh[133][0] + face.mesh[33][0]) / 2, (face.mesh[133][1] + face.mesh[33][1]) / 2]\n : [(face.mesh[263][0] + face.mesh[362][0]) / 2, (face.mesh[263][1] + face.mesh[362][1]) / 2];\n const eyeSize = left // eye size is difference between extreme points for both x and y, used to normalize & squarify eye dimensions\n ? [face.mesh[133][0] - face.mesh[33][0], face.mesh[23][1] - face.mesh[27][1]]\n : [face.mesh[263][0] - face.mesh[362][0], face.mesh[253][1] - face.mesh[257][1]];\n const eyeDiff: Point = [ // x distance between extreme point and center point normalized with eye size\n (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],\n eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1],\n ];\n let strength = Math.sqrt((eyeDiff[0] * eyeDiff[0]) + (eyeDiff[1] * eyeDiff[1])); // vector length is a diagonal between two differences\n strength = Math.min(strength, face.boxRaw[2] / 2, face.boxRaw[3] / 2); // limit strength to half of box size to avoid clipping due to low precision\n const bearing = (radians([0, 0], eyeDiff) + (Math.PI / 2)) % Math.PI; // using eyeDiff instead eyeCenter/irisCenter combo due to manual adjustments and rotate clockwise 90degrees\n return { bearing, strength };\n};\n\nexport const calculateFaceAngle = (face: FaceResult, imageSize: [number, number]): {\n angle: { pitch: number, yaw: number, roll: number },\n matrix: [number, number, number, number, number, number, number, number, number],\n gaze: { bearing: number, strength: number },\n} => {\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v: Vector): Vector => { // normalize vector\n const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n v[0] /= length;\n v[1] /= length;\n v[2] /= length;\n return v;\n };\n const subVectors = (a: Vector, b: Vector): Vector => { // vector subtraction (a - b)\n const x = a[0] - b[0];\n const y = a[1] - b[1];\n const z = a[2] - b[2];\n return [x, y, z];\n };\n const crossVectors = (a: Vector, b: Vector): Vector => { // vector cross product (a x b)\n const x = a[1] * b[2] - a[2] * b[1];\n const y = a[2] * b[0] - a[0] * b[2];\n const z = a[0] * b[1] - a[1] * b[0];\n return [x, y, z];\n };\n // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n const rotationMatrixToEulerAngle = (r: number[]): { pitch: number, yaw: number, roll: number } => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const [r00, _r01, _r02, r10, r11, r12, r20, r21, r22] = r;\n let thetaX: number;\n let thetaY: number;\n let thetaZ: number;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n if (isNaN(thetaX)) thetaX = 0;\n if (isNaN(thetaY)) thetaY = 0;\n if (isNaN(thetaZ)) thetaZ = 0;\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n\n /*\n const meshToEulerAngle = (mesh) => { // simple Euler angle calculation based existing 3D mesh\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n return { // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face // pitch is face move up/down\n yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye // yaw is face turn left/right\n roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye // roll is face lean left/right\n };\n };\n */\n\n // initialize gaze and mesh\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } };\n\n const size = Math.max(face.boxRaw[2] * imageSize[0], face.boxRaw[3] * imageSize[1]) / 1.5;\n // top, bottom, left, right\n const pts: Point[] = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [pt[0] * imageSize[0] / size, pt[1] * imageSize[1] / size, pt[2]] as Point); // make the xyz coordinates proportional, independent of the image/box size\n\n const y_axis = normalize(subVectors(pts[1] as Vector, pts[0] as Vector));\n let x_axis = normalize(subVectors(pts[3] as Vector, pts[2] as Vector));\n const z_axis = normalize(crossVectors(x_axis, y_axis));\n // adjust x_axis to make sure that all axes are perpendicular to each other\n x_axis = crossVectors(y_axis, z_axis);\n\n // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n const matrix: [number, number, number, number, number, number, number, number, number] = [\n x_axis[0], x_axis[1], x_axis[2],\n y_axis[0], y_axis[1], y_axis[2],\n z_axis[0], z_axis[1], z_axis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n\n // we have iris keypoints so we can calculate gaze direction\n const gaze = mesh.length === 478 ? calculateGaze(face) : { bearing: 0, strength: 0 };\n\n return { angle, matrix, gaze };\n};\n", "/**\n * Face algorithm implementation\n * Uses FaceMesh, Emotion and FaceRes models to create a unified pipeline\n */\n\nimport { log, now } from '../util/util';\nimport { env } from '../util/env';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as facemesh from './facemesh';\nimport * as emotion from '../gear/emotion';\nimport * as faceres from './faceres';\nimport * as mask from './mask';\nimport * as antispoof from './antispoof';\nimport * as liveness from './liveness';\nimport * as gear from '../gear/gear';\nimport * as ssrnetAge from '../gear/ssrnet-age';\nimport * as ssrnetGender from '../gear/ssrnet-gender';\nimport * as mobilefacenet from './mobilefacenet';\nimport * as insightface from './insightface';\nimport type { FaceResult, Emotion, Gender, Race } from '../result';\nimport type { Tensor } from '../tfjs/types';\nimport type { Human } from '../human';\nimport { calculateFaceAngle } from './angles';\n\ntype DescRes = { age: number, gender: Gender, genderScore: number, descriptor: number[], race?: { score: number, race: Race }[] };\n\nexport const detectFace = async (instance: Human /* instance of human */, input: Tensor): Promise => {\n // run facemesh, includes blazeface and iris\n // eslint-disable-next-line no-async-promise-executor\n let timeStamp: number = now();\n let ageRes: { age: number } | Promise<{ age: number }> | null;\n let gearRes: gear.GearType | Promise | null;\n let genderRes: { gender: string, genderScore: number } | Promise<{ gender: string, genderScore: number }> | null;\n let emotionRes: { score: number, emotion: Emotion }[] | Promise<{ score: number, emotion: Emotion }[]>;\n let mobilefacenetRes: number[] | Promise | null;\n let insightfaceRes: number[] | Promise | null;\n let antispoofRes: number | Promise | null;\n let livenessRes: number | Promise | null;\n let descRes: DescRes | Promise | null;\n\n const faceRes: Array = [];\n instance.state = 'run:face';\n\n const faces = await facemesh.predict(input, instance.config);\n instance.performance.face = env.perfadd ? (instance.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n if (!input.shape || input.shape.length !== 4) return [];\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n instance.analyze('Get Face');\n\n // is something went wrong, skip the face\n // @ts-ignore possibly undefied\n if (!faces[i].tensor || faces[i].tensor['isDisposedInternal']) {\n log('Face object is disposed:', faces[i].tensor);\n continue;\n }\n\n // optional face mask\n if (instance.config.face.detector?.mask) {\n const masked = await mask.mask(faces[i]);\n tf.dispose(faces[i].tensor);\n faces[i].tensor = masked as Tensor;\n }\n\n // calculate face angles\n const rotation = faces[i].mesh && (faces[i].mesh.length > 200) ? calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]) : null;\n\n // run emotion, inherits face from blazeface\n instance.analyze('Start Emotion:');\n if (instance.config.async) {\n emotionRes = instance.config.face.emotion?.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : [];\n } else {\n instance.state = 'run:emotion';\n timeStamp = now();\n emotionRes = instance.config.face.emotion?.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : [];\n instance.performance.emotion = env.perfadd ? (instance.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Emotion:');\n\n // run antispoof, inherits face from blazeface\n instance.analyze('Start AntiSpoof:');\n if (instance.config.async) {\n antispoofRes = instance.config.face.antispoof?.enabled ? antispoof.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:antispoof';\n timeStamp = now();\n antispoofRes = instance.config.face.antispoof?.enabled ? await antispoof.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.antispoof = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End AntiSpoof:');\n\n // run liveness, inherits face from blazeface\n instance.analyze('Start Liveness:');\n if (instance.config.async) {\n livenessRes = instance.config.face.liveness?.enabled ? liveness.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n } else {\n instance.state = 'run:liveness';\n timeStamp = now();\n livenessRes = instance.config.face.liveness?.enabled ? await liveness.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : 0;\n instance.performance.liveness = env.perfadd ? (instance.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Liveness:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start GEAR:');\n if (instance.config.async) {\n gearRes = instance.config.face['gear']?.enabled ? gear.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:gear';\n timeStamp = now();\n gearRes = instance.config.face['gear']?.enabled ? await gear.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.gear = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End GEAR:');\n\n // run gear, inherits face from blazeface\n instance.analyze('Start SSRNet:');\n if (instance.config.async) {\n ageRes = instance.config.face['ssrnet']?.enabled ? ssrnetAge.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? ssrnetGender.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:ssrnet';\n timeStamp = now();\n ageRes = instance.config.face['ssrnet']?.enabled ? await ssrnetAge.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n genderRes = instance.config.face['ssrnet']?.enabled ? await ssrnetGender.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.ssrnet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End SSRNet:');\n\n // run mobilefacenet alternative, inherits face from blazeface\n instance.analyze('Start MobileFaceNet:');\n if (instance.config.async) {\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:mobilefacenet';\n timeStamp = now();\n mobilefacenetRes = instance.config.face['mobilefacenet']?.enabled ? await mobilefacenet.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End MobileFaceNet:');\n\n // run insightface alternative, inherits face from blazeface\n instance.analyze('Start InsightFace:');\n if (instance.config.async) {\n insightfaceRes = instance.config.face['insightface']?.enabled ? insightface.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n } else {\n instance.state = 'run:mobilefacenet';\n timeStamp = now();\n insightfaceRes = instance.config.face['insightface']?.enabled ? await insightface.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length) : null;\n instance.performance.mobilefacenet = Math.trunc(now() - timeStamp);\n }\n instance.analyze('End InsightFace:');\n\n // run faceres, inherits face from blazeface\n instance.analyze('Start Description:');\n if (instance.config.async) {\n descRes = faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length);\n } else {\n instance.state = 'run:description';\n timeStamp = now();\n descRes = await faceres.predict(faces[i].tensor || tf.tensor([]), instance.config, i, faces.length);\n instance.performance.description = env.perfadd ? (instance.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n instance.analyze('End Description:');\n\n // if async wait for results\n if (instance.config.async) {\n [ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes] = await Promise.all([ageRes, genderRes, emotionRes, mobilefacenetRes, insightfaceRes, descRes, gearRes, antispoofRes, livenessRes]);\n }\n instance.analyze('Finish Face:');\n\n if (instance.config.face['ssrnet']?.enabled && ageRes && genderRes) { // override age/gender if ssrnet model is used\n descRes = {\n ...(descRes as DescRes),\n age: (ageRes as { age: number}).age,\n gender: (genderRes as { gender: Gender, genderScore: number }).gender,\n genderScore: (genderRes as { gender: Gender, genderScore: number }).genderScore,\n };\n }\n if (instance.config.face['gear']?.enabled && gearRes) { // override age/gender/race if gear model is used\n descRes = {\n ...(descRes as DescRes),\n age: (gearRes as gear.GearType).age,\n gender: (gearRes as gear.GearType).gender,\n genderScore: (gearRes as gear.GearType).genderScore,\n race: (gearRes as gear.GearType).race,\n };\n }\n if (instance.config.face['mobilefacenet']?.enabled && mobilefacenetRes) { // override descriptor if mobilefacenet model is used\n (descRes as DescRes).descriptor = mobilefacenetRes as number[];\n }\n\n if (instance.config.face['insightface']?.enabled && insightfaceRes) { // override descriptor if insightface model is used\n (descRes as DescRes).descriptor = insightfaceRes as number[];\n }\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!instance.config.face.iris?.enabled) {\n // if (faces[i]?.annotations?.leftEyeIris) delete faces[i].annotations.leftEyeIris;\n // if (faces[i]?.annotations?.rightEyeIris) delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations && faces[i].annotations.leftEyeIris && faces[i].annotations.leftEyeIris[0] && faces[i].annotations.rightEyeIris && faces[i].annotations.rightEyeIris[0]\n && (faces[i].annotations.leftEyeIris.length > 0) && (faces[i].annotations.rightEyeIris.length > 0)\n && (faces[i].annotations.leftEyeIris[0] !== null) && (faces[i].annotations.rightEyeIris[0] !== null))\n ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2]\n : 0; // note: average human iris size is 11.7mm\n\n // optionally return tensor\n const tensor = instance.config.face.detector?.return ? tf.squeeze(faces[i].tensor) : null;\n // dispose original face tensor\n tf.dispose(faces[i].tensor);\n // delete temp face image\n if (faces[i].tensor) delete faces[i].tensor;\n // combine results\n const res: FaceResult = {\n ...faces[i],\n id: i,\n };\n if ((descRes as DescRes)?.age) res.age = (descRes as DescRes).age as number;\n if ((descRes as DescRes)?.gender) res.gender = (descRes as DescRes).gender as Gender;\n if ((descRes as DescRes)?.genderScore) res.genderScore = (descRes as DescRes)?.genderScore as number;\n if ((descRes as DescRes)?.descriptor) res.embedding = (descRes as DescRes)?.descriptor as Array;\n if ((descRes as DescRes)?.race) res.race = (descRes as DescRes)?.race as { score: number, race: Race }[];\n if (emotionRes) res.emotion = emotionRes as Array<{ score: number, emotion: Emotion }>;\n if (antispoofRes) res.real = antispoofRes as number;\n if (livenessRes) res.live = livenessRes as number;\n if (irisSize && irisSize !== 0) res.iris = Math.trunc(500 / irisSize / 11.7) / 100;\n if (rotation) res.rotation = rotation;\n if (tensor) res.tensor = tensor;\n faceRes.push(res);\n instance.analyze('End Face');\n }\n instance.analyze('End FaceMesh:');\n if (instance.config.async) {\n if (instance.performance.face) delete instance.performance.face;\n if (instance.performance.age) delete instance.performance.age;\n if (instance.performance.gender) delete instance.performance.gender;\n if (instance.performance.emotion) delete instance.performance.emotion;\n }\n return faceRes;\n};\n", "/**\n * Gesture detection algorithm\n */\n\nimport type { GestureResult, BodyResult, FaceResult, HandResult, Point } from '../result';\nimport * as fingerPose from '../hand/fingerpose';\n\n/** face gesture type */\nexport type FaceGesture =\n `facing ${'left' | 'center' | 'right'}`\n | `blink ${'left' | 'right'} eye`\n | `mouth ${number}% open`\n | `head ${'up' | 'down'}`;\n\n/** iris gesture type */\nexport type IrisGesture =\n 'facing center'\n | `looking ${'left' | 'right' | 'up' | 'down'}`\n | 'looking center';\n\n/** body gesture type */\nexport type BodyGesture =\n `leaning ${'left' | 'right'}`\n | `raise ${'left' | 'right'} hand`\n | 'i give up';\n\n/** hand gesture type */\nexport type HandGesture =\n `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} forward`\n | `${'thumb' | 'index' | 'middle' | 'ring' | 'pinky'} up`\n | 'victory'\n | 'thumbs up';\n\nexport const body = (res: BodyResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: BodyGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position[1] < nose.position[1]) && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position[1] < nose.position[1])) gestures.push({ body: i, gesture: 'raise right hand' });\n\n // leaning\n const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n if (leftShoulder && rightShoulder && Math.abs(leftShoulder.positionRaw[1] - rightShoulder.positionRaw[1]) > 0.1) {\n gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position[1] > rightShoulder.position[1]) ? 'left' : 'right'}` });\n }\n }\n return gestures;\n};\n\nexport const face = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: FaceGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 450) {\n const zDiff = (res[i].mesh[33][2] || 0) - (res[i].mesh[263][2] || 0);\n const xDiff = res[i].mesh[33][0] - res[i].mesh[263][0];\n if (Math.abs(zDiff / xDiff) <= 0.15) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${zDiff < 0 ? 'left' : 'right'}` });\n const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n const chinDepth = res[i].mesh[152][2] || 0;\n if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n }\n }\n return gestures;\n};\n\nexport const iris = (res: FaceResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: IrisGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.leftEyeIris[0] || !res[i].annotations.rightEyeIris || !res[i].annotations.rightEyeIris[0]) continue;\n const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n let center = false;\n const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n if (difference < 0.25) {\n center = true;\n gestures.push({ iris: i, gesture: 'facing center' });\n }\n\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n if (leftIrisCenterX > rightIrisCenterX) { // check eye with bigger offset\n if (leftIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking right' });\n } else {\n if (rightIrisCenterX > 0.05) gestures.push({ iris: i, gesture: 'looking left' });\n }\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3];\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) center = false;\n if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res: HandResult[]): GestureResult[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: HandGesture }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: Point }> = [];\n if (res[i]['annotations']) {\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos) && pos[0]) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => ((best.position[2] || 0) < (a.position[2] || 0) ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward` as HandGesture });\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${highest.name} up` as HandGesture });\n }\n if (res[i]['keypoints']) {\n const poses = fingerPose.match(res[i]['keypoints']);\n for (const pose of poses) gestures.push({ hand: i, gesture: pose.name as HandGesture });\n }\n }\n return gestures;\n};\n", "/**\n * Results interpolation for smoothening of video detection results inbetween detected frames\n */\n\nimport type { Result, FaceResult, BodyResult, HandResult, ObjectResult, GestureResult, PersonResult, Box, Point, BodyLandmark, BodyAnnotation } from '../result';\nimport type { Config } from '../config';\n\nimport * as moveNetCoords from '../body/movenetcoords';\nimport * as blazePoseCoords from '../body/blazeposecoords';\nimport * as efficientPoseCoords from '../body/efficientposecoords';\nimport { now } from './util';\nimport { env } from './env';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null };\nlet interpolateTime = 0;\n\nexport function calc(newResult: Result, config: Config): Result {\n const t0 = now();\n if (!newResult) return { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0, error: null };\n // each record is only updated using deep clone when number of detected record changes, otherwise it will converge by itself\n // otherwise bufferedResult is a shallow clone of result plus updated local calculated values\n // thus mixing by-reference and by-value assignments to minimize memory operations\n\n const elapsed = Date.now() - newResult.timestamp;\n // curve fitted: buffer = 8 - ln(delay)\n // interpolation formula: current = ((buffer - 1) * previous + live) / buffer\n // - at 50ms delay buffer = ~4.1 => 28% towards live data\n // - at 250ms delay buffer = ~2.5 => 40% towards live data\n // - at 500ms delay buffer = ~1.8 => 55% towards live data\n // - at 750ms delay buffer = ~1.4 => 71% towards live data\n // - at 1sec delay buffer = 1 which means live data is used\n const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed + 1) : 1;\n\n if (newResult.canvas) bufferedResult.canvas = newResult.canvas;\n if (newResult.error) bufferedResult.error = newResult.error;\n\n // interpolate body results\n if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {\n bufferedResult.body = JSON.parse(JSON.stringify(newResult.body as BodyResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.body.length; i++) {\n const box = newResult.body[i].box // update box\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + newBoxCoord) / bufferedFactor) as Box;\n const boxRaw = newResult.body[i].boxRaw // update boxRaw\n .map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + newBoxCoord) / bufferedFactor) as Box;\n const keypoints = (newResult.body[i].keypoints // update keypoints\n .map((newKpt, j) => ({\n score: newKpt.score,\n part: newKpt.part as BodyLandmark,\n position: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2],\n ],\n positionRaw: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2],\n ],\n distance: [\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[0] || 0) + (newKpt.distance?.[0] || 0)) / bufferedFactor : newKpt.distance?.[0],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[1] || 0) + (newKpt.distance?.[1] || 0)) / bufferedFactor : newKpt.distance?.[1],\n bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].distance?.[2] || 0) + (newKpt.distance?.[2] || 0)) / bufferedFactor : newKpt.distance?.[2],\n ],\n }))) as Array<{ score: number, part: BodyLandmark, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n\n const annotations: Record = {} as Record; // recreate annotations\n let coords = { connected: {} };\n if (config.body?.modelPath?.includes('efficientpose')) coords = efficientPoseCoords;\n else if (config.body?.modelPath?.includes('blazepose')) coords = blazePoseCoords;\n else if (config.body?.modelPath?.includes('movenet')) coords = moveNetCoords;\n for (const [name, indexes] of Object.entries(coords.connected as Record)) {\n const pt: Array = [];\n for (let j = 0; j < indexes.length - 1; j++) {\n const pt0 = keypoints.find((kp) => kp.part === indexes[j]);\n const pt1 = keypoints.find((kp) => kp.part === indexes[j + 1]);\n // if (pt0 && pt1 && pt0.score > (config.body.minConfidence || 0) && pt1.score > (config.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]);\n if (pt0 && pt1) pt.push([pt0.position, pt1.position]);\n }\n annotations[name] = pt;\n }\n bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints, annotations: annotations as BodyResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate hand results\n if (!bufferedResult.hand || (newResult.hand.length !== bufferedResult.hand.length)) {\n bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand as HandResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.hand.length; i++) {\n const box = (newResult.hand[i].box// update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; // reset keypoints as previous frame did not have them\n const keypoints = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints // update landmarks\n .map((landmark, j) => landmark\n .map((coord, k) => (((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) as Point)\n : [];\n let annotations = {};\n if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) {\n bufferedResult.hand[i].annotations = newResult.hand[i].annotations; // reset annotations as previous frame did not have them\n annotations = bufferedResult.hand[i].annotations;\n } else if (newResult.hand[i].annotations) {\n for (const key of Object.keys(newResult.hand[i].annotations)) { // update annotations\n annotations[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0]\n ? newResult.hand[i].annotations[key]\n .map((val, j: number) => val\n .map((coord: number, k: number) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor))\n : null;\n }\n }\n bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations as HandResult['annotations'] }; // shallow clone plus updated values\n }\n }\n\n // interpolate face results\n if (!bufferedResult.face || (newResult.face.length !== bufferedResult.face.length)) {\n bufferedResult.face = JSON.parse(JSON.stringify(newResult.face as FaceResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.face.length; i++) {\n const box = (newResult.face[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n if (newResult.face[i].rotation) {\n const rotation: {\n matrix: [number, number, number, number, number, number, number, number, number],\n angle: { roll: number, yaw: number, pitch: number },\n gaze: { bearing: number, strength: number }\n } = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } };\n rotation.matrix = newResult.face[i].rotation?.matrix as [number, number, number, number, number, number, number, number, number];\n rotation.angle = {\n roll: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.roll || 0) + (newResult.face[i].rotation?.angle?.roll || 0)) / bufferedFactor,\n yaw: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.yaw || 0) + (newResult.face[i].rotation?.angle?.yaw || 0)) / bufferedFactor,\n pitch: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.pitch || 0) + (newResult.face[i].rotation?.angle?.pitch || 0)) / bufferedFactor,\n };\n rotation.gaze = {\n // not fully correct due projection on circle, also causes wrap-around draw on jump from negative to positive\n bearing: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.bearing || 0) + (newResult.face[i].rotation?.gaze?.bearing || 0)) / bufferedFactor,\n strength: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.strength || 0) + (newResult.face[i].rotation?.gaze?.strength || 0)) / bufferedFactor,\n };\n bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; // shallow clone plus updated values\n }\n bufferedResult.face[i] = { ...newResult.face[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate object detection results\n if (!bufferedResult.object || (newResult.object.length !== bufferedResult.object.length)) {\n bufferedResult.object = JSON.parse(JSON.stringify(newResult.object as ObjectResult[])); // deep clone once\n } else {\n for (let i = 0; i < newResult.object.length; i++) {\n const box = (newResult.object[i].box // update box\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor)) as Box;\n const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as Box;\n bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n }\n }\n\n // interpolate person results\n if (newResult.persons) {\n const newPersons = newResult.persons; // trigger getter function\n if (!bufferedResult.persons || (newPersons.length !== bufferedResult.persons.length)) {\n bufferedResult.persons = JSON.parse(JSON.stringify(newPersons as PersonResult[]));\n } else {\n for (let i = 0; i < newPersons.length; i++) { // update person box, we don't update the rest as it's updated as reference anyhow\n bufferedResult.persons[i].box = (newPersons[i].box\n .map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor)) as Box;\n }\n }\n }\n\n // just copy latest gestures without interpolation\n if (newResult.gesture) bufferedResult.gesture = newResult.gesture as GestureResult[];\n\n // append interpolation performance data\n const t1 = now();\n interpolateTime = env.perfadd ? interpolateTime + Math.round(t1 - t0) : Math.round(t1 - t0);\n if (newResult.performance) bufferedResult.performance = { ...newResult.performance, interpolate: interpolateTime };\n\n return bufferedResult;\n}\n", "/** Face descriptor type as number array */\nexport type Descriptor = Array\nexport type MatchOptions = { order?: number, threshold?: number, multiplier?: number, min?: number, max?: number } | undefined;\n\n/** Calculates distance between two descriptors\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n */\nexport function distance(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25 }) {\n // general minkowski distance, euclidean distance is limited case where order is 2\n if (!descriptor1 || !descriptor1) return Number.MAX_SAFE_INTEGER;\n let sum = 0;\n for (let i = 0; i < descriptor1.length; i++) {\n const diff = (!options.order || options.order === 2) ? (descriptor1[i] - descriptor2[i]) : (Math.abs(descriptor1[i] - descriptor2[i]));\n sum += (!options.order || options.order === 2) ? (diff * diff) : (diff ** options.order);\n }\n return (options.multiplier || 20) * sum;\n}\n\n// invert distance to similarity, normalize to given range and clamp\nconst normalizeDistance = (dist, order, min, max) => {\n if (dist === 0) return 1; // short circuit for identical inputs\n const root = order === 2 ? Math.sqrt(dist) : dist ** (1 / order); // take root of distance\n const norm = (1 - (root / 100) - min) / (max - min); // normalize to range\n const clamp = Math.max(Math.min(norm, 1), 0); // clamp to 0..1\n return clamp;\n};\n\n/** Calculates normalized similarity between two face descriptors based on their `distance`\n * @param options - calculation options\n * - order - algorithm to use\n * Euclidean distance if `order` is 2 (default), Minkowski distance algorithm of nth order if `order` is higher than 2\n * - multiplier - by how much to enhance difference analysis in range of 1..100\n * default is 20 which normalizes results to similarity above 0.5 can be considered a match\n * - min - normalize similarity result to a given range\n * - max - normalzie similarity resutl to a given range\n * default is 0.2...0.8\n * Returns similarity between two face descriptors normalized to 0..1 range where 0 is no similarity and 1 is perfect similarity\n */\nexport function similarity(descriptor1: Descriptor, descriptor2: Descriptor, options: MatchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }) {\n const dist = distance(descriptor1, descriptor2, options);\n return normalizeDistance(dist, options.order || 2, options.min || 0, options.max || 1);\n}\n\n/** Matches given descriptor to a closest entry in array of descriptors\n * @param descriptor - face descriptor\n * @param descriptors - array of face descriptors to commpare given descriptor to\n * @param options - see `similarity` method for options description\n * Returns\n * - `index` index array index where best match was found or -1 if no matches\n * - `distance` calculated `distance` of given descriptor to the best match\n * - `similarity` calculated normalized `similarity` of given descriptor to the best match\n*/\nexport function match(descriptor: Descriptor, descriptors: Array, options: MatchOptions = { order: 2, multiplier: 25, threshold: 0, min: 0.2, max: 0.8 }) {\n if (!Array.isArray(descriptor) || !Array.isArray(descriptors) || descriptor.length < 64 || descriptors.length === 0) { // validate input\n return { index: -1, distance: Number.POSITIVE_INFINITY, similarity: 0 };\n }\n let lowestDistance = Number.MAX_SAFE_INTEGER;\n let index = -1;\n for (let i = 0; i < descriptors.length; i++) {\n const res = descriptors[i].length === descriptor.length ? distance(descriptor, descriptors[i], options) : Number.MAX_SAFE_INTEGER;\n if (res < lowestDistance) {\n lowestDistance = res;\n index = i;\n }\n if (lowestDistance < (options.threshold || 0)) break;\n }\n const normalizedSimilarity = normalizeDistance(lowestDistance, options.order || 2, options.min || 0, options.max || 1);\n return { index, distance: lowestDistance, similarity: normalizedSimilarity };\n}\n", "/**\n * Analyze detection Results and sort&combine them into per-person view\n */\n\nimport type { FaceResult, BodyResult, HandResult, GestureResult, PersonResult, Box } from '../result';\n\nexport function join(faces: Array, bodies: Array, hands: Array, gestures: Array, shape: Array | undefined): Array {\n let id = 0;\n const persons: Array = [];\n for (const face of faces) { // person is defined primarily by face and then we append other objects as found\n const person: PersonResult = { id: id++, face, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] };\n for (const body of bodies) {\n if (face.box[0] > body.box[0] // x within body\n && face.box[0] < body.box[0] + body.box[2]\n && face.box[1] + face.box[3] > body.box[1] // y within body\n && face.box[1] + face.box[3] < body.box[1] + body.box[3]) {\n person.body = body;\n }\n }\n if (person.body) { // only try to join hands if body is found\n for (const hand of hands) {\n if (hand.box[0] + hand.box[2] > person.body.box[0] // x within body for left hand\n && hand.box[0] + hand.box[2] < person.body.box[0] + person.body.box[2]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for left hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.left = hand;\n }\n if (hand.box[0] < person.body.box[0] + person.body.box[2] // x within body for right hand\n && hand.box[0] > person.body.box[0]\n && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for right hand\n && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n if (person.hands) person.hands.right = hand;\n }\n }\n }\n for (const gesture of gestures) { // append all gestures according to ids\n if (gesture['face'] !== undefined && gesture['face'] === face.id) person.gestures?.push(gesture);\n else if (gesture['iris'] !== undefined && gesture['iris'] === face.id) person.gestures?.push(gesture);\n else if (gesture['body'] !== undefined && gesture['body'] === person.body?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.left?.id) person.gestures?.push(gesture);\n else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.right?.id) person.gestures?.push(gesture);\n }\n\n // create new overarching box from all boxes belonging to person\n const x: number[] = [];\n const y: number[] = [];\n const extractXY = (box: Box | undefined) => { // extract all [x, y] coordinates from boxes [x, y, width, height]\n if (box && box.length === 4) {\n x.push(box[0], box[0] + box[2]);\n y.push(box[1], box[1] + box[3]);\n }\n };\n extractXY(person.face?.box);\n extractXY(person.body?.box);\n extractXY(person.hands?.left?.box);\n extractXY(person.hands?.right?.box);\n const minX = Math.min(...x);\n const minY = Math.min(...y);\n person.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; // create new overarching box\n\n // shape is known so we calculate boxRaw as well\n if (shape && shape[1] && shape[2]) person.boxRaw = [person.box[0] / shape[2], person.box[1] / shape[1], person.box[2] / shape[2], person.box[3] / shape[1]];\n\n persons.push(person);\n }\n return persons;\n}\n", "/**\n * Embedded sample images used during warmup in dataURL format\n */\n\n// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\n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\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "/**\n * Warmup algorithm that uses embedded images to exercise loaded models for faster future inference\n */\n\nimport { log, now, mergeDeep } from './util/util';\nimport * as sample from './sample';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as image from './image/image';\nimport { env } from './util/env';\nimport type { Config } from './config';\nimport type { Result } from './result';\nimport type { Human, Models } from './human';\nimport type { Tensor } from './tfjs/types';\n\nasync function warmupBitmap(instance: Human): Promise {\n const b64toBlob = (base64: string, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (instance.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'body':\n case 'full': blob = await b64toBlob(sample.body); break;\n default: blob = null;\n }\n if (blob) {\n const bitmap = await createImageBitmap(blob);\n res = await instance.detect(bitmap, instance.config);\n bitmap.close();\n }\n return res;\n}\n\nasync function warmupCanvas(instance: Human): Promise {\n return new Promise((resolve) => {\n let src;\n // let size = 0;\n switch (instance.config.warmup) {\n case 'face':\n // size = 256;\n src = 'data:image/jpeg;base64,' + sample.face;\n break;\n case 'full':\n case 'body':\n // size = 1200;\n src = 'data:image/jpeg;base64,' + sample.body;\n break;\n default:\n src = null;\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n let img: HTMLImageElement;\n if (typeof Image !== 'undefined') img = new Image();\n // @ts-ignore env.image is an external monkey-patch\n else if (env.Image) img = new env.Image();\n else return;\n img.onload = async () => {\n const canvas = image.canvas(img.naturalWidth, img.naturalHeight);\n if (!canvas) {\n log('Warmup: Canvas not found');\n resolve(undefined);\n } else {\n const ctx = canvas.getContext('2d');\n if (ctx) ctx.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const tensor = await instance.image(canvas);\n const res = await instance.detect(tensor.tensor as Tensor, instance.config);\n resolve(res);\n }\n };\n if (src) img.src = src;\n else resolve(undefined);\n });\n}\n\nasync function warmupNode(instance: Human): Promise {\n const atob = (str: string) => Buffer.from(str, 'base64');\n let img;\n if (instance.config.warmup === 'face') img = atob(sample.face);\n else img = atob(sample.body);\n let res;\n if (('node' in tf) && (tf.getBackend() === 'tensorflow')) {\n // @ts-ignore tf.node may be undefined\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n instance.tf.dispose(data);\n // log('Input:', expanded);\n res = await instance.detect(expanded, instance.config);\n instance.tf.dispose(expanded);\n } else {\n if (instance.config.debug) log('Warmup tfjs-node not loaded');\n /*\n const input = await canvasJS.loadImage(img);\n const canvas = canvasJS.createCanvas(input.width, input.height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, input.width, input.height);\n res = await instance.detect(input, instance.config);\n */\n }\n return res;\n}\n\nasync function runInference(instance: Human) {\n let res: Result | undefined;\n if (typeof createImageBitmap === 'function') res = await warmupBitmap(instance);\n else if (typeof Image !== 'undefined' || env.Canvas !== undefined) res = await warmupCanvas(instance);\n else res = await warmupNode(instance);\n return res;\n}\n\n/** Runs pre-compile on all loaded models */\nexport async function runCompile(allModels: Models) {\n if (!tf.env().flagRegistry['ENGINE_COMPILE_ONLY']) return; // tfjs does not support compile-only inference\n const backendType = tf.getBackend();\n const webGLBackend = tf.backend();\n if ((backendType !== 'webgl' && backendType !== 'humangl') || (!webGLBackend || !webGLBackend.checkCompileCompletion)) {\n // log('compile pass: skip');\n return;\n }\n tf.env().set('ENGINE_COMPILE_ONLY', true);\n const numTensorsStart = tf.engine().state.numTensors;\n const compiledModels: string[] = [];\n for (const [modelName, model] of Object.entries(allModels).filter(([key, val]) => (key !== null && val !== null))) {\n const shape = (model.inputs && model.inputs[0] && model.inputs[0].shape) ? [...model.inputs[0].shape] : [1, 64, 64, 3];\n const dtype = (model.inputs && model.inputs[0] && model.inputs[0].dtype) ? model.inputs[0].dtype : 'float32';\n for (let dim = 0; dim < shape.length; dim++) {\n if (shape[dim] === -1) shape[dim] = dim === 0 ? 1 : 64; // override batch number and any dynamic dimensions\n }\n const tensor = tf.zeros(shape, dtype);\n try {\n const res = model.execute(tensor);\n compiledModels.push(modelName);\n if (Array.isArray(res)) res.forEach((t) => tf.dispose(t));\n else tf.dispose(res);\n } catch {\n log('compile fail model:', modelName);\n }\n tf.dispose(tensor);\n }\n const kernels = await webGLBackend.checkCompileCompletionAsync();\n webGLBackend.getUniformLocations();\n log('compile pass models:', compiledModels);\n log('compile pass kernels:', kernels.length);\n tf.env().set('ENGINE_COMPILE_ONLY', false);\n const numTensorsEnd = tf.engine().state.numTensors;\n if ((numTensorsEnd - numTensorsStart) > 0) log('tensor leak:', numTensorsEnd - numTensorsStart);\n}\n\n/** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used in browser environments for `webgl` and `humangl` backends\n * @param userConfig?: Config\n*/\nexport async function warmup(instance: Human, userConfig?: Partial): Promise {\n const t0 = now();\n instance.state = 'warmup';\n if (userConfig) instance.config = mergeDeep(instance.config, userConfig) as Config;\n if (!instance.config.warmup || instance.config.warmup.length === 0 || instance.config.warmup === 'none') {\n return { face: [], body: [], hand: [], gesture: [], object: [], performance: instance.performance, timestamp: now(), persons: [], error: null };\n }\n return new Promise(async (resolve) => {\n await runCompile(instance.models);\n const res = await runInference(instance);\n const t1 = now();\n if (instance.config.debug) log('warmup', instance.config.warmup, Math.round(t1 - t0), 'ms');\n instance.emit('warmup');\n resolve(res);\n });\n}\n", "/**\n * Human main module\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\n// module imports\nimport { log, now, mergeDeep, validate } from './util/util';\nimport { defaults } from './config';\nimport { env, Env } from './util/env';\nimport { setModelLoadOptions } from './tfjs/load';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as app from '../package.json';\nimport * as backend from './tfjs/backend';\nimport * as blazepose from './body/blazepose';\nimport * as centernet from './object/centernet';\nimport * as draw from './draw/draw';\nimport * as efficientpose from './body/efficientpose';\nimport * as face from './face/face';\nimport * as facemesh from './face/facemesh';\nimport * as faceres from './face/faceres';\nimport * as gesture from './gesture/gesture';\nimport * as handpose from './hand/handpose';\nimport * as handtrack from './hand/handtrack';\nimport * as humangl from './tfjs/humangl';\nimport * as image from './image/image';\nimport * as interpolate from './util/interpolate';\nimport * as match from './face/match';\nimport * as models from './models';\nimport * as movenet from './body/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as persons from './util/persons';\nimport * as posenet from './body/posenet';\nimport * as segmentation from './segmentation/segmentation';\nimport * as warmups from './warmup';\n// type definitions\nimport type { Input, Tensor, DrawOptions, Config, Result, FaceResult, HandResult, BodyResult, ObjectResult, GestureResult, PersonResult, AnyCanvas, ModelStats } from './exports';\n// type exports\nexport * from './exports';\n\n/** **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n *\n * @param userConfig - {@link Config}\n * @returns instance of {@link Human}\n */\nexport class Human {\n /** Current version of Human library in *semver* format */\n version: string;\n\n /** Current configuration\n * - Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\n config: Config;\n\n /** Last known result of detect run\n * - Can be accessed anytime after initial detection\n */\n result: Result;\n\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n * - Progresses through: 'config', 'check', 'backend', 'load', 'run:', 'idle'\n */\n state: string;\n\n /** currenty processed image tensor and canvas */\n process: { tensor: Tensor | null, canvas: AnyCanvas | null };\n\n /** Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n * [TFJS API](https://js.tensorflow.org/api/latest/)\n */\n tf;\n\n /** Object containing environment information used for diagnostics */\n env: Env;\n\n /** Draw helper classes that can draw detected objects on canvas using specified draw\n * - canvas: draws input to canvas\n * - options: are global settings for all draw operations, can be overriden for each draw method {@link DrawOptions}\n * - face, body, hand, gesture, object, person: draws detected results as overlays on canvas\n */\n draw: { canvas: typeof draw.canvas, face: typeof draw.face, body: typeof draw.body, hand: typeof draw.hand, gesture: typeof draw.gesture, object: typeof draw.object, person: typeof draw.person, all: typeof draw.all, options: DrawOptions };\n\n /** Currently loaded models\n * @internal\n * {@link Models}\n */\n models: models.Models;\n\n /** Container for events dispatched by Human\n * Possible events:\n * - `create`: triggered when Human object is instantiated\n * - `load`: triggered when models are loaded (explicitly or on-demand)\n * - `image`: triggered when input image is processed\n * - `result`: triggered when detection is complete\n * - `warmup`: triggered when warmup is complete\n * - `error`: triggered on some errors\n */\n events: EventTarget | undefined;\n /** Reference face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: number[];\n /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: [number, number][];\n /** Performance object that contains values for all recently performed operations */\n performance: Record; // perf members are dynamically defined as needed\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n /** WebGL debug info */\n gl: Record;\n // definition end\n\n /** Constructor for **Human** library that is futher used for all operations\n * @param userConfig - user configuration object {@link Config}\n */\n constructor(userConfig?: Partial) {\n this.env = env;\n /*\n defaults.wasmPath = tf.version['tfjs-core'].includes('-') // custom build or official build\n ? 'https://vladmandic.github.io/tfjs/dist/'\n : `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tf.version_core}/dist/`;\n */\n const tfVersion = (tf.version?.tfjs || tf.version_core).replace(/-(.*)/, '');\n defaults.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tfVersion}/dist/`;\n defaults.modelBasePath = env.browser ? '../models/' : 'file://models/';\n defaults.backend = env.browser ? 'humangl' : 'tensorflow';\n this.version = app.version; // expose version property on instance of class\n Object.defineProperty(this, 'version', { value: app.version }); // expose version property directly on class itself\n this.config = JSON.parse(JSON.stringify(defaults));\n Object.seal(this.config);\n this.config.cacheModels = typeof indexedDB !== 'undefined';\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n setModelLoadOptions(this.config);\n this.tf = tf;\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.performance = {};\n this.events = (typeof EventTarget !== 'undefined') ? new EventTarget() : undefined;\n // object that contains all initialized models\n this.models = new models.Models();\n // reexport draw methods\n this.draw = {\n options: draw.options as DrawOptions,\n canvas: (input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) => draw.canvas(input, output),\n face: (output: AnyCanvas, result: FaceResult[], options?: Partial) => draw.face(output, result, options),\n body: (output: AnyCanvas, result: BodyResult[], options?: Partial) => draw.body(output, result, options),\n hand: (output: AnyCanvas, result: HandResult[], options?: Partial) => draw.hand(output, result, options),\n gesture: (output: AnyCanvas, result: GestureResult[], options?: Partial) => draw.gesture(output, result, options),\n object: (output: AnyCanvas, result: ObjectResult[], options?: Partial) => draw.object(output, result, options),\n person: (output: AnyCanvas, result: PersonResult[], options?: Partial) => draw.person(output, result, options),\n all: (output: AnyCanvas, result: Result, options?: Partial) => draw.all(output, result, options),\n };\n this.result = { face: [], body: [], hand: [], gesture: [], object: [], performance: {}, timestamp: 0, persons: [], error: null };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.process = { tensor: null, canvas: null };\n // export raw access to underlying models\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // set gl info\n this.gl = humangl.config;\n // init model validation\n models.validateModel(this, null, '');\n // include platform info\n this.emit('create');\n }\n\n /** internal function to measure tensor leaks */\n analyze = (...msg: string[]) => {\n if (!this.#analyzeMemoryLeaks) return;\n const currentTensors = this.tf.engine().state.numTensors;\n const previousTensors = this.#numTensors;\n this.#numTensors = currentTensors;\n const leaked = currentTensors - previousTensors;\n if (leaked !== 0) log(...msg, leaked);\n };\n\n /** internal function for quick sanity check on inputs @hidden */\n #sanity = (input: Input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.env.node && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n try {\n this.tf.getBackend();\n } catch {\n return 'backend not loaded';\n }\n return null;\n };\n\n /** Reset configuration to default values */\n reset(): void {\n const currentBackend = this.config.backend; // save backend;\n this.config = JSON.parse(JSON.stringify(defaults));\n this.config.backend = currentBackend;\n }\n\n /** Validate current configuration schema */\n validate(userConfig?: Partial) {\n return validate(defaults, userConfig || this.config);\n }\n\n /** Check model for invalid kernel ops for current backend */\n check() {\n return models.validate(this);\n }\n\n /** Exports face matching methods {@link match#similarity} */\n public similarity = match.similarity;\n /** Exports face matching methods {@link match#distance} */\n public distance = match.distance;\n /** Exports face matching methods {@link match#match} */\n public match = match.match;\n\n /** Utility wrapper for performance.now() */\n now(): number {\n return now();\n }\n\n /** Process input as return canvas and tensor\n *\n * @param input - any input {@link Input}\n * @param getTensor - should image processing also return tensor or just canvas\n * Returns object with `tensor` and `canvas`\n */\n image(input: Input, getTensor: boolean = true) {\n return image.process(input, this.config, getTensor);\n }\n\n /** Segmentation method takes any input and returns processed canvas with body segmentation\n * - Segmentation is not triggered as part of detect process\n * @param input - {@link Input}\n * @param background - {@link Input}\n * - Optional parameter background is used to fill the background with specific input\n * Returns:\n * - `data` as raw data array with per-pixel segmentation values\n * - `canvas` as canvas which is input image filtered with segementation data and optionally merged with background image. canvas alpha values are set to segmentation values for easy merging\n * - `alpha` as grayscale canvas that represents segmentation alpha values\n */\n async segmentation(input: Input, background?: Input): Promise<{ data: number[] | Tensor, canvas: AnyCanvas | null, alpha: AnyCanvas | null }> {\n return segmentation.process(input, background, this.config);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\n *\n * @param input - Tensor as provided in human.result.face[n].tensor\n * @returns Tensor\n */\n // eslint-disable-next-line class-methods-use-this\n enhance(input: Tensor): Tensor | null {\n return faceres.enhance(input);\n }\n\n /** Compare two input tensors for pixel simmilarity\n * - use `human.image` to process any valid input and get a tensor that can be used for compare\n * - when passing manually generated tensors:\n * - both input tensors must be in format [1, height, width, 3]\n * - if resolution of tensors does not match, second tensor will be resized to match resolution of the first tensor\n * - return value is pixel similarity score normalized by input resolution and rgb channels\n */\n compare(firstImageTensor: Tensor, secondImageTensor: Tensor): Promise {\n return image.compare(this.config, firstImageTensor, secondImageTensor);\n }\n\n /** Explicit backend initialization\n * - Normally done implicitly during initial load phase\n * - Call to explictly register and initialize TFJS backend without any other operations\n * - Use when changing backend during runtime\n */\n async init(): Promise {\n await backend.check(this, true);\n await this.tf.ready();\n }\n\n /** Load method preloads all configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n *\n * @param userConfig - {@link Config}\n */\n async load(userConfig?: Partial): Promise {\n this.state = 'load';\n const timeStamp = now();\n const count = Object.values(this.models).filter((model) => model).length;\n if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n if (this.env.initial) { // print version info on first run and check for correct backend setup\n if (this.config.debug) log(`version: ${this.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version['tfjs-core']}`);\n if (!await backend.check(this)) log('error: backend check failed');\n await tf.ready();\n if (this.env.browser) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('environment:', this.env);\n if (this.config.debug) log('tf flags:', this.tf.ENV['flags']);\n }\n }\n\n await models.load(this); // actually loads models\n if (this.env.initial && this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors'); // print memory stats on first run\n this.env.initial = false;\n\n const loaded = Object.values(this.models).filter((model) => model).length;\n if (loaded !== count) { // number of loaded models changed\n await models.validate(this); // validate kernel ops used by model against current backend\n this.emit('load');\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.performance.loadModels as number || 0)) this.performance.loadModels = this.env.perfadd ? (this.performance.loadModels || 0) + current : current;\n }\n\n /** emit event */\n emit = (event: string) => {\n if (this.events && this.events.dispatchEvent) this.events?.dispatchEvent(new Event(event));\n };\n\n /** Runs interpolation using last known result and returns smoothened result\n * Interpolation is based on time since last known result so can be called independently\n *\n * @param result - {@link Result} optional use specific result set to run interpolation on\n * @returns result - {@link Result}\n */\n next(result: Result = this.result): Result {\n return interpolate.calc(result, this.config) as Result;\n }\n\n /** get model loading/loaded stats */\n getModelStats(): ModelStats { return models.getModelStats(this); }\n\n /** Warmup method pre-initializes all configured models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async warmup(userConfig?: Partial) {\n const t0 = now();\n const res = await warmups.warmup(this, userConfig);\n const t1 = now();\n this.performance.warmup = Math.trunc(t1 - t0);\n return res;\n }\n\n /** Run detect with tensorflow profiling\n * - result object will contain total exeuction time information for top-20 kernels\n * - actual detection object can be accessed via `human.result`\n */\n async profile(input: Input, userConfig?: Partial): Promise> {\n const profile = await this.tf.profile(() => this.detect(input, userConfig));\n const kernels: Record = {};\n let total = 0;\n for (const kernel of profile.kernels) { // sum kernel time values per kernel\n if (kernels[kernel.name]) kernels[kernel.name] += kernel.kernelTimeMs;\n else kernels[kernel.name] = kernel.kernelTimeMs;\n total += kernel.kernelTimeMs;\n }\n const kernelArr: Array<{ kernel: string, time: number, perc: number }> = [];\n Object.entries(kernels).forEach((key) => kernelArr.push({ kernel: key[0], time: key[1] as unknown as number, perc: 0 })); // convert to array\n for (const kernel of kernelArr) {\n kernel.perc = Math.round(1000 * kernel.time / total) / 1000;\n kernel.time = Math.round(1000 * kernel.time) / 1000;\n }\n kernelArr.sort((a, b) => b.time - a.time); // sort\n kernelArr.length = 20; // crop\n return kernelArr;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n *\n * @param input - {@link Input}\n * @param userConfig - {@link Config}\n * @returns result - {@link Result}\n */\n async detect(input: Input, userConfig?: Partial): Promise {\n // detection happens inside a promise\n this.state = 'detect';\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig) as Config;\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n this.emit('error');\n resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error });\n }\n\n const timeStart = now();\n\n // configure backend if needed\n await backend.check(this);\n\n // load models if enabled\n await this.load();\n\n timeStamp = now();\n this.state = 'image';\n const img = await image.process(input, this.config) as { canvas: AnyCanvas, tensor: Tensor };\n this.process = img;\n this.performance.inputProcess = this.env.perfadd ? (this.performance.inputProcess || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n if (!img.tensor) {\n if (this.config.debug) log('could not convert input to tensor');\n this.emit('error');\n resolve({ face: [], body: [], hand: [], gesture: [], object: [], performance: this.performance, timestamp: now(), persons: [], error: 'could not convert input to tensor' });\n return;\n }\n this.emit('image');\n\n timeStamp = now();\n this.config.skipAllowed = await image.skip(this.config, img.tensor);\n if (!this.performance.totalFrames) this.performance.totalFrames = 0;\n if (!this.performance.cachedFrames) this.performance.cachedFrames = 0;\n (this.performance.totalFrames as number)++;\n if (this.config.skipAllowed) this.performance.cachedFrames++;\n this.performance.cacheCheck = this.env.perfadd ? (this.performance.cacheCheck || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n // keep them with weak typing as it can be promise or not\n let faceRes: FaceResult[] | Promise | never[] = [];\n let bodyRes: BodyResult[] | Promise | never[] = [];\n let handRes: HandResult[] | Promise | never[] = [];\n let objectRes: ObjectResult[] | Promise | never[] = [];\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n this.state = 'detect:face';\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, img.tensor) : [];\n if (this.performance.face) delete this.performance.face;\n } else {\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, img.tensor) : [];\n this.performance.face = this.env.perfadd ? (this.performance.face || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n\n if (this.config.async && (this.config.body.maxDetected === -1 || this.config.hand.maxDetected === -1)) faceRes = await faceRes; // need face result for auto-detect number of hands or bodies\n\n // run body: can be posenet, blazepose, efficientpose, movenet\n this.analyze('Start Body:');\n this.state = 'detect:body';\n const bodyConfig = this.config.body.maxDetected === -1 ? mergeDeep(this.config, { body: { maxDetected: this.config.face.enabled ? 1 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of bodies\n if (this.config.async) {\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(img.tensor, bodyConfig) : [];\n if (this.performance.body) delete this.performance.body;\n } else {\n timeStamp = now();\n if (this.config.body.modelPath?.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(img.tensor, bodyConfig) : [];\n else if (this.config.body.modelPath?.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(img.tensor, bodyConfig) : [];\n this.performance.body = this.env.perfadd ? (this.performance.body || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n this.state = 'detect:hand';\n const handConfig = this.config.hand.maxDetected === -1 ? mergeDeep(this.config, { hand: { maxDetected: this.config.face.enabled ? 2 * (faceRes as FaceResult[]).length : 1 } }) : this.config; // autodetect number of hands\n if (this.config.async) {\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? handtrack.predict(img.tensor, handConfig) : [];\n if (this.performance.hand) delete this.performance.hand;\n } else {\n timeStamp = now();\n if (this.config.hand.detector?.modelPath?.includes('handdetect')) handRes = this.config.hand.enabled ? await handpose.predict(img.tensor, handConfig) : [];\n else if (this.config.hand.detector?.modelPath?.includes('handtrack')) handRes = this.config.hand.enabled ? await handtrack.predict(img.tensor, handConfig) : [];\n this.performance.hand = this.env.perfadd ? (this.performance.hand || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Hand:');\n\n // run object detection\n this.analyze('Start Object:');\n this.state = 'detect:object';\n if (this.config.async) {\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(img.tensor, this.config) : [];\n if (this.performance.object) delete this.performance.object;\n } else {\n timeStamp = now();\n if (this.config.object.modelPath?.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(img.tensor, this.config) : [];\n else if (this.config.object.modelPath?.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(img.tensor, this.config) : [];\n this.performance.object = this.env.perfadd ? (this.performance.object || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n }\n this.analyze('End Object:');\n\n // if async wait for results\n this.state = 'detect:await';\n if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n // run gesture analysis last\n this.state = 'detect:gesture';\n let gestureRes: GestureResult[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes as FaceResult[]), ...gesture.body(bodyRes as BodyResult[]), ...gesture.hand(handRes as HandResult[]), ...gesture.iris(faceRes as FaceResult[])];\n if (!this.config.async) this.performance.gesture = this.env.perfadd ? (this.performance.gesture || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp);\n else if (this.performance.gesture) delete this.performance.gesture;\n }\n\n this.performance.total = this.env.perfadd ? (this.performance.total || 0) + Math.trunc(now() - timeStart) : Math.trunc(now() - timeStart);\n const shape = this.process?.tensor?.shape || [];\n this.result = {\n face: faceRes as FaceResult[],\n body: bodyRes as BodyResult[],\n hand: handRes as HandResult[],\n gesture: gestureRes,\n object: objectRes as ObjectResult[],\n performance: this.performance,\n canvas: this.process.canvas,\n timestamp: Date.now(),\n error: null,\n get persons() { return persons.join(faceRes as FaceResult[], bodyRes as BodyResult[], handRes as HandResult[], gestureRes, shape); },\n };\n\n // finally dispose input tensor\n tf.dispose(img.tensor);\n\n // log('Result:', result);\n this.emit('detect');\n this.state = 'idle';\n resolve(this.result);\n });\n }\n}\n\n/** Class Human as default export */\n/* eslint no-restricted-exports: [\"off\", { \"restrictedNamedExports\": [\"default\"] }] */\nexport { Human as default, match, draw, models };\n"], + "mappings": "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AAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,eAAgB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,eAAgB,EAClC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,eAAgB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,cAAgB,gBAAiB,EAClC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,gBAAkB,gBAAiB,EACpC,CAAC,eAAiB,gBAAiB,EACnC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,EACrC,CAAC,iBAAmB,gBAAiB,CACvC,EAEaC,GAAwB,CACnC,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,EACtJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GACrJ,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAC7I,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAClJ,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GACrJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GACpJ,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GACjJ,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAC/I,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,GAAI,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GACtJ,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAClJ,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACnJ,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,IAClJ,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GACnJ,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAClJ,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAChJ,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IACpJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GACrJ,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GACpJ,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EACpJ,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAC9I,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAC9I,IAAK,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK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AE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,QAAU,EAAG,OAAS,EAC3B,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,OAAS,EAAG,MAAQ,EACzB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG,MAAQ,EAAG,KAAO,EACvB,CAAE,EAAG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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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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", + "names": ["log", "msg", "dt", "ts", "join", "folder", "file", "separator", "path", "now", "validate", "defaults", "config", "parent", "msgs", "key", "defined", "same", "mergeDeep", "objects", "isObject", "obj", "prev", "pVal", "oVal", "config", "tfjs_esm_exports", "__export", "b", "d", "v", "__reExport", "dist_star", "r", "e", "o", "a", "t", "s", "f", "vertexIdentity", "colorMatrixWithAlpha", "colorMatrixWithoutAlpha", "pixelate", "blur", "convolution", "collect", "source", "prefix", "collection", "r", "match", "name", "GLProgram", "gl", "vertexSource", "fragmentSource", "__publicField", "type", "shader", "log", "vertexShader", "fragmentShader", "u", "GLImageFilter", "drawCount", "sourceTexture", "lastInChain", "currentFramebufferIndex", "tempFramebuffers", "filterChain", "vertexBuffer", "currentProgram", "fxcanvas", "canvas", "shaderProgramCache", "DRAW", "resize", "width", "height", "vertices", "createFramebufferTexture", "fbo", "renderbuffer", "texture", "getTempFramebuffer", "index", "draw", "flags", "target", "flipY", "compileShader", "vertexIdentity", "floatSize", "vertSize", "filter", "matrix", "colorMatrixWithoutAlpha", "colorMatrixWithAlpha", "program", "brightness", "b", "amount", "x", "y", "v", "o", "rotation", "cos", "sin", "lumR", "lumG", "lumB", "pixelSizeX", "pixelSizeY", "convolution", "a", "size", "s", "blurSizeX", "blurSizeY", "blur", "pixelate", "args", "func", "image", "i", "f", "histogramEqualization", "inputImage", "squeeze", "channels", "min", "max", "absMax", "channel", "maxValue", "sub", "range", "fact", "enh", "rgb", "reshape", "maxSize", "inCanvas", "outCanvas", "tmpCanvas", "fx", "last", "canvas", "width", "height", "c", "env", "copy", "input", "output", "outputCanvas", "process", "config", "getTensor", "log", "d", "tensor", "rgb", "cast", "originalWidth", "originalHeight", "targetWidth", "targetHeight", "inCtx", "GLImageFilter", "pixels", "depth", "arr", "tempData", "casted", "histogramEqualization", "skip", "skipFrame", "t", "diffRelative", "compare", "input1", "input2", "Env", "__publicField", "v", "raw", "platformMatch", "c", "canvas", "ctx", "gl", "e", "kernel", "cpu", "env", "models_exports", "__export", "Models", "getModelStats", "load", "reset", "validate", "validateModel", "model", "last", "raceNames", "ageWeights", "lastCount", "lastTime", "skipped", "load", "config", "_a", "env", "log", "loadModel", "predict", "image", "idx", "count", "_b", "skipFrame", "skipTime", "now", "resolve", "t", "box", "obj", "gender", "race", "i", "a", "b", "ageSorted", "age", "tensor", "constants", "init", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "env", "log", "loadModel", "predict", "image", "idx", "count", "_a", "_b", "_c", "_d", "skipFrame", "skipTime", "now", "resolve", "t", "constants", "obj", "data", "tensor", "model", "last", "lastCount", "lastTime", "skipped", "rgb", "load", "config", "env", "log", "loadModel", "predict", "image", "idx", "count", "_a", "_b", "_c", "_d", "skipFrame", "skipTime", "now", "resolve", "t", "red", "green", "blue", "redNorm", "greenNorm", "blueNorm", "grayscale", "constants", "obj", "data", "tensor", "model", "cached", "skipped", "lastCount", "lastTime", "load", "config", "_a", "env", "log", "loadModel", "predict", "image", "idx", "count", "_b", "skipTime", "now", "skipFrame", "resolve", "resize", "res", "num", "meshAnnotations", "meshLandmarks", "blazeFaceLandmarks", "irisIndices", "UV468", "TRI468", "VTX68", "VTX33", "VTX7", "UV68", "x", "UV468", "UV33", "UV7", "connectionsToIndices", "connections", "indices", "connection", "pairsLips", "pairsLeftEye", "pairsLeftEyebrow", "pairsLeftIris", "pairsRightEye", "pairsRightEyebrow", "pairsRightIris", "pairsFaceContour", "contourKeypoints", "getBoxSize", "box", "getBoxCenter", "clampBox", "input", "getRawBox", "scaleBoxCoordinates", "factor", "startPoint", "endPoint", "cutAndResize", "image", "cropSize", "h", "w", "cutBox", "crop", "norm", "constants", "enlargeBox", "center", "size", "halfSize", "squarifyBox", "centers", "calculateLandmarksBoundingBox", "landmarks", "x", "d", "y", "fixedRotationMatrix", "normalizeRadians", "angle", "computeRotation", "point1", "point2", "buildTranslationMatrix", "x", "y", "dot", "v1", "v2", "product", "i", "getColumnFrom2DArr", "arr", "columnIndex", "column", "multiplyTransformMatrices", "mat1", "mat2", "size", "row", "col", "buildRotationMatrix", "rotation", "center", "cosA", "sinA", "rotationMatrix", "translationMatrix", "translationTimesRotation", "negativeTranslationMatrix", "invertTransformMatrix", "matrix", "rotationComponent", "translationComponent", "invertedTranslation", "rotatePoint", "homogeneousCoordinate", "generateAnchors", "inputSize", "spec", "anchors", "i", "stride", "gridRows", "gridCols", "anchorsNum", "gridY", "anchorY", "gridX", "anchorX", "n", "transformRawCoords", "coordsRaw", "box", "angle", "rotationMatrix", "boxSize", "getBoxSize", "coordsScaled", "coord", "largeAngle", "coordsRotationMatrix", "buildRotationMatrix", "fixedRotationMatrix", "coordsRotated", "rotatePoint", "inverseRotationMatrix", "invertTransformMatrix", "boxCenter", "getBoxCenter", "offsets", "dot", "correctFaceRotation", "rotate", "input", "symmetryLine", "meshLandmarks", "blazeFaceLandmarks", "face", "env", "computeRotation", "center", "centerRaw", "rotated", "cutAndResize", "findFaceCenter", "mesh", "x", "m", "y", "calculateFaceBox", "previousBox", "keypointsCount", "faceBoxScaleFactor", "model", "anchors", "inputSize", "inputSizeT", "size", "load", "config", "_a", "env", "log", "loadModel", "generateAnchors", "decodeBoxes", "boxOutputs", "constants", "boxes", "tensor", "getBoxes", "inputImage", "_b", "_c", "_d", "t", "res", "sorted", "a", "b", "nms", "scores", "i", "confidence", "points", "rawBox", "scaledBox", "scaleBoxCoordinates", "enlargedBox", "enlargeBox", "squaredBox", "squarifyBox", "blazeposecoords_exports", "__export", "connected", "kpt", "inputSize", "anchorTensor", "numLayers", "strides", "createAnchors", "anchors", "layerId", "anchorCount", "lastSameStrideLayer", "stride", "featureMapHeight", "featureMapWidth", "y", "x", "anchorId", "a", "calc", "keypoints", "outputSize", "coords", "pt", "min", "max", "box", "boxRaw", "square", "center", "dist", "scale", "scaleFact", "env", "models", "inputSize", "skipped", "outputNodes", "cache", "cropBox", "padding", "lastTime", "sigmoid", "x", "loadDetect", "config", "loadModel", "inputs", "log", "createAnchors", "loadPose", "prepareImage", "input", "size", "t", "final", "cropBox", "height", "width", "padding", "constants", "tensor", "rescaleKeypoints", "keypoints", "outputSize", "kpt", "fixKeypoints", "leftPalm", "k", "leftWrist", "leftIndex", "rightPalm", "rightWrist", "rightIndex", "detectLandmarks", "config", "_a", "models", "outputNodes", "poseScore", "points", "distances", "keypointsRelative", "depth", "i", "score", "sigmoid", "presence", "adjScore", "positionRaw", "inputSize", "position", "distance", "kpts", "boxes", "calc", "annotations", "name", "indexes", "connected", "pt", "pt0", "pt1", "predict", "skipTime", "now", "lastTime", "skipFrame", "skipped", "cache", "labels", "model", "inputSize", "last", "lastTime", "skipped", "load", "config", "env", "log", "loadModel", "inputs", "process", "res", "outputShape", "t", "results", "detections", "arr", "nms", "i", "id", "score", "classVal", "label", "labels", "x", "y", "boxRaw", "box", "tensor", "predict", "input", "skipTime", "now", "skipFrame", "resolve", "outputSize", "resize", "objectT", "obj", "efficientposecoords_exports", "__export", "connected", "kpt", "model", "lastTime", "cache", "skipped", "load", "config", "env", "log", "loadModel", "max2d", "inputs", "minScore", "width", "height", "reshaped", "max", "newScore", "coordinates", "mod", "div", "y", "predict", "image", "skipTime", "now", "skipFrame", "resolve", "_a", "tensor", "resize", "enhance", "constants", "resT", "squeeze", "stack", "id", "x", "partScore", "kpt", "s", "prev", "curr", "a", "xRaw", "yRaw", "name", "indexes", "connected", "pt", "i", "pt0", "pt1", "annotations", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "_a", "env", "log", "loadModel", "predict", "image", "idx", "count", "_b", "skipFrame", "skipTime", "now", "resolve", "obj", "t", "inputSize", "constants", "data", "i", "a", "b", "tensor", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "env", "log", "loadModel", "predict", "input", "idx", "count", "_a", "_b", "skipFrame", "skipTime", "now", "resolve", "data", "t", "output", "tensor", "model", "last", "lastCount", "lastTime", "skipped", "load", "config", "env", "log", "loadModel", "predict", "input", "idx", "count", "_a", "_b", "skipFrame", "skipTime", "now", "resolve", "data", "t", "output", "tensor", "model", "inputSize", "irisEnlarge", "leftOutline", "meshAnnotations", "rightOutline", "eyeLandmarks", "irisLandmarks", "load", "config", "_a", "env", "log", "loadModel", "replaceIrisCoords", "rawCoords", "newCoords", "prefix", "keys", "i", "irisIndices", "key", "indices", "originalIndices", "j", "index", "getLeftToRightEyeDepthDifference", "leftEyeZ", "rightEyeZ", "getEyeBox", "face", "eyeInnerCornerIndex", "eyeOuterCornerIndex", "meshSize", "flip", "box", "squarifyBox", "enlargeBox", "calculateLandmarksBoundingBox", "boxSize", "getBoxSize", "crop", "flipped", "getEyeCoords", "eyeData", "eyeBox", "eyeBoxSize", "eyeRawCoords", "x", "y", "z", "getAdjustedIrisCoords", "irisCoords", "direction", "upperCenterZ", "lowerCenterZ", "averageZ", "coord", "augmentIris", "leftEyeBox", "leftEyeBoxSize", "leftEyeCrop", "rightEyeBox", "rightEyeBoxSize", "rightEyeCrop", "combined", "eyePredictions", "eyePredictionsData", "leftEyeData", "leftEyeRawCoords", "leftIrisRawCoords", "rightEyeData", "rightEyeRawCoords", "rightIrisRawCoords", "leftToRightEyeDepthDifference", "adjustedLeftIrisCoords", "adjustedRightIrisCoords", "LIPS_CONNECTIONS", "LEFT_EYE_CONNECTIONS", "LEFT_EYEBROW_CONNECTIONS", "LEFT_IRIS_CONNECTIONS", "RIGHT_EYE_CONNECTIONS", "RIGHT_EYEBROW_CONNECTIONS", "RIGHT_IRIS_CONNECTIONS", "FACE_OVAL_CONNECTIONS", "connectionsToIndices", "connections", "indices", "connection", "MEDIAPIPE_FACE_MESH_KEYPOINTS_BY_CONTOUR", "LIPS_CONNECTIONS", "LEFT_EYE_CONNECTIONS", "LEFT_EYEBROW_CONNECTIONS", "LEFT_IRIS_CONNECTIONS", "RIGHT_EYE_CONNECTIONS", "RIGHT_EYEBROW_CONNECTIONS", "RIGHT_IRIS_CONNECTIONS", "FACE_OVAL_CONNECTIONS", "indexLabelPairs", "label", "index", "MEDIAPIPE_FACE_MESH_KEYPOINTS", "LANDMARKS_REFINEMENT_LIPS_CONFIG", "LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG", "LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG", "augment", "rawCoords", "results", "t", "r", "irisLDepth", "LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG", "prev", "curr", "i", "irisRDepth", "LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG", "LANDMARKS_REFINEMENT_LIPS_CONFIG", "cache", "model", "inputSize", "predict", "input", "config", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "skipTime", "now", "skipFrame", "getBoxes", "faces", "newCache", "id", "i", "box", "angle", "rotationMatrix", "face", "correctFaceRotation", "size", "equilized", "histogramEqualization", "log", "env", "results", "faceConfidence", "t", "clampBox", "getRawBox", "pt", "key", "blazeFaceLandmarks", "meshT", "coordsReshaped", "rawCoords", "augment", "augmentIris", "transformRawCoords", "meshAnnotations", "index", "calculatedBox", "calculateFaceBox", "load", "loadModel", "triangulation", "TRI468", "uvmap", "UV468", "model", "last", "lastTime", "lastCount", "skipped", "load", "config", "_a", "env", "log", "loadModel", "enhance", "input", "tensor", "crop", "norm", "constants", "predict", "image", "idx", "count", "_b", "_c", "_d", "skipFrame", "skipTime", "now", "resolve", "obj", "enhanced", "resT", "gender", "t", "confidence", "argmax", "age", "all", "desc", "descriptor", "getBoxSize", "box", "getBoxCenter", "cutBoxFromImageAndResize", "image", "cropSize", "h", "w", "boxes", "scaleBoxCoordinates", "factor", "startPoint", "endPoint", "palmLandmarks", "coord", "enlargeBox", "center", "size", "newHalfSize", "squarifyBox", "centers", "halfSize", "normalizeRadians", "angle", "computeRotation", "point1", "point2", "radians", "buildTranslationMatrix", "x", "y", "dot", "v1", "v2", "product", "i", "getColumnFrom2DArr", "arr", "columnIndex", "column", "multiplyTransformMatrices", "mat1", "mat2", "size", "row", "col", "buildRotationMatrix", "rotation", "center", "cosA", "sinA", "rotationMatrix", "translationMatrix", "translationTimesRotation", "negativeTranslationMatrix", "invertTransformMatrix", "matrix", "rotationComponent", "translationComponent", "invertedTranslation", "rotatePoint", "homogeneousCoordinate", "anchors", "HandDetector", "model", "__publicField", "anchors", "anchor", "boxes", "t", "res", "tensor", "rawPalmLandmarks", "index", "input", "config", "constants", "scores", "nms", "hands", "p", "box", "startPoint", "endPoint", "palmLandmarks", "hand", "scaled", "scaleBoxCoordinates", "palmBoxEnlargeFactor", "handBoxEnlargeFactor", "palmLandmarkIds", "palmLandmarksPalmBase", "palmLandmarksMiddleFingerBase", "lastTime", "HandPipeline", "handDetector", "handPoseModel", "__publicField", "landmarks", "xs", "d", "ys", "startPoint", "endPoint", "palmLandmarks", "rotationMatrix", "rotatedPalmLandmarks", "coord", "rotatePoint", "boxAroundPalm", "enlargeBox", "squarifyBox", "boundingBox", "boxAroundHand", "i", "rawCoords", "box2", "angle", "boxSize", "getBoxSize", "scaleFactor", "coordsScaled", "coordsRotationMatrix", "buildRotationMatrix", "coordsRotated", "inverseRotationMatrix", "invertTransformMatrix", "boxCenter", "getBoxCenter", "originalBoxCenter", "dot", "image", "config", "useFreshBox", "boxes", "skipTime", "now", "skipFrame", "hands", "currentBox", "computeRotation", "palmCenter", "palmCenterNormalized", "rotatedImage", "env", "newBox", "croppedInput", "cutBoxFromImageAndResize", "handImage", "constants", "confidenceT", "keypoints", "confidence", "keypointsReshaped", "coords", "nextBoundingBox", "result", "enlarged", "a", "Finger", "value", "FingerCurl", "FingerDirection", "FingerGesture", "name", "__publicField", "finger", "curl", "confidence", "position", "weight", "total", "a", "b", "el", "detectedCurls", "detectedDirections", "fingerIdx", "detectedCurl", "expectedCurls", "expectedCurl", "score", "detectedDirection", "expectedDirections", "expectedDirection", "thumb", "index", "middle", "ring", "pinky", "Finger", "none", "half", "full", "FingerCurl", "verticalUp", "verticalDown", "horizontalLeft", "horizontalRight", "diagonalUpRight", "diagonalUpLeft", "diagonalDownRight", "diagonalDownLeft", "FingerDirection", "ThumbsUp", "FingerGesture", "finger", "Victory", "Point", "MiddleFinger", "OpenPalm", "fingergesture_default", "minConfidence", "options", "calculateSlope", "point1x", "point1y", "point2x", "point2y", "value", "slope", "getSlopes", "point1", "point2", "slopeXY", "slopeYZ", "angleOrientationAt", "angle", "weightageAt", "isVertical", "isDiagonal", "isHorizontal", "estimateFingerCurl", "startPoint", "midPoint", "endPoint", "start_mid_x_dist", "start_end_x_dist", "mid_end_x_dist", "start_mid_y_dist", "start_end_y_dist", "mid_end_y_dist", "start_mid_z_dist", "start_end_z_dist", "mid_end_z_dist", "start_mid_dist", "start_end_dist", "mid_end_dist", "cos_in", "angleOfCurve", "fingerCurl", "FingerCurl", "estimateHorizontalDirection", "max_dist_x", "estimatedDirection", "FingerDirection", "estimateVerticalDirection", "max_dist_y", "estimateDiagonalDirection", "reqd_vertical_direction", "reqd_horizontal_direction", "calculateFingerDirection", "fingerSlopes", "voteVertical", "voteDiagonal", "voteHorizontal", "start_end_x_y_dist_ratio", "max_dist", "calc_start_point_x", "calc_start_point_y", "calc_end_point_x", "calc_end_point_y", "totalAngle", "votes", "fingerSlope", "fingerVotes", "estimate", "landmarks", "slopesXY", "slopesYZ", "fingerCurls", "fingerDirections", "finger", "Finger", "points", "slopeAtXY", "slopeAtYZ", "point", "slopes", "pointIndexAt", "fingerPointsAt", "fingerCurled", "fingerPosition", "analyze", "keypoints", "estimatorRes", "fingerIdx", "match", "poses", "gesture", "fingergesture_default", "confidence", "meshAnnotations", "handDetectorModel", "handPoseModel", "handPipeline", "predict", "input", "config", "predictions", "hands", "i", "annotations", "key", "index", "keypoints", "box", "boxRaw", "pt", "landmarks", "analyze", "load", "_a", "_b", "env", "loadModel", "log", "handDetector", "HandDetector", "HandPipeline", "config", "extensions", "gl", "register", "instance", "_a", "log", "reset", "canvas", "err", "e", "ctx", "kernelConfig", "newKernelConfig", "current", "registerCustomOps", "env", "kernelMod", "op", "check", "instance", "force", "timeStamp", "now", "log", "adapter", "adapterInfo", "register", "available", "tfjs_esm_exports", "simd", "mt", "init", "err", "gl", "fakeOps", "kernelNames", "config", "kernelName", "kernelConfig", "kernel", "models", "modelOutputNodes", "inputSize", "classes", "faceIndex", "boxExpandFact", "maxDetectorResolution", "detectorExpandFact", "skipped", "lastTime", "outputSize", "cache", "fingerMap", "loadDetect", "config", "_a", "env", "log", "fakeOps", "loadModel", "inputs", "loadSkeleton", "detectHands", "input", "config", "hands", "models", "t", "ratio", "height", "maxDetectorResolution", "width", "modelOutputNodes", "classScores", "faceIndex", "id", "nms", "scores", "classNum", "nmsIndex", "boxSlice", "boxYX", "boxData", "boxRaw", "scale", "detectorExpandFact", "boxFull", "outputSize", "score", "label", "classes", "hand", "tensor", "a", "b", "detectFingers", "h", "boxCrop", "inputSize", "constants", "rawScore", "coordsNorm", "kpt", "analyze", "key", "fingerMap", "index", "predict", "_a", "_b", "skipped", "skipTime", "now", "lastTime", "skipFrame", "cache", "resolve", "skipTimeExtended", "skipFrameExtended", "handBox", "oldCache", "i", "boxKpt", "square", "boxScale", "boxExpandFact", "boxScaleRaw", "bbox", "calc", "model", "cached", "skipped", "lastCount", "lastTime", "load", "config", "_a", "env", "log", "loadModel", "predict", "image", "idx", "count", "_b", "skipTime", "now", "skipFrame", "resolve", "resize", "res", "num", "movenetcoords_exports", "__export", "connected", "horizontal", "kpt", "relative", "vertical", "maxJitter", "cache", "bodyParts", "body", "pair", "horizontal", "left", "kp", "right", "tmp", "vertical", "lower", "higher", "compare", "relative", "leftTo", "rightTo", "distanceLeft", "distanceRight", "jitter", "keypoints", "i", "diff", "padInput", "input", "inputSize", "t", "final", "tensor", "rescaleBody", "outputSize", "kpt", "rescaledBoxes", "calc", "pt", "model", "inputSize", "skipped", "cache", "load", "config", "env", "log", "fakeOps", "loadModel", "parseSinglePose", "res", "image", "kpt", "keypoints", "score", "id", "positionRaw", "prev", "curr", "bodies", "newBox", "calc", "pt", "annotations", "name", "indexes", "connected", "i", "pt0", "kp", "pt1", "body", "bodyParts", "parseMultiPose", "totalScore", "a", "b", "predict", "input", "skipTime", "now", "skipFrame", "resolve", "t", "padInput", "rescaleBody", "jitter", "tensor", "model", "last", "lastTime", "skipped", "inputSize", "scaleBox", "load", "config", "env", "loadModel", "inputs", "log", "process", "res", "outputShape", "id", "results", "strideSize", "baseSize", "scoresT", "a", "labels", "scores", "featuresT", "boxesMaxT", "boxIdxT", "boxIdx", "i", "j", "score", "cx", "cy", "boxOffset", "x", "y", "w", "h", "boxRaw", "box", "result", "nmsBoxes", "nmsScores", "nmsIdx", "nms", "_val", "idx", "b", "predict", "image", "skipTime", "now", "skipFrame", "resolve", "outputSize", "resizeT", "normT", "constants", "transposeT", "objectT", "obj", "partNames", "count", "partIds", "result", "jointName", "i", "connectedPartNames", "connectedPartIndices", "jointNameA", "jointNameB", "poseChain", "getBoundingBox", "keypoints", "coord", "maxX", "maxY", "minX", "minY", "x", "y", "scalePoses", "poses", "height", "width", "inputResolutionHeight", "inputResolutionWidth", "scaleY", "scaleX", "scalePose", "pose", "i", "score", "part", "position", "MaxHeap", "maxSize", "getElementValue", "__publicField", "max", "k", "j", "t", "getOffsetPoint", "keypoint", "offsets", "count", "getImageCoords", "outputStride", "heatmapY", "heatmapX", "clamp", "a", "min", "max", "squaredDistance", "y1", "x1", "y2", "x2", "dy", "dx", "addVectors", "b", "model", "poseNetOutputs", "localMaximumRadius", "outputStride", "squaredNmsRadius", "traverse", "edgeId", "sourceKeypoint", "targetId", "scores", "offsets", "displacements", "offsetRefineStep", "getDisplacement", "point", "getStridedIndexNearPoint", "height", "width", "clamp", "sourceKeypointIndices", "displacement", "targetKeypoint", "addVectors", "i", "targetKeypointIndices", "offsetPoint", "getOffsetPoint", "targetKeyPointIndices", "score", "partNames", "decodePose", "root", "displacementsFwd", "displacementsBwd", "tuples", "poseChain", "parentJoinName", "childJoinName", "partIds", "edgesFwd", "childJointId", "edgesBwd", "parentJointId", "numParts", "numEdges", "keypoints", "rootPoint", "getImageCoords", "edge", "sourceId", "scoreIsMaximumInLocalWindow", "keypointId", "heatmapY", "heatmapX", "localMaximum", "yStart", "yEnd", "yCurrent", "xStart", "xEnd", "xCurrent", "buildPartWithScoreQueue", "minConfidence", "numKeypoints", "queue", "MaxHeap", "withinRadius", "poses", "x", "y", "_a", "correspondingKeypoint", "squaredDistance", "getInstanceScore", "existingPoses", "result", "position", "decode", "maxDetected", "rootImageCoords", "a", "box", "getBoundingBox", "predict", "input", "config", "res", "resized", "normalized", "results3d", "buffers", "tensor", "t", "decoded", "scalePoses", "load", "env", "loadModel", "log", "model", "busy", "load", "config", "env", "loadModel", "log", "process", "input", "background", "_a", "_b", "inputImage", "width", "height", "t", "constants", "data", "tensor", "alphaCanvas", "canvas", "alphaCtx", "alphaData", "compositeCanvas", "compositeCtx", "compositeData", "i", "mergedCanvas", "bgImage", "ctxMerge", "Models", "__publicField", "getModelStats", "instance", "totalSizeFromManifest", "totalSizeWeights", "totalSizeLoading", "m", "modelStats", "percentageLoaded", "reset", "model", "load", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "_r", "_s", "_t", "_u", "_v", "_w", "_x", "_y", "_z", "_A", "_B", "_C", "_D", "_E", "_F", "env", "loadPose", "loadDetect", "loadSkeleton", "validateModel", "newInstance", "name", "log", "simpleOps", "ignoreOps", "ops", "missing", "url", "executor", "kernel", "op", "validate", "defined", "res", "options", "modelStats", "httpHandler", "url", "init", "log", "setModelLoadOptions", "config", "loadModel", "modelPath", "_a", "_b", "_c", "modelUrl", "join", "modelPathSegments", "shortModelName", "cachedModelName", "models_exports", "cachedModels", "e", "tfLoadOptions", "model", "b", "loaded", "artifacts", "err", "saveResult", "validateModel", "draw_exports", "__export", "all", "body", "canvas", "face", "gesture", "hand", "object", "options", "person", "getCanvasContext", "input", "log", "ctx", "rad2deg", "theta", "colorDepth", "z", "opt", "rgb", "point", "x", "y", "localOptions", "rect", "width", "height", "cx", "cy", "lines", "points", "pt", "curves", "i", "xc", "yc", "arrow", "from", "to", "radius", "angle", "options", "opt", "drawLabels", "f", "ctx", "labels", "emotion", "a", "rad2deg", "i", "x", "y", "drawIrisElipse", "sizeX", "sizeY", "drawGazeSpheres", "_a", "valX", "valY", "pathV", "pathH", "drawGazeArrows", "_b", "_c", "_d", "leftGaze", "arrow", "rightGaze", "drawFacePolygons", "TRI468", "points", "index", "lines", "drawFacePoints", "point", "LANDMARKS_REFINEMENT_LIPS_CONFIG", "LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG", "LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG", "drawFaceBoxes", "rect", "face", "inCanvas", "result", "drawOptions", "mergeDeep", "options", "getCanvasContext", "body", "inCanvas", "result", "drawOptions", "_a", "localOptions", "mergeDeep", "options", "ctx", "getCanvasContext", "i", "rect", "pt", "colorDepth", "point", "part", "connected", "curves", "hand", "inCanvas", "result", "drawOptions", "localOptions", "mergeDeep", "options", "ctx", "getCanvasContext", "h", "rect", "pt", "colorDepth", "point", "addHandLabel", "part", "title", "z", "addHandLine", "i", "object", "inCanvas", "result", "drawOptions", "localOptions", "mergeDeep", "options", "ctx", "getCanvasContext", "h", "rect", "label", "gesture", "inCanvas", "result", "drawOptions", "localOptions", "mergeDeep", "options", "ctx", "getCanvasContext", "i", "j", "where", "what", "who", "label", "drawTime", "person", "inCanvas", "result", "drawOptions", "localOptions", "mergeDeep", "options", "ctx", "getCanvasContext", "i", "rect", "label", "canvas", "input", "output", "all", "timeStamp", "now", "promise", "face", "body", "hand", "object", "gesture", "env", "expandFact", "alpha", "insidePoly", "x", "y", "polygon", "inside", "j", "i", "mask", "face", "width", "height", "buffer", "silhouette", "pt", "meshAnnotations", "output", "calculateGaze", "face", "radians", "pt1", "pt2", "offsetIris", "eyeRatio", "left", "irisCenter", "eyeCenter", "eyeSize", "eyeDiff", "strength", "calculateFaceAngle", "imageSize", "normalize", "v", "length", "subVectors", "a", "b", "x", "y", "z", "crossVectors", "rotationMatrixToEulerAngle", "r", "r00", "_r01", "_r02", "r10", "r11", "r12", "r20", "r21", "r22", "thetaX", "thetaY", "thetaZ", "mesh", "size", "pts", "pt", "y_axis", "x_axis", "z_axis", "matrix", "angle", "gaze", "detectFace", "instance", "input", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "_r", "_s", "_t", "_u", "_v", "_w", "timeStamp", "now", "ageRes", "gearRes", "genderRes", "emotionRes", "mobilefacenetRes", "insightfaceRes", "antispoofRes", "livenessRes", "descRes", "faceRes", "faces", "predict", "env", "i", "log", "masked", "mask", "rotation", "calculateFaceAngle", "irisSize", "tensor", "res", "body", "res", "gestures", "i", "leftWrist", "a", "rightWrist", "nose", "leftShoulder", "rightShoulder", "face", "zDiff", "xDiff", "mouthOpen", "chinDepth", "iris", "sizeXLeft", "sizeYLeft", "areaLeft", "sizeXRight", "sizeYRight", "areaRight", "center", "leftIrisCenterX", "rightIrisCenterX", "rightIrisCenterY", "leftIrisCenterY", "hand", "fingers", "finger", "pos", "closest", "best", "highest", "poses", "match", "pose", "bufferedResult", "interpolateTime", "calc", "newResult", "config", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "_r", "_s", "_t", "_u", "_v", "_w", "_x", "_y", "_z", "_A", "t0", "now", "elapsed", "bufferedFactor", "i", "box", "newBoxCoord", "j", "boxRaw", "keypoints", "newKpt", "annotations", "coords", "efficientposecoords_exports", "blazeposecoords_exports", "movenetcoords_exports", "name", "indexes", "pt", "pt0", "kp", "pt1", "b", "landmark", "coord", "k", "key", "val", "rotation", "newPersons", "t1", "env", "match_exports", "__export", "distance", "match", "similarity", "descriptor1", "descriptor2", "options", "sum", "i", "diff", "normalizeDistance", "dist", "order", "min", "max", "root", "norm", "descriptor", "descriptors", "lowestDistance", "index", "res", "normalizedSimilarity", "join", "faces", "bodies", "hands", "gestures", "shape", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "id", "persons", "face", "person", "body", "hand", "gesture", "x", "y", "extractXY", "box", "minX", "minY", "face", "body", "warmupBitmap", "instance", "b64toBlob", "base64", "type", "res", "blob", "face", "body", "bitmap", "warmupCanvas", "resolve", "src", "img", "env", "canvas", "log", "ctx", "tensor", "warmupNode", "atob", "str", "tfjs_esm_exports", "data", "expanded", "runInference", "runCompile", "allModels", "backendType", "webGLBackend", "numTensorsStart", "compiledModels", "modelName", "model", "key", "val", "shape", "dtype", "dim", "t", "e", "kernels", "numTensorsEnd", "warmup", "userConfig", "t0", "now", "mergeDeep", "t1", "_numTensors", "_analyzeMemoryLeaks", "_checkSanity", "_sanity", "Human", "userConfig", "__publicField", "__privateAdd", "msg", "__privateGet", "currentTensors", "previousTensors", "__privateSet", "leaked", "log", "input", "d", "e", "similarity", "distance", "match", "event", "_a", "env", "tfVersion", "v", "config", "version", "mergeDeep", "setModelLoadOptions", "tfjs_esm_exports", "Models", "options", "output", "canvas", "result", "face", "body", "hand", "gesture", "object", "person", "all", "triangulation", "uvmap", "validateModel", "currentBackend", "validate", "now", "getTensor", "process", "background", "enhance", "firstImageTensor", "secondImageTensor", "compare", "check", "timeStamp", "count", "model", "load", "current", "calc", "getModelStats", "t0", "res", "warmup", "t1", "profile", "kernels", "total", "kernel", "kernelArr", "key", "a", "b", "resolve", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "_o", "_p", "_q", "_r", "_s", "_t", "_u", "_v", "error", "timeStart", "img", "skip", "faceRes", "bodyRes", "handRes", "objectRes", "detectFace", "bodyConfig", "predict", "handConfig", "gestureRes", "iris", "shape", "join"] } diff --git a/dist/human.esm.d.ts b/dist/human.esm.d.ts index 5817bde8..135dc8be 100644 --- a/dist/human.esm.d.ts +++ b/dist/human.esm.d.ts @@ -200,6 +200,11 @@ export declare interface Config { * default: true if indexdb is available (browsers), false if its not (nodejs) */ cacheModels: boolean; + /** Validate kernel ops used in model during model load + * default: true + * any errors will be printed on console but will be treated as non-fatal + */ + validateModels: boolean; /** Cache sensitivity * - values 0..1 where 0.01 means reset cache if input changed more than 1% * - set to 0 to disable caching @@ -1249,6 +1254,11 @@ declare class Human { where: string; expected?: string; }[]; + /** Check model for invalid kernel ops for current backend */ + check(): { + name: string; + missing: string[]; + }[]; /** Exports face matching methods {@link match#similarity} */ similarity: typeof match.similarity; /** Exports face matching methods {@link match#distance} */ @@ -1482,6 +1492,13 @@ export declare type IrisGesture = 'facing center' | `looking ${'left' | 'right' declare function isHTTPScheme(url: string): boolean; +export declare type KernelOps = { + name: string; + url: string; + missing: string[]; + ops: string[]; +}; + /** * List all models stored in registered storage mediums. * @@ -1871,10 +1888,12 @@ declare namespace models { export { reset, load, + validateModel, validate, Models, ModelStats, - getModelStats + getModelStats, + KernelOps } } export { models } @@ -2502,7 +2521,12 @@ declare type Url = string | io.IOHandler | io.IOHandlerSync; declare type UrlIOHandler = T extends string ? io.IOHandler : T; -declare function validate(instance: Human): Promise; +declare function validate(newInstance: Human): Array<{ + name: string; + missing: string[]; +}>; + +declare function validateModel(newInstance: Human | null, model: GraphModel | null, name: string): KernelOps | null; /** * A mutable `tf.Tensor`, useful for persisting state, e.g. for training. diff --git a/dist/human.esm.js b/dist/human.esm.js index e725df2e..3fcfca63 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -710,7 +710,7 @@ __export(tfjs_esm_exports, { valueAndGrads: () => valueAndGrads, variable: () => variable, variableGrads: () => variableGrads, - version: () => version82, + version: () => V, version_converter: () => version3, version_core: () => version, version_layers: () => version2, @@ -1042,7 +1042,7 @@ var require_long = __commonJS({ 167, 11 ])), {}).exports; - } catch (e) { + } catch (e2) { } function Long2(low, high, unsigned) { this.low = low | 0; @@ -1129,8 +1129,8 @@ var require_long = __commonJS({ } var radixToPower = fromNumber(pow_dbl(radix, 8)); var result = ZERO; - for (var i = 0; i < str.length; i += 8) { - var size2 = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size2), radix); + for (var i2 = 0; i2 < str.length; i2 += 8) { + var size2 = Math.min(8, str.length - i2), value = parseInt(str.substring(i2, i2 + size2), radix); if (size2 < 8) { var power = fromNumber(pow_dbl(radix, size2)); result = result.mul(power).add(fromNumber(value)); @@ -1609,10 +1609,10 @@ var require_alea = __commonJS({ function Alea(seed) { var me = this, mash = Mash(); me.next = function() { - var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + var t2 = 2091639 * me.s0 + me.c * 23283064365386963e-26; me.s0 = me.s1; me.s1 = me.s2; - return me.s2 = t - (me.c = t | 0); + return me.s2 = t2 - (me.c = t2 | 0); }; me.c = 1; me.s0 = mash(" "); @@ -1632,12 +1632,12 @@ var require_alea = __commonJS({ } mash = null; } - function copy2(f, t) { - t.c = f.c; - t.s0 = f.s0; - t.s1 = f.s1; - t.s2 = f.s2; - return t; + function copy2(f, t2) { + t2.c = f.c; + t2.s0 = f.s0; + t2.s1 = f.s1; + t2.s2 = f.s2; + return t2; } function impl(seed, opts) { var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; @@ -1658,20 +1658,20 @@ var require_alea = __commonJS({ return prng; } function Mash() { - var n = 4022871197; + var n2 = 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; + for (var i2 = 0; i2 < data.length; i2++) { + n2 += data.charCodeAt(i2); + var h = 0.02519603282416938 * n2; + n2 = h >>> 0; + h -= n2; + h *= n2; + n2 = h >>> 0; + h -= n2; + n2 += h * 4294967296; } - return (n >>> 0) * 23283064365386963e-26; + return (n2 >>> 0) * 23283064365386963e-26; }; return mash; } @@ -1701,11 +1701,11 @@ var require_xor128 = __commonJS({ me.z = 0; me.w = 0; me.next = function() { - var t = me.x ^ me.x << 11; + var t2 = 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; + return me.w ^= me.w >>> 19 ^ t2 ^ t2 >>> 8; }; if (seed === (seed | 0)) { me.x = seed; @@ -1717,12 +1717,12 @@ var require_xor128 = __commonJS({ me.next(); } } - function copy2(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - return t; + function copy2(f, t2) { + t2.x = f.x; + t2.y = f.y; + t2.z = f.z; + t2.w = f.w; + return t2; } function impl(seed, opts) { var xg = new XorGen(seed), state = opts && opts.state, prng = function() { @@ -1767,12 +1767,12 @@ var require_xorwow = __commonJS({ function XorGen(seed) { var me = this, strseed = ""; me.next = function() { - var t = me.x ^ me.x >>> 2; + var t2 = 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; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t2 ^ t2 << 1)) | 0; }; me.x = 0; me.y = 0; @@ -1792,14 +1792,14 @@ var require_xorwow = __commonJS({ me.next(); } } - function copy2(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 copy2(f, t2) { + t2.x = f.x; + t2.y = f.y; + t2.z = f.z; + t2.w = f.w; + t2.v = f.v; + t2.d = f.d; + return t2; } function impl(seed, opts) { var xg = new XorGen(seed), state = opts && opts.state, prng = function() { @@ -1844,21 +1844,21 @@ var require_xorshift7 = __commonJS({ 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; + var X = me.x, i2 = me.i, t2, v, w; + t2 = X[i2]; + t2 ^= t2 >>> 7; + v = t2 ^ t2 << 24; + t2 = X[i2 + 1 & 7]; + v ^= t2 ^ t2 >>> 10; + t2 = X[i2 + 3 & 7]; + v ^= t2 ^ t2 >>> 3; + t2 = X[i2 + 4 & 7]; + v ^= t2 ^ t2 << 7; + t2 = X[i2 + 7 & 7]; + t2 = t2 ^ t2 << 13; + v ^= t2 ^ t2 << 9; + X[i2] = v; + me.i = i2 + 1 & 7; return v; }; function init22(me2, seed2) { @@ -1887,10 +1887,10 @@ var require_xorshift7 = __commonJS({ } init22(me, seed); } - function copy2(f, t) { - t.x = f.x.slice(); - t.i = f.i; - return t; + function copy2(f, t2) { + t2.x = f.x.slice(); + t2.i = f.i; + return t2; } function impl(seed, opts) { if (seed == null) @@ -1937,20 +1937,20 @@ var require_xor4096 = __commonJS({ function XorGen(seed) { var me = this; me.next = function() { - var w = me.w, X = me.X, i = me.i, t, v; + var w = me.w, X = me.X, i2 = me.i, t2, v; me.w = w = w + 1640531527 | 0; - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; + v = X[i2 + 34 & 127]; + t2 = X[i2 = i2 + 1 & 127]; v ^= v << 13; - t ^= t << 17; + t2 ^= t2 << 17; v ^= v >>> 15; - t ^= t >>> 12; - v = X[i] = v ^ t; - me.i = i; + t2 ^= t2 >>> 12; + v = X[i2] = v ^ t2; + me.i = i2; return v + (w ^ w >>> 16) | 0; }; function init22(me2, seed2) { - var t, v, i, j, w, X = [], limit = 128; + var t2, v, i2, j, w, X = [], limit = 128; if (seed2 === (seed2 | 0)) { v = seed2; seed2 = null; @@ -1959,7 +1959,7 @@ var require_xor4096 = __commonJS({ v = 0; limit = Math.max(limit, seed2.length); } - for (i = 0, j = -32; j < limit; ++j) { + for (i2 = 0, j = -32; j < limit; ++j) { if (seed2) v ^= seed2.charCodeAt((j + 32) % seed2.length); if (j === 0) @@ -1970,34 +1970,34 @@ var require_xor4096 = __commonJS({ v ^= v >>> 13; if (j >= 0) { w = w + 1640531527 | 0; - t = X[j & 127] ^= v + w; - i = 0 == t ? i + 1 : 0; + t2 = X[j & 127] ^= v + w; + i2 = 0 == t2 ? i2 + 1 : 0; } } - if (i >= 128) { + if (i2 >= 128) { X[(seed2 && seed2.length || 0) & 127] = -1; } - i = 127; + i2 = 127; for (j = 4 * 128; j > 0; --j) { - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; + v = X[i2 + 34 & 127]; + t2 = X[i2 = i2 + 1 & 127]; v ^= v << 13; - t ^= t << 17; + t2 ^= t2 << 17; v ^= v >>> 15; - t ^= t >>> 12; - X[i] = v ^ t; + t2 ^= t2 >>> 12; + X[i2] = v ^ t2; } me2.w = w; me2.X = X; - me2.i = i; + me2.i = i2; } init22(me, seed); } - function copy2(f, t) { - t.i = f.i; - t.w = f.w; - t.X = f.X.slice(); - return t; + function copy2(f, t2) { + t2.i = f.i; + t2.w = f.w; + t2.X = f.X.slice(); + return t2; } ; function impl(seed, opts) { @@ -2070,12 +2070,12 @@ var require_tychei = __commonJS({ me.next(); } } - function copy2(f, t) { - t.a = f.a; - t.b = f.b; - t.c = f.c; - t.d = f.d; - return t; + function copy2(f, t2) { + t2.a = f.a; + t2.b = f.b; + t2.c = f.c; + t2.d = f.d; + return t2; } ; function impl(seed, opts) { @@ -2132,18 +2132,18 @@ var require_seedrandom = __commonJS({ ), 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; + var n2 = arc4.g(chunks), d = startdenom, x = 0; + while (n2 < significance) { + n2 = (n2 + x) * width; d *= width; x = arc4.g(1); } - while (n >= overflow) { - n /= 2; + while (n2 >= overflow) { + n2 /= 2; d /= 2; x >>>= 1; } - return (n + x) / d; + return (n2 + x) / d; }; prng.int32 = function() { return arc4.g(4) | 0; @@ -2175,33 +2175,33 @@ var require_seedrandom = __commonJS({ ); } function ARC4(key) { - var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + var t2, keylen = key.length, me = this, i2 = 0, j = me.i = me.j = 0, s2 = me.S = []; if (!keylen) { key = [keylen++]; } - while (i < width) { - s[i] = i++; + while (i2 < width) { + s2[i2] = i2++; } - for (i = 0; i < width; i++) { - s[i] = s[j = mask2 & j + key[i % keylen] + (t = s[i])]; - s[j] = t; + for (i2 = 0; i2 < width; i2++) { + s2[i2] = s2[j = mask2 & j + key[i2 % keylen] + (t2 = s2[i2])]; + s2[j] = t2; } (me.g = function(count22) { - var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + var t3, r2 = 0, i3 = me.i, j2 = me.j, s3 = me.S; while (count22--) { - t2 = s2[i2 = mask2 & i2 + 1]; - r = r * width + s2[mask2 & (s2[i2] = s2[j2 = mask2 & j2 + t2]) + (s2[j2] = t2)]; + t3 = s3[i3 = mask2 & i3 + 1]; + r2 = r2 * width + s3[mask2 & (s3[i3] = s3[j2 = mask2 & j2 + t3]) + (s3[j2] = t3)]; } - me.i = i2; + me.i = i3; me.j = j2; - return r; + return r2; })(width); } - function copy2(f, t) { - t.i = f.i; - t.j = f.j; - t.S = f.S.slice(); - return t; + function copy2(f, t2) { + t2.i = f.i; + t2.j = f.j; + t2.S = f.S.slice(); + return t2; } ; function flatten4(obj, depth) { @@ -2210,7 +2210,7 @@ var require_seedrandom = __commonJS({ for (prop in obj) { try { result.push(flatten4(obj[prop], depth - 1)); - } catch (e) { + } catch (e2) { } } } @@ -2233,7 +2233,7 @@ var require_seedrandom = __commonJS({ (global2.crypto || global2.msCrypto).getRandomValues(out); } return tostring(out); - } catch (e) { + } catch (e2) { var browser = global2.navigator, plugins = browser && browser.plugins; return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; } @@ -2382,10 +2382,10 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ return scriptDirectory + path; } var read_, readAsync, readBinary, setWindowTitle; - function logExceptionOnExit(e) { - if (e instanceof ExitStatus) + function logExceptionOnExit(e2) { + if (e2 instanceof ExitStatus) return; - let toLog = e; + let toLog = e2; err("exiting due to exception: " + toLog); } var fs; @@ -2451,9 +2451,9 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ let nodeWorkerThreads; try { nodeWorkerThreads = require_worker_threads(); - } catch (e) { + } catch (e2) { console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); - throw e; + throw e2; } global.Worker = nodeWorkerThreads.Worker; } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { @@ -2539,8 +2539,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ if (typeof WebAssembly.Function === "function") { var typeNames = { "i": "i32", "j": "i64", "f": "f32", "d": "f64" }; var type = { parameters: [], results: sig[0] == "v" ? [] : [typeNames[sig[0]]] }; - for (var i = 1; i < sig.length; ++i) { - type.parameters.push(typeNames[sig[i]]); + for (var i2 = 1; i2 < sig.length; ++i2) { + type.parameters.push(typeNames[sig[i2]]); } return new WebAssembly.Function(type, func2); } @@ -2549,8 +2549,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ var sigParam = sig.slice(1); var typeCodes = { "i": 127, "j": 126, "f": 125, "d": 124 }; typeSection.push(sigParam.length); - for (var i = 0; i < sigParam.length; ++i) { - typeSection.push(typeCodes[sigParam[i]]); + for (var i2 = 0; i2 < sigParam.length; ++i2) { + typeSection.push(typeCodes[sigParam[i2]]); } if (sigRet == "v") { typeSection.push(0); @@ -2581,10 +2581,10 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ return wasmTable.length - 1; } function updateTableMap(offset, count22) { - for (var i = offset; i < offset + count22; i++) { - var item = getWasmTableEntry(i); + for (var i2 = offset; i2 < offset + count22; i2++) { + var item = getWasmTableEntry(i2); if (item) { - functionsInTableMap.set(item, i); + functionsInTableMap.set(item, i2); } } } @@ -2640,14 +2640,14 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ var cArgs = []; var stack2 = 0; if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; + for (var i2 = 0; i2 < args.length; i2++) { + var converter = toC[argTypes[i2]]; if (converter) { if (stack2 === 0) stack2 = stackSave(); - cArgs[i] = converter(args[i]); + cArgs[i2] = converter(args[i2]); } else { - cArgs[i] = args[i]; + cArgs[i2] = args[i2]; } } } @@ -2728,10 +2728,10 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ return 0; var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); + for (var i2 = 0; i2 < str.length; ++i2) { + var u = str.charCodeAt(i2); if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); + var u1 = str.charCodeAt(++i2); u = 65536 + ((u & 1023) << 10) | u1 & 1023; } if (u <= 127) { @@ -2766,10 +2766,10 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ } function lengthBytesUTF8(str) { var len = 0; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); + for (var i2 = 0; i2 < str.length; ++i2) { + var u = str.charCodeAt(i2); if (u >= 55296 && u <= 57343) - u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i2) & 1023; if (u <= 127) ++len; else if (u <= 2047) @@ -2786,8 +2786,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ GROWABLE_HEAP_I8().set(array2, buffer3); } function writeAsciiToMemory(str, buffer3, dontAddNull) { - for (var i = 0; i < str.length; ++i) { - GROWABLE_HEAP_I8()[buffer3++ >> 0] = str.charCodeAt(i); + for (var i2 = 0; i2 < str.length; ++i2) { + GROWABLE_HEAP_I8()[buffer3++ >> 0] = str.charCodeAt(i2); } if (!dontAddNull) GROWABLE_HEAP_I8()[buffer3 >> 0] = 0; @@ -2931,9 +2931,9 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ ABORT = true; EXITSTATUS = 1; what += ". Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; + var e2 = new WebAssembly.RuntimeError(what); + readyPromiseReject(e2); + throw e2; } var dataURIPrefix = "data:application/octet-stream;base64,"; function isDataURI(filename) { @@ -3039,8 +3039,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ try { var exports2 = Module["instantiateWasm"](info, receiveInstance); return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); + } catch (e2) { + err("Module.instantiateWasm callback failed with error: " + e2); return false; } } @@ -3109,11 +3109,11 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ function _exit(status) { exit(status); } - function handleException(e) { - if (e instanceof ExitStatus || e == "unwind") { + function handleException(e2) { + if (e2 instanceof ExitStatus || e2 == "unwind") { return EXITSTATUS; } - quit_(1, e); + quit_(1, e2); } var PThread = { unusedWorkers: [], runningWorkers: [], tlsInitFunctions: [], init: function() { if (ENVIRONMENT_IS_PTHREAD) { @@ -3123,7 +3123,7 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ } }, initMainThread: function() { var pthreadPoolSize = 8; - for (var i = 0; i < pthreadPoolSize; ++i) { + for (var i2 = 0; i2 < pthreadPoolSize; ++i2) { PThread.allocateUnusedWorker(); } }, initWorker: function() { @@ -3131,14 +3131,14 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ }, pthreads: {}, setExitStatus: function(status) { EXITSTATUS = status; }, terminateAllThreads: function() { - for (var t in PThread.pthreads) { - var pthread = PThread.pthreads[t]; + for (var t2 in PThread.pthreads) { + var pthread = PThread.pthreads[t2]; if (pthread && pthread.worker) { PThread.returnWorkerToPool(pthread.worker); } } - for (var i = 0; i < PThread.unusedWorkers.length; ++i) { - var worker = PThread.unusedWorkers[i]; + for (var i2 = 0; i2 < PThread.unusedWorkers.length; ++i2) { + var worker = PThread.unusedWorkers[i2]; worker.terminate(); } PThread.unusedWorkers = []; @@ -3159,12 +3159,12 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ } }, receiveObjectTransfer: function(data) { }, threadInit: function() { - for (var i in PThread.tlsInitFunctions) { - PThread.tlsInitFunctions[i](); + for (var i2 in PThread.tlsInitFunctions) { + PThread.tlsInitFunctions[i2](); } }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { - worker.onmessage = (e) => { - var d = e["data"]; + worker.onmessage = (e2) => { + var d = e2["data"]; var cmd = d["cmd"]; if (worker.pthread) PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; @@ -3213,17 +3213,17 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ } PThread.currentProxiedOperationCallerThread = void 0; }; - worker.onerror = (e) => { + worker.onerror = (e2) => { var message = "worker sent an error!"; - err(message + " " + e.filename + ":" + e.lineno + ": " + e.message); - throw e; + err(message + " " + e2.filename + ":" + e2.lineno + ": " + e2.message); + throw e2; }; if (ENVIRONMENT_IS_NODE) { worker.on("message", function(data) { worker.onmessage({ data }); }); - worker.on("error", function(e) { - worker.onerror(e); + worker.on("error", function(e2) { + worker.onerror(e2); }); worker.on("detachedExit", function() { }); @@ -3253,8 +3253,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ return _emscripten_proxy_to_main_thread_js(1, 0, returnCode); try { _exit(returnCode); - } catch (e) { - handleException(e); + } catch (e2) { + handleException(e2); } } var wasmTableMirror = []; @@ -3276,8 +3276,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ if (!error.stack) { try { throw new Error(); - } catch (e) { - error = e; + } catch (e2) { + error = e2; } if (!error.stack) { return "(no stack trace available)"; @@ -3295,8 +3295,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ var _emscripten_get_now; if (ENVIRONMENT_IS_NODE) { _emscripten_get_now = () => { - var t = process["hrtime"](); - return t[0] * 1e3 + t[1] / 1e6; + var t2 = process["hrtime"](); + return t2[0] * 1e3 + t2[1] / 1e6; }; } else if (ENVIRONMENT_IS_PTHREAD) { _emscripten_get_now = () => performance.now() - Module["__performance_now_clock_drift"]; @@ -3419,9 +3419,9 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ var serializedNumCallArgs = numCallArgs; var args = stackAlloc(serializedNumCallArgs * 8); var b = args >> 3; - for (var i = 0; i < numCallArgs; i++) { - var arg = outerArgs[2 + i]; - GROWABLE_HEAP_F64()[b + i] = arg; + for (var i2 = 0; i2 < numCallArgs; i2++) { + var arg = outerArgs[2 + i2]; + GROWABLE_HEAP_F64()[b + i2] = arg; } return _emscripten_run_in_main_runtime_thread_js(index2, serializedNumCallArgs, args, sync); }); @@ -3430,8 +3430,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ function _emscripten_receive_on_main_thread_js(index2, 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]; + for (var i2 = 0; i2 < numCallArgs; i2++) { + _emscripten_receive_on_main_thread_js_callArgs[i2] = GROWABLE_HEAP_F64()[b + i2]; } var isEmAsmConst = index2 < 0; var func2 = !isEmAsmConst ? proxiedFunctionTable[index2] : ASM_CONSTS[-index2 - 1]; @@ -3442,7 +3442,7 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ wasmMemory.grow(size2 - buffer2.byteLength + 65535 >>> 16); updateGlobalBufferAndViews(wasmMemory.buffer); return 1; - } catch (e) { + } catch (e2) { } } function _emscripten_resize_heap(requestedSize) { @@ -3467,8 +3467,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ return false; } var JSEvents = { inEventHandler: 0, removeAllEventListeners: function() { - for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { - JSEvents._removeHandler(i); + for (var i2 = JSEvents.eventHandlers.length - 1; i2 >= 0; --i2) { + JSEvents._removeHandler(i2); } JSEvents.eventHandlers = []; JSEvents.deferredCalls = []; @@ -3481,14 +3481,14 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ function arraysHaveEqualContent(arrA, arrB) { if (arrA.length != arrB.length) return false; - for (var i2 in arrA) { - if (arrA[i2] != arrB[i2]) + for (var i3 in arrA) { + if (arrA[i3] != arrB[i3]) return false; } return true; } - for (var i in JSEvents.deferredCalls) { - var call = JSEvents.deferredCalls[i]; + for (var i2 in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i2]; if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { return; } @@ -3498,10 +3498,10 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ 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; + for (var i2 = 0; i2 < JSEvents.deferredCalls.length; ++i2) { + if (JSEvents.deferredCalls[i2].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i2, 1); + --i2; } } }, canPerformEventHandlerRequests: function() { @@ -3510,22 +3510,22 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ if (!JSEvents.canPerformEventHandlerRequests()) { return; } - for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { - var call = JSEvents.deferredCalls[i]; - JSEvents.deferredCalls.splice(i, 1); - --i; + for (var i2 = 0; i2 < JSEvents.deferredCalls.length; ++i2) { + var call = JSEvents.deferredCalls[i2]; + JSEvents.deferredCalls.splice(i2, 1); + --i2; 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--); + for (var i2 = 0; i2 < JSEvents.eventHandlers.length; ++i2) { + if (JSEvents.eventHandlers[i2].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i2].eventTypeString)) { + JSEvents._removeHandler(i2--); } } - }, _removeHandler: function(i) { - var h = JSEvents.eventHandlers[i]; + }, _removeHandler: function(i2) { + var h = JSEvents.eventHandlers[i2]; h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); - JSEvents.eventHandlers.splice(i, 1); + JSEvents.eventHandlers.splice(i2, 1); }, registerOrRemoveHandler: function(eventHandler) { var jsEventHandler = function jsEventHandler2(event) { ++JSEvents.inEventHandler; @@ -3541,9 +3541,9 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ 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--); + for (var i2 = 0; i2 < JSEvents.eventHandlers.length; ++i2) { + if (JSEvents.eventHandlers[i2].target == eventHandler.target && JSEvents.eventHandlers[i2].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i2--); } } } @@ -3692,8 +3692,8 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ 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); + ctx["drawBuffers"] = function(n2, bufs) { + ext["drawBuffersWEBGL"](n2, bufs); }; return 1; } @@ -3707,15 +3707,15 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ } }, getNewId: function(table) { var ret = GL.counter++; - for (var i = table.length; i < ret; i++) { - table[i] = null; + for (var i2 = table.length; i2 < ret; i2++) { + table[i2] = null; } return ret; }, getSource: function(shader, count22, string2, 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()[string2 + i * 4 >> 2], len < 0 ? void 0 : len); + for (var i2 = 0; i2 < count22; ++i2) { + var len = length ? GROWABLE_HEAP_I32()[length + i2 * 4 >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[string2 + i2 * 4 >> 2], len < 0 ? void 0 : len); } return source; }, createContext: function(canvas3, webGLContextAttributes) { @@ -3827,7 +3827,7 @@ var require_tfjs_backend_wasm_threaded_simd = __commonJS({ 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++) { + for (var i2 = 0; i2 < iovcnt; i2++) { var ptr = GROWABLE_HEAP_I32()[iov >> 2]; var len = GROWABLE_HEAP_I32()[iov + 4 >> 2]; iov += 8; @@ -4380,10 +4380,10 @@ var require_tfjs_backend_wasm = __commonJS({ return scriptDirectory + path; } var read_, readAsync, readBinary, setWindowTitle; - function logExceptionOnExit(e) { - if (e instanceof ExitStatus) + function logExceptionOnExit(e2) { + if (e2 instanceof ExitStatus) return; - let toLog = e; + let toLog = e2; err("exiting due to exception: " + toLog); } var fs; @@ -4517,8 +4517,8 @@ var require_tfjs_backend_wasm = __commonJS({ if (typeof WebAssembly.Function === "function") { var typeNames = { "i": "i32", "j": "i64", "f": "f32", "d": "f64" }; var type = { parameters: [], results: sig[0] == "v" ? [] : [typeNames[sig[0]]] }; - for (var i = 1; i < sig.length; ++i) { - type.parameters.push(typeNames[sig[i]]); + for (var i2 = 1; i2 < sig.length; ++i2) { + type.parameters.push(typeNames[sig[i2]]); } return new WebAssembly.Function(type, func2); } @@ -4527,8 +4527,8 @@ var require_tfjs_backend_wasm = __commonJS({ var sigParam = sig.slice(1); var typeCodes = { "i": 127, "j": 126, "f": 125, "d": 124 }; typeSection.push(sigParam.length); - for (var i = 0; i < sigParam.length; ++i) { - typeSection.push(typeCodes[sigParam[i]]); + for (var i2 = 0; i2 < sigParam.length; ++i2) { + typeSection.push(typeCodes[sigParam[i2]]); } if (sigRet == "v") { typeSection.push(0); @@ -4559,10 +4559,10 @@ var require_tfjs_backend_wasm = __commonJS({ return wasmTable.length - 1; } function updateTableMap(offset, count22) { - for (var i = offset; i < offset + count22; i++) { - var item = getWasmTableEntry(i); + for (var i2 = offset; i2 < offset + count22; i2++) { + var item = getWasmTableEntry(i2); if (item) { - functionsInTableMap.set(item, i); + functionsInTableMap.set(item, i2); } } } @@ -4614,14 +4614,14 @@ var require_tfjs_backend_wasm = __commonJS({ var cArgs = []; var stack2 = 0; if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; + for (var i2 = 0; i2 < args.length; i2++) { + var converter = toC[argTypes[i2]]; if (converter) { if (stack2 === 0) stack2 = stackSave(); - cArgs[i] = converter(args[i]); + cArgs[i2] = converter(args[i2]); } else { - cArgs[i] = args[i]; + cArgs[i2] = args[i2]; } } } @@ -4693,10 +4693,10 @@ var require_tfjs_backend_wasm = __commonJS({ return 0; var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); + for (var i2 = 0; i2 < str.length; ++i2) { + var u = str.charCodeAt(i2); if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); + var u1 = str.charCodeAt(++i2); u = 65536 + ((u & 1023) << 10) | u1 & 1023; } if (u <= 127) { @@ -4731,10 +4731,10 @@ var require_tfjs_backend_wasm = __commonJS({ } function lengthBytesUTF8(str) { var len = 0; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); + for (var i2 = 0; i2 < str.length; ++i2) { + var u = str.charCodeAt(i2); if (u >= 55296 && u <= 57343) - u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i2) & 1023; if (u <= 127) ++len; else if (u <= 2047) @@ -4751,8 +4751,8 @@ var require_tfjs_backend_wasm = __commonJS({ HEAP8.set(array2, buffer3); } function writeAsciiToMemory(str, buffer3, dontAddNull) { - for (var i = 0; i < str.length; ++i) { - HEAP8[buffer3++ >> 0] = str.charCodeAt(i); + for (var i2 = 0; i2 < str.length; ++i2) { + HEAP8[buffer3++ >> 0] = str.charCodeAt(i2); } if (!dontAddNull) HEAP8[buffer3 >> 0] = 0; @@ -4861,9 +4861,9 @@ var require_tfjs_backend_wasm = __commonJS({ ABORT = true; EXITSTATUS = 1; what += ". Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; + var e2 = new WebAssembly.RuntimeError(what); + readyPromiseReject(e2); + throw e2; } var dataURIPrefix = "data:application/octet-stream;base64,"; function isDataURI(filename) { @@ -4959,8 +4959,8 @@ var require_tfjs_backend_wasm = __commonJS({ try { var exports2 = Module["instantiateWasm"](info, receiveInstance); return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); + } catch (e2) { + err("Module.instantiateWasm callback failed with error: " + e2); return false; } } @@ -5013,8 +5013,8 @@ var require_tfjs_backend_wasm = __commonJS({ if (!error.stack) { try { throw new Error(); - } catch (e) { - error = e; + } catch (e2) { + error = e2; } if (!error.stack) { return "(no stack trace available)"; @@ -5040,7 +5040,7 @@ var require_tfjs_backend_wasm = __commonJS({ wasmMemory.grow(size2 - buffer2.byteLength + 65535 >>> 16); updateGlobalBufferAndViews(wasmMemory.buffer); return 1; - } catch (e) { + } catch (e2) { } } function _emscripten_resize_heap(requestedSize) { @@ -5086,7 +5086,7 @@ var require_tfjs_backend_wasm = __commonJS({ } function _fd_write(fd, iov, iovcnt, pnum) { var num = 0; - for (var i = 0; i < iovcnt; i++) { + for (var i2 = 0; i2 < iovcnt; i2++) { var ptr = HEAP32[iov >> 2]; var len = HEAP32[iov + 4 >> 2]; iov += 8; @@ -5640,19 +5640,19 @@ function swap(object2, left, right) { } function sum(arr) { let sum7 = 0; - for (let i = 0; i < arr.length; i++) { - sum7 += arr[i]; + for (let i2 = 0; i2 < arr.length; i2++) { + sum7 += arr[i2]; } return sum7; } function randUniform(a, b) { - const r = Math.random(); - return b * r + (1 - r) * a; + const r2 = Math.random(); + return b * r2 + (1 - r2) * a; } function distSquared(a, b) { let result = 0; - for (let i = 0; i < a.length; i++) { - const diff = Number(a[i]) - Number(b[i]); + for (let i2 = 0; i2 < a.length; i2++) { + const diff = Number(a[i2]) - Number(b[i2]); result += diff * diff; } return result; @@ -5673,8 +5673,8 @@ function flatten(arr, result = [], skipTypedArray = false) { result = []; } if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { - for (let i = 0; i < arr.length; ++i) { - flatten(arr[i], result, skipTypedArray); + for (let i2 = 0; i2 < arr.length; ++i2) { + flatten(arr[i2], result, skipTypedArray); } } else { result.push(arr); @@ -5686,8 +5686,8 @@ function sizeFromShape(shape) { return 1; } let size2 = shape[0]; - for (let i = 1; i < shape.length; i++) { - size2 *= shape[i]; + for (let i2 = 1; i2 < shape.length; i2++) { + size2 *= shape[i2]; } return size2; } @@ -5704,8 +5704,8 @@ function arraysEqual(n1, n2) { if (n1.length !== n2.length) { return false; } - for (let i = 0; i < n1.length; i++) { - if (n1[i] !== n2[i]) { + for (let i2 = 0; i2 < n1.length; i2++) { + if (n1[i2] !== n2[i2]) { return false; } } @@ -5731,10 +5731,10 @@ function sizeToSquarishShape(size2) { const width = Math.ceil(Math.sqrt(size2)); return [width, Math.ceil(size2 / width)]; } -function createShuffledIndices(n) { - const shuffledIndices = new Uint32Array(n); - for (let i = 0; i < n; ++i) { - shuffledIndices[i] = i; +function createShuffledIndices(n2) { + const shuffledIndices = new Uint32Array(n2); + for (let i2 = 0; i2 < n2; ++i2) { + shuffledIndices[i2] = i2; } shuffle(shuffledIndices); return shuffledIndices; @@ -5767,16 +5767,16 @@ function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { function inferFromImplicitShape(shape, size2) { 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) { + for (let i2 = 0; i2 < shape.length; ++i2) { + if (shape[i2] >= 0) { + shapeProd *= shape[i2]; + } else if (shape[i2] === -1) { if (implicitIdx !== -1) { - throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i2}`); } - implicitIdx = i; - } else if (shape[i] < 0) { - throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); + implicitIdx = i2; + } else if (shape[i2] < 0) { + throw Error(`Shapes can not be < 0. Found ${shape[i2]} at dim ${i2}`); } } if (implicitIdx === -1) { @@ -5797,7 +5797,7 @@ function inferFromImplicitShape(shape, size2) { } function parseAxisParam(axis, shape) { const rank = shape.length; - axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); + axis = axis == null ? shape.map((s2, i2) => i2) : [].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); @@ -5808,22 +5808,22 @@ function squeezeShape(shape, axis) { 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) { + for (let i2 = 0; i2 < shape.length; ++i2) { 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] === i2 && shape[i2] !== 1) { + throw new Error(`Can't squeeze axis ${i2} since its dim '${shape[i2]}' is not 1`); } - if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { - newShape.push(shape[i]); - keptDims.push(i); + if ((axes[j] == null || axes[j] > i2) && shape[i2] === 1) { + newShape.push(shape[i2]); + keptDims.push(i2); } - if (axes[j] <= i) { + if (axes[j] <= i2) { j++; } } - if (shape[i] !== 1) { - newShape.push(shape[i]); - keptDims.push(i); + if (shape[i2] !== 1) { + newShape.push(shape[i2]); + keptDims.push(i2); } } return { newShape, keptDims }; @@ -5857,8 +5857,8 @@ function getArrayFromDType(dtype, size2) { return values; } function checkConversionForErrors(vals, dtype) { - for (let i = 0; i < vals.length; i++) { - const num = vals[i]; + for (let i2 = 0; i2 < vals.length; i2++) { + const num = vals[i2]; if (isNaN(num) || !isFinite(num)) { throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); } @@ -5934,9 +5934,9 @@ function isFunction(f) { return !!(f && f.constructor && f.call && f.apply); } function nearestDivisor(size2, start) { - for (let i = start; i < size2; ++i) { - if (size2 % i === 0) { - return i; + for (let i2 = start; i2 < size2; ++i2) { + if (size2 % i2 === 0) { + return i2; } } return size2; @@ -5948,8 +5948,8 @@ function computeStrides(shape) { } const strides2 = new Array(rank - 1); strides2[rank - 2] = shape[rank - 1]; - for (let i = rank - 3; i >= 0; --i) { - strides2[i] = strides2[i + 1] * shape[i + 1]; + for (let i2 = rank - 3; i2 >= 0; --i2) { + strides2[i2] = strides2[i2 + 1] * shape[i2 + 1]; } return strides2; } @@ -5957,15 +5957,15 @@ 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]; + for (let i2 = 0; i2 < d; i2++) { + ret[i2] = a[offset + i2]; } } 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); + for (let i2 = 0; i2 < d; i2++) { + ret[i2] = createNestedArray(offset + i2 * len, rest, a, isComplex); } } return ret; @@ -5985,8 +5985,8 @@ function toNestedArray(shape, a, isComplex = false) { } function makeOnesTypedArray(size2, dtype) { const array2 = makeZerosTypedArray(size2, dtype); - for (let i = 0; i < array2.length; i++) { - array2[i] = 1; + for (let i2 = 0; i2 < array2.length; i2++) { + array2[i2] = 1; } return array2; } @@ -6025,8 +6025,8 @@ function locToIndex(locs, rank, strides2) { return locs[0]; } let index2 = locs[locs.length - 1]; - for (let i = 0; i < locs.length - 1; ++i) { - index2 += strides2[i] * locs[i]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index2 += strides2[i2] * locs[i2]; } return index2; } @@ -6037,9 +6037,9 @@ function indexToLoc(index2, rank, strides2) { return [index2]; } const locs = new Array(rank); - for (let i = 0; i < locs.length - 1; ++i) { - locs[i] = Math.floor(index2 / strides2[i]); - index2 -= locs[i] * strides2[i]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + locs[i2] = Math.floor(index2 / strides2[i2]); + index2 -= locs[i2] * strides2[i2]; } locs[locs.length - 1] = index2; return locs; @@ -6145,9 +6145,9 @@ var Environment = class { }; function getQueryParams(queryString) { const params = {}; - queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { - decodeParam(params, t[0], t[1]); - return t.join("="); + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s2, ...t2) => { + decodeParam(params, t2[0], t2[1]); + return t2.join("="); }); return params; } @@ -6522,15 +6522,15 @@ var k2 = hexToLong("9ae16a3b2f90404f"); function shiftMix(val) { return val.xor(val.shru(47)); } -function fetch2(s, offset, numBytes) { - const bytes = s.slice(offset, offset + numBytes); +function fetch2(s2, offset, numBytes) { + const bytes = s2.slice(offset, offset + numBytes); return Long.fromBytes(Array.from(bytes), true, true); } -function fetch64(s, offset) { - return fetch2(s, offset, 8); +function fetch64(s2, offset) { + return fetch2(s2, offset, 8); } -function fetch32(s, offset) { - return fetch2(s, offset, 4); +function fetch32(s2, offset) { + return fetch2(s2, offset, 4); } function rotate64(val, shift) { return shift === 0 ? val : val.shru(shift).or(val.shl(64 - shift)); @@ -6552,83 +6552,83 @@ function weakHashLen32WithSeeds(w, x, y, z, a, b) { b = b.add(rotate64(a, 44)); return [a.add(z), b.add(c)]; } -function weakHashLen32WithSeedsStr(s, offset, a, b) { - return weakHashLen32WithSeeds(fetch64(s, offset), fetch64(s, offset + 8), fetch64(s, offset + 16), fetch64(s, offset + 24), a, b); +function weakHashLen32WithSeedsStr(s2, offset, a, b) { + return weakHashLen32WithSeeds(fetch64(s2, offset), fetch64(s2, offset + 8), fetch64(s2, offset + 16), fetch64(s2, offset + 24), a, b); } -function hashLen0to16(s, len = s.length) { +function hashLen0to16(s2, len = s2.length) { if (len >= 8) { const mul2 = k2.add(len * 2); - const a = fetch64(s, 0).add(k2); - const b = fetch64(s, len - 8); + const a = fetch64(s2, 0).add(k2); + const b = fetch64(s2, len - 8); const c = rotate64(b, 37).mul(mul2).add(a); const d = rotate64(a, 25).add(b).mul(mul2); return hashLen16(c, d, mul2); } if (len >= 4) { const mul2 = k2.add(len * 2); - const a = fetch32(s, 0); - return hashLen16(a.shl(3).add(len), fetch32(s, len - 4), mul2); + const a = fetch32(s2, 0); + return hashLen16(a.shl(3).add(len), fetch32(s2, len - 4), mul2); } if (len > 0) { - const a = s[0]; - const b = s[len >> 1]; - const c = s[len - 1]; + const a = s2[0]; + const b = s2[len >> 1]; + const c = s2[len - 1]; const y = a + (b << 8); const z = len + (c << 2); return shiftMix(k2.mul(y).xor(k0.mul(z))).mul(k2); } return k2; } -function hashLen17to32(s, len = s.length) { +function hashLen17to32(s2, len = s2.length) { const mul2 = k2.add(len * 2); - const a = fetch64(s, 0).mul(k1); - const b = fetch64(s, 8); - const c = fetch64(s, len - 8).mul(mul2); - const d = fetch64(s, len - 16).mul(k2); + const a = fetch64(s2, 0).mul(k1); + const b = fetch64(s2, 8); + const c = fetch64(s2, len - 8).mul(mul2); + const d = fetch64(s2, len - 16).mul(k2); return hashLen16(rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d), a.add(rotate64(b.add(k2), 18)).add(c), mul2); } -function hashLen33to64(s, len = s.length) { +function hashLen33to64(s2, len = s2.length) { const mul2 = k2.add(len * 2); - const a = fetch64(s, 0).mul(k2); - const b = fetch64(s, 8); - const c = fetch64(s, len - 8).mul(mul2); - const d = fetch64(s, len - 16).mul(k2); + const a = fetch64(s2, 0).mul(k2); + const b = fetch64(s2, 8); + const c = fetch64(s2, len - 8).mul(mul2); + const d = fetch64(s2, len - 16).mul(k2); const y = rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d); const z = hashLen16(y, a.add(rotate64(b.add(k2), 18)).add(c), mul2); - const e = fetch64(s, 16).mul(mul2); - const f = fetch64(s, 24); - const g = y.add(fetch64(s, len - 32)).mul(mul2); - const h = z.add(fetch64(s, len - 24)).mul(mul2); - return hashLen16(rotate64(e.add(f), 43).add(rotate64(g, 30)).add(h), e.add(rotate64(f.add(a), 18)).add(g), mul2); + const e2 = fetch64(s2, 16).mul(mul2); + const f = fetch64(s2, 24); + const g = y.add(fetch64(s2, len - 32)).mul(mul2); + const h = z.add(fetch64(s2, len - 24)).mul(mul2); + return hashLen16(rotate64(e2.add(f), 43).add(rotate64(g, 30)).add(h), e2.add(rotate64(f.add(a), 18)).add(g), mul2); } -function fingerPrint64(s, len = s.length) { +function fingerPrint64(s2, len = s2.length) { const seed = Long.fromNumber(81, true); if (len <= 32) { if (len <= 16) { - return hashLen0to16(s, len); + return hashLen0to16(s2, len); } else { - return hashLen17to32(s, len); + return hashLen17to32(s2, len); } } else if (len <= 64) { - return hashLen33to64(s, len); + return hashLen33to64(s2, len); } let x = seed; let y = seed.mul(k1).add(113); let z = shiftMix(y.mul(k2).add(113)).mul(k2); let v = [Long.UZERO, Long.UZERO]; let w = [Long.UZERO, Long.UZERO]; - x = x.mul(k2).add(fetch64(s, 0)); + x = x.mul(k2).add(fetch64(s2, 0)); let offset = 0; const end = (len - 1 >> 6) * 64; const last64 = end + (len - 1 & 63) - 63; do { - x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(k1); - y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(k1); + x = rotate64(x.add(y).add(v[0]).add(fetch64(s2, offset + 8)), 37).mul(k1); + y = rotate64(y.add(v[1]).add(fetch64(s2, offset + 48)), 42).mul(k1); x = x.xor(w[1]); - y = y.add(v[0]).add(fetch64(s, offset + 40)); + y = y.add(v[0]).add(fetch64(s2, offset + 40)); z = rotate64(z.add(w[0]), 33).mul(k1); - v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(k1), x.add(w[0])); - w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16))); + v = weakHashLen32WithSeedsStr(s2, offset, v[1].mul(k1), x.add(w[0])); + w = weakHashLen32WithSeedsStr(s2, offset + 32, z.add(w[1]), y.add(fetch64(s2, offset + 16))); [z, x] = [x, z]; offset += 64; } while (offset !== end); @@ -6637,13 +6637,13 @@ function fingerPrint64(s, len = s.length) { w[0] = w[0].add(len - 1 & 63); v[0] = v[0].add(w[0]); w[0] = w[0].add(v[0]); - x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(mul2); - y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(mul2); + x = rotate64(x.add(y).add(v[0]).add(fetch64(s2, offset + 8)), 37).mul(mul2); + y = rotate64(y.add(v[1]).add(fetch64(s2, offset + 48)), 42).mul(mul2); x = x.xor(w[1].mul(9)); - y = y.add(v[0].mul(9).add(fetch64(s, offset + 40))); + y = y.add(v[0].mul(9).add(fetch64(s2, offset + 40))); z = rotate64(z.add(w[0]), 33).mul(mul2); - v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(mul2), x.add(w[0])); - w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16))); + v = weakHashLen32WithSeedsStr(s2, offset, v[1].mul(mul2), x.add(w[0])); + w = weakHashLen32WithSeedsStr(s2, offset + 32, z.add(w[1]), y.add(fetch64(s2, offset + 16))); [z, x] = [x, z]; return hashLen16(hashLen16(v[0], w[0], mul2).add(shiftMix(y).mul(k0)).add(z), hashLen16(v[1], w[1], mul2).add(x), mul2); } @@ -6675,9 +6675,9 @@ function toTypedArray(a, dtype) { 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; + for (let i2 = 0; i2 < bool.length; ++i2) { + if (Math.round(a[i2]) !== 0) { + bool[i2] = 1; } } return bool; @@ -6691,9 +6691,9 @@ function now2() { function fetch3(path, requestInits) { return env().platform.fetch(path, requestInits); } -function encodeString(s, encoding = "utf-8") { +function encodeString(s2, encoding = "utf-8") { encoding = encoding || "utf-8"; - return env().platform.encode(s, encoding); + return env().platform.encode(s2, encoding); } function decodeString(bytes, encoding = "utf-8") { encoding = encoding || "utf-8"; @@ -6724,8 +6724,8 @@ var Profiler = class { 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]; + for (let i2 = 0; i2 < outputs.length; i2++) { + const output = outputs[i2]; output.data().then((tensorVals) => { checkComputationForErrors(tensorVals, output.dtype, kernelName); }); @@ -6753,8 +6753,8 @@ function checkComputationForErrors(vals, dtype, kernelName) { if (dtype !== "float32") { return false; } - for (let i = 0; i < vals.length; i++) { - const num = vals[i]; + for (let i2 = 0; i2 < vals.length; i2++) { + const num = vals[i2]; if (isNaN(num) || !isFinite(num)) { console.warn(`Found ${num} in the result of '${kernelName}'`); return true; @@ -6784,11 +6784,11 @@ var Logger = class { function getFilteredNodesXToY(tape, xs, y) { const tensorsFromX = {}; const nodesFromX = {}; - for (let i = 0; i < xs.length; i++) { - tensorsFromX[xs[i].id] = true; + for (let i2 = 0; i2 < xs.length; i2++) { + tensorsFromX[xs[i2].id] = true; } - for (let i = 0; i < tape.length; i++) { - const node2 = tape[i]; + for (let i2 = 0; i2 < tape.length; i2++) { + const node2 = tape[i2]; const nodeInputs = node2.inputs; for (const inputName in nodeInputs) { const input2 = nodeInputs[inputName]; @@ -6809,8 +6809,8 @@ function getFilteredNodesXToY(tape, xs, y) { const tensorsLeadToY = {}; tensorsLeadToY[y.id] = true; const nodesToY = {}; - for (let i = tape.length - 1; i >= 0; i--) { - const node2 = tape[i]; + for (let i2 = tape.length - 1; i2 >= 0; i2--) { + const node2 = tape[i2]; const nodeInputs = node2.inputs; for (let j = 0; j < node2.outputs.length; j++) { if (tensorsLeadToY[node2.outputs[j].id]) { @@ -6823,8 +6823,8 @@ function getFilteredNodesXToY(tape, xs, y) { } } const filteredTape = []; - for (let i = 0; i < tape.length; i++) { - const node2 = tape[i]; + for (let i2 = 0; i2 < tape.length; i2++) { + const node2 = tape[i2]; if (nodesFromX[node2.id] && nodesToY[node2.id]) { const prunedInputs = {}; for (const inputName in node2.inputs) { @@ -6842,8 +6842,8 @@ function getFilteredNodesXToY(tape, xs, y) { return filteredTape; } function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { - for (let i = filteredTape.length - 1; i >= 0; i--) { - const node2 = filteredTape[i]; + for (let i2 = filteredTape.length - 1; i2 >= 0; i2--) { + const node2 = filteredTape[i2]; const dys = []; node2.outputs.forEach((o) => { const gradTensor = tensorAccumulatedGradientMap[o.id]; @@ -6894,17 +6894,17 @@ function tensorToString(vals, shape, dtype, verbose) { lines2.push(` shape: [${shape}]`); lines2.push(` values:`); } - lines2.push(valsLines.map((l) => " " + l).join("\n")); + lines2.push(valsLines.map((l3) => " " + l3).join("\n")); return lines2.join("\n"); } function computeMaxSizePerColumn(vals, shape, dtype, strides2) { - const n = sizeFromShape(shape); + const n2 = sizeFromShape(shape); const numCols = strides2[strides2.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++) { + for (let row = 0; row < n2 / 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); @@ -6953,12 +6953,12 @@ function subTensorToString(vals, shape, dtype, strides2, padPerCol, isLast = tru lastVals = createComplexTuples(lastVals); } return [ - "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size2 - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" + "[" + firstVals.map((x, i2) => valToString(x, padPerCol[i2], dtype)).join(", ") + ", ..., " + lastVals.map((x, i2) => valToString(x, padPerCol[size2 - FORMAT_NUM_FIRST_LAST_VALS + i2], dtype)).join(", ") + "]" ]; } const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); return [ - "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" + "[" + displayVals.map((x, i2) => valToString(x, padPerCol[i2], dtype)).join(", ") + "]" ]; } const subshape = shape.slice(1); @@ -6966,31 +6966,31 @@ function subTensorToString(vals, shape, dtype, strides2, padPerCol, isLast = tru const stride = strides2[0] * storagePerElement; const lines2 = []; if (size2 > FORMAT_LIMIT_NUM_VALS) { - for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { - const start = i * stride; + for (let i2 = 0; i2 < FORMAT_NUM_FIRST_LAST_VALS; i2++) { + const start = i2 * stride; const end = start + stride; lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); } lines2.push("..."); - for (let i = size2 - FORMAT_NUM_FIRST_LAST_VALS; i < size2; i++) { - const start = i * stride; + for (let i2 = size2 - FORMAT_NUM_FIRST_LAST_VALS; i2 < size2; i2++) { + const start = i2 * stride; const end = start + stride; - lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size2 - 1)); + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i2 === size2 - 1)); } } else { - for (let i = 0; i < size2; i++) { - const start = i * stride; + for (let i2 = 0; i2 < size2; i2++) { + const start = i2 * stride; const end = start + stride; - lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size2 - 1)); + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i2 === size2 - 1)); } } const sep = rank === 2 ? "," : ""; lines2[0] = "[" + lines2[0] + sep; - for (let i = 1; i < lines2.length - 1; i++) { - lines2[i] = " " + lines2[i] + sep; + for (let i2 = 1; i2 < lines2.length - 1; i2++) { + lines2[i2] = " " + lines2[i2] + sep; } let newLineSep = ",\n"; - for (let i = 2; i < rank; i++) { + for (let i2 = 2; i2 < rank; i2++) { newLineSep += "\n"; } lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); @@ -6998,8 +6998,8 @@ function subTensorToString(vals, shape, dtype, strides2, padPerCol, isLast = tru } function createComplexTuples(vals) { const complexTuples = []; - for (let i = 0; i < vals.length; i += 2) { - complexTuples.push([vals[i], vals[i + 1]]); + for (let i2 = 0; i2 < vals.length; i2 += 2) { + complexTuples.push([vals[i2], vals[i2 + 1]]); } return complexTuples; } @@ -7009,8 +7009,8 @@ var TensorBuffer = class { 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}'.`); + const n2 = values.length; + assert(n2 === this.size, () => `Length of values '${n2}' 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).`); @@ -7030,17 +7030,17 @@ var TensorBuffer = class { if (locs.length === 0) { locs = [0]; } - let i = 0; + let i2 = 0; for (const loc of locs) { - if (loc < 0 || loc >= this.shape[i]) { + if (loc < 0 || loc >= this.shape[i2]) { const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; throw new Error(msg); } - i++; + i2++; } let index2 = locs[locs.length - 1]; - for (let i2 = 0; i2 < locs.length - 1; ++i2) { - index2 += this.strides[i2] * locs[i2]; + for (let i3 = 0; i3 < locs.length - 1; ++i3) { + index2 += this.strides[i3] * locs[i3]; } return this.values[index2]; } @@ -7051,8 +7051,8 @@ var TensorBuffer = class { return locs[0]; } let index2 = locs[locs.length - 1]; - for (let i = 0; i < locs.length - 1; ++i) { - index2 += this.strides[i] * locs[i]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index2 += this.strides[i2] * locs[i2]; } return index2; } @@ -7063,9 +7063,9 @@ var TensorBuffer = class { return [index2]; } const locs = new Array(this.shape.length); - for (let i = 0; i < locs.length - 1; ++i) { - locs[i] = Math.floor(index2 / this.strides[i]); - index2 -= locs[i] * this.strides[i]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + locs[i2] = Math.floor(index2 / this.strides[i2]); + index2 -= locs[i2] * this.strides[i2]; } locs[locs.length - 1] = index2; return locs; @@ -7386,8 +7386,8 @@ var Engine = class { return; } const sortedBackends = this.getSortedBackends(); - for (let i = 0; i < sortedBackends.length; i++) { - const backendName = sortedBackends[i]; + for (let i2 = 0; i2 < sortedBackends.length; i2++) { + const backendName = sortedBackends[i2]; const success = await this.initializeBackend(backendName).success; if (success) { await this.setBackend(backendName); @@ -7539,8 +7539,8 @@ var Engine = class { } initializeBackendsAndReturnBest() { const sortedBackends = this.getSortedBackends(); - for (let i = 0; i < sortedBackends.length; i++) { - const backendName = sortedBackends[i]; + for (let i2 = 0; i2 < sortedBackends.length; i2++) { + const backendName = sortedBackends[i2]; const { success, asyncInit } = this.initializeBackend(backendName); if (asyncInit || success) { return { name: backendName, asyncInit }; @@ -7757,7 +7757,7 @@ var Engine = class { } else { inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); } - const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + const outputTensorsToSave = outputs.filter((_, i2) => outputsToSave[i2]); return inputTensorsToSave.concat(outputTensorsToSave); } return []; @@ -7773,15 +7773,15 @@ var Engine = class { backendVals = values.map((d) => encodeString(d)); } const dataId = backend2.write(backendVals, shape, dtype); - const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); - this.trackTensor(t, backend2); + const t2 = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t2, backend2); if (dtype === "string") { const info = this.state.tensorInfo.get(dataId); const newBytes = bytesFromStringArray(backendVals); this.state.numBytes += newBytes - info.bytes; info.bytes = newBytes; } - return t; + return t2; } makeTensorFromDataId(dataId, shape, dtype, backend2) { dtype = dtype || "float32"; @@ -7790,9 +7790,9 @@ var Engine = class { } makeTensorFromTensorInfo(tensorInfo, backend2) { const { dataId, shape, dtype } = tensorInfo; - const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); - this.trackTensor(t, backend2); - return t; + const t2 = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t2, backend2); + return t2; } makeVariable(initialValue, trainable = true, name, dtype) { name = name || this.nextVariableId().toString(); @@ -7911,9 +7911,9 @@ var Engine = class { } if (gradientsFunc != null) { tapeNode.gradient = (dys) => { - dys = dys.map((dy, i) => { + dys = dys.map((dy, i2) => { if (dy == null) { - const output = outputs[i]; + const output = outputs[i2]; const vals = makeZerosTypedArray(output.size, output.dtype); return this.makeTensor(vals, output.shape, output.dtype); } @@ -7951,9 +7951,9 @@ var Engine = class { } 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]; + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t2) => t2.id)); + for (let i2 = 0; i2 < this.state.activeScope.track.length; i2++) { + const tensor2 = this.state.activeScope.track[i2]; if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { tensor2.dispose(); } @@ -8001,11 +8001,11 @@ var Engine = class { 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"); + assert(inputs.every((t2) => t2 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; + inputs.forEach((input2, i2) => { + inputMap[i2] = input2; }); const forwardFunc = (_, save) => { res = f(...[...inputs, save]); @@ -8017,10 +8017,10 @@ var Engine = class { 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."); + assert(grads2.every((t2) => t2 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; + grads2.forEach((grad2, i2) => { + gradMap[i2] = () => grad2; }); return gradMap; }; @@ -8174,8 +8174,8 @@ function deepAssertShapeConsistency(val, shape, indices) { 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)); + for (let i2 = 0; i2 < val.length; ++i2) { + deepAssertShapeConsistency(val[i2], subShape, indices.concat(i2)); } } function assertDtype(expectedDtype, actualDType, argName, functionName) { @@ -8216,7 +8216,7 @@ function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeri 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)); + return tensors.map((t2, i2) => convertToTensor(t2, `${argName}[${i2}]`, functionName, parseAsDtype)); } var OP_SCOPE_SUFFIX = "__op"; function op(f) { @@ -8270,10 +8270,10 @@ function makeTensor(values, shape, inferredShape, dtype) { 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}). `); + for (let i2 = 0; i2 < inferredShape.length; ++i2) { + const inferred = inferredShape[i2]; + const flatDimsDontMatch = i2 === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i2)) : true; + assert(inferredShape[i2] === shape[i2] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); } } if (!isTypedArray(values) && !Array.isArray(values)) { @@ -8301,21 +8301,21 @@ 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 name = names[i]; - const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; - if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { - throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); + for (let i2 = 0; i2 < names.length; ++i2) { + const name = names[i2]; + const t2 = Array.isArray(tensors) ? tensors[i2].tensor : tensors[name]; + if (t2.dtype !== "float32" && t2.dtype !== "int32" && t2.dtype !== "bool" && t2.dtype !== "string" && t2.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name}': ${t2.dtype}`); } - const spec = { name, shape: t.shape, dtype: t.dtype }; - if (t.dtype === "string") { + const spec = { name, shape: t2.shape, dtype: t2.dtype }; + if (t2.dtype === "string") { const utf8bytes = new Promise(async (resolve) => { - const vals = await t.bytes(); + const vals = await t2.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]; + for (let i3 = 0; i3 < vals.length; i3++) { + const val = vals[i3]; const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); bytes.set(bytesOfLength, offset); offset += NUM_BYTES_STRING_LENGTH; @@ -8326,7 +8326,7 @@ async function encodeWeights(tensors, group) { }); dataPromises.push(utf8bytes); } else { - dataPromises.push(t.data()); + dataPromises.push(t2.data()); } if (group != null) { spec.group = group; @@ -8365,9 +8365,9 @@ function decodeWeights(buffer2, specs) { 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; + for (let i2 = 0; i2 < quantizedArray.length; i2++) { + const v = quantizedArray[i2]; + values[i2] = v * quantization.scale + quantization.min; } } else if (quantization.dtype === "float16") { if (float16Decode === void 0) { @@ -8382,9 +8382,9 @@ function decodeWeights(buffer2, specs) { 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); + for (let i2 = 0; i2 < quantizedArray.length; i2++) { + const v = quantizedArray[i2]; + values[i2] = Math.round(v * quantization.scale + quantization.min); } } else { throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); @@ -8393,7 +8393,7 @@ function decodeWeights(buffer2, specs) { } else if (dtype === "string") { const size22 = sizeFromShape(spec.shape); values = []; - for (let i = 0; i < size22; i++) { + for (let i2 = 0; i2 < size22; i2++) { 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)); @@ -8413,9 +8413,9 @@ function decodeWeights(buffer2, specs) { values = new Float32Array(byteBuffer); const real5 = new Float32Array(values.length / 2); const image2 = new Float32Array(values.length / 2); - for (let i = 0; i < real5.length; i++) { - real5[i] = values[i * 2]; - image2[i] = values[i * 2 + 1]; + for (let i2 = 0; i2 < real5.length; i2++) { + real5[i2] = values[i2 * 2]; + image2[i2] = values[i2 * 2 + 1]; } const realTensor = tensor(real5, shape, "float32"); const imageTensor = tensor(image2, shape, "float32"); @@ -8466,21 +8466,21 @@ function arrayBufferToBase64String(buffer2) { 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]); + let s2 = ""; + for (let i2 = 0, l3 = buf.length; i2 < l3; i2++) { + s2 += String.fromCharCode(buf[i2]); } - return btoa(s); + return btoa(s2); } 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); + const s2 = atob(str); + const buffer2 = new Uint8Array(s2.length); + for (let i2 = 0; i2 < s2.length; ++i2) { + buffer2.set([s2.charCodeAt(i2)], i2); } return buffer2.buffer; } @@ -8570,24 +8570,24 @@ function getModelArtifactsInfoForJSON(modelArtifacts) { }; } function computeFloat16MantisaTable() { - const convertMantissa = (i) => { - let m = i << 13; - let e = 0; + const convertMantissa = (i2) => { + let m = i2 << 13; + let e2 = 0; while ((m & 8388608) === 0) { - e -= 8388608; + e2 -= 8388608; m <<= 1; } m &= ~8388608; - e += 947912704; - return m | e; + e2 += 947912704; + return m | e2; }; const mantisaTable = new Uint32Array(2048); mantisaTable[0] = 0; - for (let i = 1; i < 1024; i++) { - mantisaTable[i] = convertMantissa(i); + for (let i2 = 1; i2 < 1024; i2++) { + mantisaTable[i2] = convertMantissa(i2); } - for (let i = 1024; i < 2048; i++) { - mantisaTable[i] = 939524096 + (i - 1024 << 13); + for (let i2 = 1024; i2 < 2048; i2++) { + mantisaTable[i2] = 939524096 + (i2 - 1024 << 13); } return mantisaTable; } @@ -8597,18 +8597,18 @@ function computeFloat16ExponentTable() { exponentTable[31] = 1199570944; exponentTable[32] = 2147483648; exponentTable[63] = 3347054592; - for (let i = 1; i < 31; i++) { - exponentTable[i] = i << 23; + for (let i2 = 1; i2 < 31; i2++) { + exponentTable[i2] = i2 << 23; } - for (let i = 33; i < 63; i++) { - exponentTable[i] = 2147483648 + (i - 32 << 23); + for (let i2 = 33; i2 < 63; i2++) { + exponentTable[i2] = 2147483648 + (i2 - 32 << 23); } return exponentTable; } function computeFloat16OffsetTable() { const offsetTable = new Uint32Array(64); - for (let i = 0; i < 64; i++) { - offsetTable[i] = 1024; + for (let i2 = 0; i2 < 64; i2++) { + offsetTable[i2] = 1024; } offsetTable[0] = offsetTable[32] = 0; return offsetTable; @@ -9014,8 +9014,8 @@ var BrowserLocalStorageManager = class { 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); + for (let i2 = 0; i2 < this.LS.length; ++i2) { + const key = this.LS.key(i2); if (key.startsWith(prefix) && key.endsWith(suffix)) { const modelPath = getModelPathFromKey(key); out[modelPath] = JSON.parse(this.LS.getItem(key)); @@ -9481,19 +9481,19 @@ function weightsLoaderFactory(fetchWeightsFunction) { }); }); if (!weightsFound.every((found) => found)) { - const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + const weightsNotFound = weightNames.filter((_, i2) => !weightsFound[i2]); 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) => { + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i2) => { if (shouldFetch) { - accumulator.push(i); + accumulator.push(i2); } return accumulator; }, []); const fetchUrls = []; - groupIndicesToFetch.forEach((i) => { - manifest[i].paths.forEach((filepath) => { + groupIndicesToFetch.forEach((i2) => { + manifest[i2].paths.forEach((filepath) => { const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; fetchUrls.push(fetchUrl); }); @@ -9501,21 +9501,21 @@ Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); const buffers = await fetchWeightsFunction(fetchUrls); const weightsTensorMap = {}; let bufferIndexOffset = 0; - groupIndicesToFetch.forEach((i) => { - const numBuffers = manifest[i].paths.length; + groupIndicesToFetch.forEach((i2) => { + const numBuffers = manifest[i2].paths.length; let groupBytes = 0; - for (let i2 = 0; i2 < numBuffers; i2++) { - groupBytes += buffers[bufferIndexOffset + i2].byteLength; + for (let i3 = 0; i3 < numBuffers; i3++) { + groupBytes += buffers[bufferIndexOffset + i3].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]); + for (let i3 = 0; i3 < numBuffers; i3++) { + const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i3]); groupByteBuffer.set(buffer2, groupBufferOffset); groupBufferOffset += buffer2.byteLength; } - const weightsEntries = groupWeightsToFetch[i]; + const weightsEntries = groupWeightsToFetch[i2]; weightsEntries.forEach((weightsEntry) => { const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); @@ -9588,7 +9588,7 @@ var HTTPRequest = class { let modelJSON; try { modelJSON = await modelConfigRequest.json(); - } catch (e) { + } catch (e2) { 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."; @@ -9836,7 +9836,7 @@ var real = op({ real_ }); function transpose_(x, perm, conjugate) { const $x = convertToTensor(x, "x", "transpose"); if (perm == null) { - perm = $x.shape.map((s, i) => i).reverse(); + perm = $x.shape.map((s2, i2) => i2).reverse(); } assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); perm.forEach((axis) => { @@ -9886,10 +9886,10 @@ __export2(broadcast_util_exports, { function getBroadcastDims(inShape, outShape) { const inRank = inShape.length; const dims = []; - for (let i = 0; i < inRank; i++) { - const dim = inRank - 1 - i; + for (let i2 = 0; i2 < inRank; i2++) { + const dim = inRank - 1 - i2; const a = inShape[dim] || 1; - const b = outShape[outShape.length - 1 - i] || 1; + const b = outShape[outShape.length - 1 - i2] || 1; if (b > 1 && a === 1) { dims.unshift(dim); } @@ -9898,9 +9898,9 @@ function getBroadcastDims(inShape, outShape) { } function getReductionAxes(inShape, outShape) { const result = []; - for (let i = 0; i < outShape.length; i++) { - const inDim = inShape[inShape.length - i - 1]; - const outAxis = outShape.length - i - 1; + for (let i2 = 0; i2 < outShape.length; i2++) { + const inDim = inShape[inShape.length - i2 - 1]; + const outAxis = outShape.length - i2 - 1; const outDim = outShape[outAxis]; if (inDim == null || inDim === 1 && outDim > 1) { result.unshift(outAxis); @@ -9910,13 +9910,13 @@ function getReductionAxes(inShape, outShape) { } function assertAndGetBroadcastShape(shapeA, shapeB) { const result = []; - const l = Math.max(shapeA.length, shapeB.length); - for (let i = 0; i < l; i++) { - let a = shapeA[shapeA.length - i - 1]; + const l3 = Math.max(shapeA.length, shapeB.length); + for (let i2 = 0; i2 < l3; i2++) { + let a = shapeA[shapeA.length - i2 - 1]; if (a == null) { a = 1; } - let b = shapeB[shapeB.length - i - 1]; + let b = shapeB[shapeB.length - i2 - 1]; if (b == null) { b = 1; } @@ -10026,9 +10026,9 @@ function fromPixels_(pixels, numChannels = 3) { } else { const numPixels = width * height; values = new Int32Array(numPixels * numChannels); - for (let i = 0; i < numPixels; i++) { + for (let i2 = 0; i2 < numPixels; i2++) { for (let channel = 0; channel < numChannels; ++channel) { - values[i * numChannels + channel] = vals[i * 4 + channel]; + values[i2 * numChannels + channel] = vals[i2 * 4 + channel]; } } } @@ -10053,7 +10053,7 @@ async function fromPixelsAsync(pixels, numChannels = 3) { let imageBitmap; try { imageBitmap = await createImageBitmap(pixels, { premultiplyAlpha: "none" }); - } catch (e) { + } catch (e2) { imageBitmap = null; } if (imageBitmap != null && imageBitmap.width === pixels.width && imageBitmap.height === pixels.height) { @@ -10087,10 +10087,10 @@ async function toPixels(img, canvas3) { const data = await $img.data(); const multiplier = $img.dtype === "float32" ? 255 : 1; const bytes = new Uint8ClampedArray(width * height * 4); - for (let i = 0; i < height * width; ++i) { + for (let i2 = 0; i2 < height * width; ++i2) { const rgba = [0, 0, 0, 255]; for (let d = 0; d < depth; d++) { - const value = data[i * depth + d]; + const value = data[i2 * depth + d]; if ($img.dtype === "float32") { if (value < 0 || value > 1) { throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${value}.`); @@ -10108,7 +10108,7 @@ async function toPixels(img, canvas3) { rgba[d] = value * multiplier; } } - const j = i * 4; + const j = i2 * 4; bytes[j + 0] = Math.round(rgba[0]); bytes[j + 1] = Math.round(rgba[1]); bytes[j + 2] = Math.round(rgba[2]); @@ -10152,16 +10152,16 @@ function prepareAndValidate(tensor2, indices) { const indicesShape = indices.shape; const sliceRank = indicesShape[indicesShape.length - 1]; let nResult = 1; - for (let i = 0; i < indicesShape.length - 1; ++i) { - nResult *= indicesShape[i]; + for (let i2 = 0; i2 < indicesShape.length - 1; ++i2) { + nResult *= indicesShape[i2]; } const inputShape = tensor2.shape; const resultShape = indicesShape.slice(); resultShape.pop(); let sliceSize = 1; - for (let i = sliceRank; i < tensorRank; ++i) { - sliceSize *= inputShape[i]; - resultShape.push(inputShape[i]); + for (let i2 = sliceRank; i2 < tensorRank; ++i2) { + sliceSize *= inputShape[i2]; + resultShape.push(inputShape[i2]); } const strides2 = [ ...computeStrides(tensor2.shape).map((stride) => stride / sliceSize), @@ -10227,8 +10227,8 @@ function calculateShapes(updates, indices, shape) { const sliceRank = indicesRank > 1 ? indices.shape[indicesRank - 1] : 1; const totalNd = shape.length; let sliceSize = 1; - for (let i = sliceRank; i < totalNd; ++i) { - sliceSize *= shape[i]; + for (let i2 = sliceRank; i2 < totalNd; ++i2) { + sliceSize *= shape[i2]; } const safeSliceDim = sliceRank < 1 ? 1 : sliceRank; const numUpdates = sizeFromShape(indices.shape) / safeSliceDim; @@ -10259,8 +10259,8 @@ function assertParamsValid(input2, begin, size2) { const inputRank = input2.shape.length; assert(inputRank === begin.length, () => `Error in slice${inputRank}D: Length of begin ${begin} must match the rank of the array (${inputRank}).`); assert(inputRank === size2.length, () => `Error in slice${inputRank}D: Length of size ${size2} must match the rank of the array (${inputRank}).`); - for (let i = 0; i < inputRank; ++i) { - assert(begin[i] + size2[i] <= input2.shape[i], () => `Error in slice${inputRank}D: begin[${i}] + size[${i}] (${begin[i] + size2[i]}) would overflow input.shape[${i}] (${input2.shape[i]})`); + for (let i2 = 0; i2 < inputRank; ++i2) { + assert(begin[i2] + size2[i2] <= input2.shape[i2], () => `Error in slice${inputRank}D: begin[${i2}] + size[${i2}] (${begin[i2] + size2[i2]}) would overflow input.shape[${i2}] (${input2.shape[i2]})`); } } function maskToAxes(mask2) { @@ -10284,11 +10284,11 @@ function computeOutShape(begin, end, strides2) { } function stridesWithElidedDims(strides2, ellipsisInsertionIndex, numElidedAxes, inputShape) { const newStrides = [...strides2]; - for (let i = newStrides.length; i < inputShape.length; i++) { + for (let i2 = newStrides.length; i2 < inputShape.length; i2++) { newStrides.push(1); } - for (let i = 0; i < numElidedAxes; i++) { - if (i === 0) { + for (let i2 = 0; i2 < numElidedAxes; i2++) { + if (i2 === 0) { newStrides[ellipsisInsertionIndex] = 1; } else { newStrides.splice(ellipsisInsertionIndex, 0, 1); @@ -10305,8 +10305,8 @@ function unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, normalizedAxis) } function getElidedAxes(numElidedAxes, ellipsisInsertionIndex) { const elidedAxes = []; - for (let i = 0; i < numElidedAxes; i++) { - elidedAxes.push(ellipsisInsertionIndex + i); + for (let i2 = 0; i2 < numElidedAxes; i2++) { + elidedAxes.push(ellipsisInsertionIndex + i2); } return elidedAxes; } @@ -10364,12 +10364,12 @@ function stopIndicesWithElidedDims(endMask, ellipsisInsertionIndex, numElidedAxe newIndices[axis] = originalValue; } } - for (let i = 0; i < newIndices.length; i++) { - const axisSize = inputShape[i]; - if (newIndices[i] < 0) { - newIndices[i] += axisSize; + for (let i2 = 0; i2 < newIndices.length; i2++) { + const axisSize = inputShape[i2]; + if (newIndices[i2] < 0) { + newIndices[i2] += axisSize; } - newIndices[i] = clamp(0, newIndices[i], inputShape[i]); + newIndices[i2] = clamp(0, newIndices[i2], inputShape[i2]); } return newIndices; } @@ -10420,14 +10420,14 @@ function stopForAxis(endMask, stopIndices, strides2, inputShape, axis, ellipsisM } function isSliceContinous(shape, begin, size2) { let firstNonOneAxis = size2.length; - for (let i = 0; i < size2.length; i++) { - if (size2[i] > 1) { - firstNonOneAxis = i; + for (let i2 = 0; i2 < size2.length; i2++) { + if (size2[i2] > 1) { + firstNonOneAxis = i2; break; } } - for (let i = firstNonOneAxis + 1; i < size2.length; i++) { - if (begin[i] > 0 || size2[i] !== shape[i]) { + for (let i2 = firstNonOneAxis + 1; i2 < size2.length; i2++) { + if (begin[i2] > 0 || size2[i2] !== shape[i2]) { return false; } } @@ -10435,8 +10435,8 @@ function isSliceContinous(shape, begin, size2) { } function computeFlatOffset(begin, strides2) { let flatOffset = begin.length > 0 ? begin[begin.length - 1] : 1; - for (let i = 0; i < begin.length - 1; i++) { - flatOffset += begin[i] * strides2[i]; + for (let i2 = 0; i2 < begin.length - 1; i2++) { + flatOffset += begin[i2] * strides2[i2]; } return flatOffset; } @@ -10463,12 +10463,12 @@ function parseSliceParams(x, begin, size2) { } else { size_ = size2; } - size_ = size_.map((d, i) => { + size_ = size_.map((d, i2) => { if (d >= 0) { return d; } else { - assert(d === -1, () => `Negative size values should be exactly -1 but got ${d} for the slice() size at index ${i}.`); - return x.shape[i] - begin_[i]; + assert(d === -1, () => `Negative size values should be exactly -1 but got ${d} for the slice() size at index ${i2}.`); + return x.shape[i2] - begin_[i2]; } }); return [begin_, size_]; @@ -10497,11 +10497,11 @@ function sliceInfo(xShape, begin, end, strides2, beginMask, endMask, ellipsisMas newAxisMask, shrinkAxisMask }; - for (let i = 0; i < sparseSpec.dims; i++) { - if (ellipsisSeen && (1 << i & newAxisMask) !== 0) { + for (let i2 = 0; i2 < sparseSpec.dims; i2++) { + if (ellipsisSeen && (1 << i2 & newAxisMask) !== 0) { sparseSpec.numAddAxisAfterEllipsis++; } - if (1 << i & ellipsisMask) { + if (1 << i2 & ellipsisMask) { ellipsisSeen = true; } } @@ -10522,56 +10522,56 @@ function sliceInfo(xShape, begin, end, strides2, beginMask, endMask, ellipsisMas let isSimpleSlice = true; const processingShape = []; const finalShape = []; - for (let i = 0; i < xShape.length; ++i) { - if (denseSpec.strides[i] === 0) { - throw Error(`strides[${i}] must be non-zero`); + for (let i2 = 0; i2 < xShape.length; ++i2) { + if (denseSpec.strides[i2] === 0) { + throw Error(`strides[${i2}] must be non-zero`); } - const shrinkI = !!(denseSpec.shrinkAxisMask & 1 << i); - const dimI = xShape[i]; + const shrinkI = !!(denseSpec.shrinkAxisMask & 1 << i2); + const dimI = xShape[i2]; if (dimI === -1) { processingShape.push(shrinkI ? 1 : -1); continue; } - const masks = [denseSpec.beginMask & 1 << i, denseSpec.endMask & 1 << i]; + const masks = [denseSpec.beginMask & 1 << i2, denseSpec.endMask & 1 << i2]; const validRange = [ - denseSpec.strides[i] > 0 ? 0 : -1, - denseSpec.strides[i] > 0 ? dimI : dimI - 1 + denseSpec.strides[i2] > 0 ? 0 : -1, + denseSpec.strides[i2] > 0 ? dimI : dimI - 1 ]; - if (shrinkI && denseSpec.strides[i] <= 0) { + if (shrinkI && denseSpec.strides[i2] <= 0) { throw Error("only stride 1 allowed on non-range indexing."); } - isSimpleSlice = isSimpleSlice && denseSpec.strides[i] === 1; - const beginAndEndMasked = !!(denseSpec.beginMask & 1 << i && denseSpec.endMask & 1 << i); + isSimpleSlice = isSimpleSlice && denseSpec.strides[i2] === 1; + const beginAndEndMasked = !!(denseSpec.beginMask & 1 << i2 && denseSpec.endMask & 1 << i2); if (denseSpec.beginValid && denseSpec.endValid) { if (shrinkI) { - const xFwd = denseSpec.begin[i] < 0 ? dimI + denseSpec.begin[i] : denseSpec.begin[i]; - denseSpec.begin[i] = xFwd; - denseSpec.end[i] = denseSpec.begin[i] + 1; + const xFwd = denseSpec.begin[i2] < 0 ? dimI + denseSpec.begin[i2] : denseSpec.begin[i2]; + denseSpec.begin[i2] = xFwd; + denseSpec.end[i2] = denseSpec.begin[i2] + 1; if (xFwd < 0 || xFwd >= dimI) { - throw Error(`slice index ${denseSpec.begin[i]} of dimension ${i} out of bounds.`); + throw Error(`slice index ${denseSpec.begin[i2]} of dimension ${i2} out of bounds.`); } } else { - denseSpec.begin[i] = canonical(denseSpec.begin[i], 0, denseSpec.strides[i], dimI, masks, validRange); - denseSpec.end[i] = canonical(denseSpec.end[i], 1, denseSpec.strides[i], dimI, masks, validRange); + denseSpec.begin[i2] = canonical(denseSpec.begin[i2], 0, denseSpec.strides[i2], dimI, masks, validRange); + denseSpec.end[i2] = canonical(denseSpec.end[i2], 1, denseSpec.strides[i2], dimI, masks, validRange); } - const takeAllInDimension = denseSpec.strides[i] === 1 && denseSpec.begin[i] === 0 && denseSpec.end[i] === dimI; + const takeAllInDimension = denseSpec.strides[i2] === 1 && denseSpec.begin[i2] === 0 && denseSpec.end[i2] === dimI; isIdentity = isIdentity && takeAllInDimension; - sliceDim0 = sliceDim0 && (i === 0 && denseSpec.strides[i] === 1 || takeAllInDimension); + sliceDim0 = sliceDim0 && (i2 === 0 && denseSpec.strides[i2] === 1 || takeAllInDimension); } else { - isIdentity = isIdentity && (denseSpec.strides[i] === 1 && beginAndEndMasked); - sliceDim0 = sliceDim0 && (i === 0 && denseSpec.strides[i] === 1 || beginAndEndMasked); + isIdentity = isIdentity && (denseSpec.strides[i2] === 1 && beginAndEndMasked); + sliceDim0 = sliceDim0 && (i2 === 0 && denseSpec.strides[i2] === 1 || beginAndEndMasked); } let intervalLength; let knownInterval = false; if (denseSpec.beginValid && denseSpec.endValid) { - intervalLength = denseSpec.end[i] - denseSpec.begin[i]; + intervalLength = denseSpec.end[i2] - denseSpec.begin[i2]; knownInterval = true; } else if (shrinkI) { intervalLength = 1; knownInterval = true; } else if (beginAndEndMasked) { if (dimI >= 0) { - if (denseSpec.strides[i] < 0) { + if (denseSpec.strides[i2] < 0) { intervalLength = -dimI; } else { intervalLength = dimI; @@ -10581,10 +10581,10 @@ function sliceInfo(xShape, begin, end, strides2, beginMask, endMask, ellipsisMas } if (knownInterval) { let sizeI; - if (intervalLength === 0 || intervalLength < 0 !== denseSpec.strides[i] < 0) { + if (intervalLength === 0 || intervalLength < 0 !== denseSpec.strides[i2] < 0) { sizeI = 0; } else { - sizeI = Math.trunc(intervalLength / denseSpec.strides[i]) + (intervalLength % denseSpec.strides[i] !== 0 ? 1 : 0); + sizeI = Math.trunc(intervalLength / denseSpec.strides[i2]) + (intervalLength % denseSpec.strides[i2] !== 0 ? 1 : 0); } processingShape.push(sizeI); } else { @@ -10599,7 +10599,7 @@ function sliceInfo(xShape, begin, end, strides2, beginMask, endMask, ellipsisMas finalShape.push(1); } } - const finalShapeSparse = finalShape.filter((dim, i) => denseSpec.finalShapeGatherIndices[i] !== NEW_AXIS); + const finalShapeSparse = finalShape.filter((dim, i2) => denseSpec.finalShapeGatherIndices[i2] !== NEW_AXIS); return { finalShapeSparse, finalShape, @@ -10624,9 +10624,9 @@ function buildDenseSpec(sparse2, dense2) { dense2.finalShapeGatherIndices = []; dense2.finalShapeGatherIndicesSparse = []; dense2.inputShapeGatherIndicesSparse = new Array(dense2.dims); - for (let i = 0; i < sparse2.dims; i++) { - if (1 << i & sparse2.ellipsisMask) { - const nextIndex = Math.min(dense2.dims - (sparse2.dims - i) + 1 + sparse2.numAddAxisAfterEllipsis, dense2.dims); + for (let i2 = 0; i2 < sparse2.dims; i2++) { + if (1 << i2 & sparse2.ellipsisMask) { + const nextIndex = Math.min(dense2.dims - (sparse2.dims - i2) + 1 + sparse2.numAddAxisAfterEllipsis, dense2.dims); for (; fullIndex < nextIndex; fullIndex++) { dense2.begin[fullIndex] = 0; dense2.end[fullIndex] = 0; @@ -10635,9 +10635,9 @@ function buildDenseSpec(sparse2, dense2) { dense2.endMask |= 1 << fullIndex; dense2.finalShapeGatherIndices.push(fullIndex); dense2.finalShapeGatherIndicesSparse.push(-1); - dense2.inputShapeGatherIndicesSparse[fullIndex] = i; + dense2.inputShapeGatherIndicesSparse[fullIndex] = i2; } - } else if (1 << i & sparse2.newAxisMask) { + } else if (1 << i2 & sparse2.newAxisMask) { dense2.finalShapeGatherIndices.push(NEW_AXIS); dense2.finalShapeGatherIndicesSparse.push(-1); } else { @@ -10645,27 +10645,27 @@ function buildDenseSpec(sparse2, dense2) { throw Error(`Index out of range using input dim ${fullIndex}; input has only ${dense2.dims} dims, ${dense2.begin.length}.`); } if (sparse2.begin != null) { - dense2.begin[fullIndex] = sparse2.begin[i]; + dense2.begin[fullIndex] = sparse2.begin[i2]; } if (sparse2.end != null) { - dense2.end[fullIndex] = sparse2.end[i]; + dense2.end[fullIndex] = sparse2.end[i2]; } - dense2.strides[fullIndex] = sparse2.strides[i]; - if (sparse2.beginMask & 1 << i) { + dense2.strides[fullIndex] = sparse2.strides[i2]; + if (sparse2.beginMask & 1 << i2) { dense2.beginMask |= 1 << fullIndex; } - if (sparse2.endMask & 1 << i) { + if (sparse2.endMask & 1 << i2) { dense2.endMask |= 1 << fullIndex; } - if (sparse2.shrinkAxisMask & 1 << i) { + if (sparse2.shrinkAxisMask & 1 << i2) { dense2.finalShapeGatherIndices.push(SHRINK_AXIS); dense2.finalShapeGatherIndicesSparse.push(-1); dense2.shrinkAxisMask |= 1 << fullIndex; } else { dense2.finalShapeGatherIndices.push(fullIndex); - dense2.finalShapeGatherIndicesSparse.push(i); + dense2.finalShapeGatherIndicesSparse.push(i2); } - dense2.inputShapeGatherIndicesSparse[fullIndex] = i; + dense2.inputShapeGatherIndicesSparse[fullIndex] = i2; fullIndex++; } } @@ -10764,11 +10764,11 @@ function expectArraysPredicate(actual, expected, predicate) { Actual: ${actualFlat}. Expected: ${expectedFlat}.`); } - for (let i = 0; i < expectedFlat.length; ++i) { - const a = actualFlat[i]; - const e = expectedFlat[i]; - if (!predicate(a, e)) { - throw new Error(`Arrays differ: actual[${i}] = ${a}, expected[${i}] = ${e}. + for (let i2 = 0; i2 < expectedFlat.length; ++i2) { + const a = actualFlat[i2]; + const e2 = expectedFlat[i2]; + if (!predicate(a, e2)) { + throw new Error(`Arrays differ: actual[${i2}] = ${a}, expected[${i2}] = ${e2}. Actual: ${actualFlat}. Expected: ${expectedFlat}.`); } @@ -10784,27 +10784,27 @@ function expectArraysEqual(actual, expected) { } return expectArraysPredicate(actual, expected, (a, b) => areClose(a, b, 0)); } -function expectNumbersClose(a, e, epsilon3) { +function expectNumbersClose(a, e2, epsilon3) { if (epsilon3 == null) { epsilon3 = testEpsilon(); } - if (!areClose(a, e, epsilon3)) { - throw new Error(`Numbers differ: actual === ${a}, expected === ${e}`); + if (!areClose(a, e2, epsilon3)) { + throw new Error(`Numbers differ: actual === ${a}, expected === ${e2}`); } } -function areClose(a, e, epsilon3) { - if (!isFinite(a) && !isFinite(e)) { +function areClose(a, e2, epsilon3) { + if (!isFinite(a) && !isFinite(e2)) { return true; } - if (isNaN(a) || isNaN(e) || Math.abs(a - e) > epsilon3) { + if (isNaN(a) || isNaN(e2) || Math.abs(a - e2) > epsilon3) { return false; } return true; } function expectValuesInRange(actual, low, high) { - for (let i = 0; i < actual.length; i++) { - if (actual[i] < low || actual[i] > high) { - throw new Error(`Value out of range:${actual[i]} low: ${low}, high: ${high}`); + for (let i2 = 0; i2 < actual.length; i2++) { + if (actual[i2] < low || actual[i2] > high) { + throw new Error(`Value out of range:${actual[i2]} low: ${low}, high: ${high}`); } } } @@ -10814,19 +10814,19 @@ function expectArrayBuffersEqual(actual, expected) { if (actualArray.length !== expectedArray.length) { throw new Error(`Expected ArrayBuffer to be of length ${expectedArray.length}, but it was ${actualArray.length}`); } - for (let i = 0; i < expectedArray.length; i++) { - if (actualArray[i] !== expectedArray[i]) { - throw new Error(`Expected ArrayBuffer value at ${i} to be ${expectedArray[i]} but got ${actualArray[i]} instead`); + for (let i2 = 0; i2 < expectedArray.length; i2++) { + if (actualArray[i2] !== expectedArray[i2]) { + throw new Error(`Expected ArrayBuffer value at ${i2} to be ${expectedArray[i2]} but got ${actualArray[i2]} instead`); } } } function encodeStrings(a) { - for (let i = 0; i < a.length; i++) { - const val = a[i]; + for (let i2 = 0; i2 < a.length; i2++) { + const val = a[i2]; if (Array.isArray(val)) { encodeStrings(val); } else { - a[i] = encodeString(val); + a[i2] = encodeString(val); } } return a; @@ -10894,15 +10894,15 @@ var acosh = op({ acosh_ }); function addN_(tensors) { assert(Array.isArray(tensors), () => "The argument passed to tf.addN() must be a list of tensors"); assert(tensors.length >= 1, () => `Must pass at least one tensor to tf.addN(), but got ${tensors.length}`); - const $tensors = tensors.map((t, i) => convertToTensor(t, `tensors${i}`, "addN")); + const $tensors = tensors.map((t2, i2) => convertToTensor(t2, `tensors${i2}`, "addN")); const firstTensor = $tensors[0]; - $tensors.forEach((t) => { - if (t.dtype !== firstTensor.dtype) { + $tensors.forEach((t2) => { + if (t2.dtype !== firstTensor.dtype) { throw new Error("All tensors passed to tf.addN() must have the same dtype"); } }); - $tensors.forEach((t) => { - if (!arraysEqual(t.shape, firstTensor.shape)) { + $tensors.forEach((t2) => { + if (!arraysEqual(t2.shape, firstTensor.shape)) { throw new Error("All tensors passed to tf.addN() must have the same shape"); } }); @@ -11386,11 +11386,11 @@ function basicLSTMCell_(forgetBias, lstmKernel, lstmBias, data, c, h) { const batchSize = res.shape[0]; const sliceCols = res.shape[1] / 4; const sliceSize = [batchSize, sliceCols]; - const i = slice(res, [0, 0], sliceSize); + const i2 = slice(res, [0, 0], sliceSize); const j = slice(res, [0, sliceCols], sliceSize); const f = slice(res, [0, sliceCols * 2], sliceSize); const o = slice(res, [0, sliceCols * 3], sliceSize); - const newC = add2(mul(sigmoid(i), tanh2(j)), mul($c, sigmoid(add2($forgetBias, f)))); + const newC = add2(mul(sigmoid(i2), tanh2(j)), mul($c, sigmoid(add2($forgetBias, f)))); const newH = mul(tanh2(newC), sigmoid(o)); return [newC, newH]; } @@ -11564,14 +11564,14 @@ function broadcastTo_(x, shape) { } const inputShape = input2.shape; const reps = Array.from(shape); - for (let i = shape.length - 1; i >= 0; i--) { - if (inputShape[i] === shape[i]) { - reps[i] = 1; - } else if (input2.shape[i] !== 1) { + for (let i2 = shape.length - 1; i2 >= 0; i2--) { + if (inputShape[i2] === shape[i2]) { + reps[i2] = 1; + } else if (input2.shape[i2] !== 1) { throw new Error(`broadcastTo(): [${xShape}] cannot be broadcast to [${shape}].`); } } - const axes = reps.map((n, i) => n > 1 ? i : -1).filter((i) => i >= 0); + const axes = reps.map((n2, i2) => n2 > 1 ? i2 : -1).filter((i2) => i2 >= 0); if (axes.length === 0) { return clone(input2); } @@ -11925,7 +11925,7 @@ function dot_(t1, t2) { } var dot = op({ dot_ }); function einsum_(equation, ...tensors) { - const $tensors = tensors.map((t, i) => convertToTensor(t, `tensors${i}`, "einsum")); + const $tensors = tensors.map((t2, i2) => convertToTensor(t2, `tensors${i2}`, "einsum")); const attrs = { equation }; return ENGINE.runKernel(Einsum, $tensors, attrs); } @@ -11947,8 +11947,8 @@ function erf_(x) { } var erf = op({ erf_ }); function axesAreInnerMostDims(axes, rank) { - for (let i = 0; i < axes.length; ++i) { - if (axes[axes.length - i - 1] !== rank - 1 - i) { + for (let i2 = 0; i2 < axes.length; ++i2) { + if (axes[axes.length - i2 - 1] !== rank - 1 - i2) { return false; } } @@ -11991,21 +11991,21 @@ function getAxesPermutation(axes, rank) { return null; } const result = []; - for (let i = 0; i < rank; ++i) { - if (axes.indexOf(i) === -1) { - result.push(i); + for (let i2 = 0; i2 < rank; ++i2) { + if (axes.indexOf(i2) === -1) { + result.push(i2); } } axes.forEach((axis) => result.push(axis)); return result; } function getUndoAxesPermutation(axes) { - return axes.map((axis, i) => [i, axis]).sort((a, b) => a[1] - b[1]).map((x) => x[0]); + return axes.map((axis, i2) => [i2, axis]).sort((a, b) => a[1] - b[1]).map((x) => x[0]); } function getInnerMostAxes(numAxes, rank) { const res = []; - for (let i = rank - numAxes; i < rank; ++i) { - res.push(i); + for (let i2 = rank - numAxes; i2 < rank; ++i2) { + res.push(i2); } return res; } @@ -12151,9 +12151,9 @@ function eye_(numRows, numColumns, batchShape, dtype = "float32") { numColumns = numRows; } const buff = buffer([numRows, numColumns], dtype); - const n = numRows <= numColumns ? numRows : numColumns; - for (let i = 0; i < n; ++i) { - buff.set(1, i, i); + const n2 = numRows <= numColumns ? numRows : numColumns; + for (let i2 = 0; i2 < n2; ++i2) { + buff.set(1, i2, i2); } const out = reshape(buff.toTensor(), [numRows, numColumns]); if (batchShape == null) { @@ -12369,9 +12369,9 @@ function variableGrads(f, varList) { assert(grads2.some((g) => g != 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()."); assert(value.rank === 0, () => `The f passed in variableGrads(f) must return a scalar, but it returned a rank-${value.rank} tensor`); const namedGrads = {}; - varList.forEach((v, i) => { - if (grads2[i] != null) { - namedGrads[v.name] = grads2[i]; + varList.forEach((v, i2) => { + if (grads2[i2] != null) { + namedGrads[v.name] = grads2[i2]; } }); if (specifiedNonTrainable != null) { @@ -12654,9 +12654,9 @@ function mirrorPad_(x, paddings, mode) { } assert(paddings.length === $x.rank, () => `Padding doesn't match input. Must be ${$x.rank}. Got ${paddings.length}.`); const shapeOffset = mode === "reflect" ? 1 : 0; - for (let i = 0; i < $x.rank; i++) { - assert(paddings[i].length === 2, () => `Invalid number of paddings. Must be length of 2 each.`); - assert(paddings[i][0] >= 0 && paddings[i][0] <= $x.shape[i] - shapeOffset && paddings[i][1] >= 0 && paddings[i][1] <= $x.shape[i] - shapeOffset, () => `Padding in dimension ${i} cannot be greater than or equal to ${$x.shape[i] - shapeOffset} or less than 0 for input of shape ${$x.shape}`); + for (let i2 = 0; i2 < $x.rank; i2++) { + assert(paddings[i2].length === 2, () => `Invalid number of paddings. Must be length of 2 each.`); + assert(paddings[i2][0] >= 0 && paddings[i2][0] <= $x.shape[i2] - shapeOffset && paddings[i2][1] >= 0 && paddings[i2][1] <= $x.shape[i2] - shapeOffset, () => `Padding in dimension ${i2} cannot be greater than or equal to ${$x.shape[i2] - shapeOffset} or less than 0 for input of shape ${$x.shape}`); } const attrs = { paddings, mode }; const inputs = { x: $x }; @@ -12690,17 +12690,17 @@ function multiRNNCell_(lstmCells, data, c, h) { const $h = convertToTensorArray(h, "h", "multiRNNCell"); let input2 = $data; const newStates = []; - for (let i = 0; i < lstmCells.length; i++) { - const output = lstmCells[i](input2, $c[i], $h[i]); + for (let i2 = 0; i2 < lstmCells.length; i2++) { + const output = lstmCells[i2](input2, $c[i2], $h[i2]); newStates.push(output[0]); newStates.push(output[1]); input2 = output[1]; } const newC = []; const newH = []; - for (let i = 0; i < newStates.length; i += 2) { - newC.push(newStates[i]); - newH.push(newStates[i + 1]); + for (let i2 = 0; i2 < newStates.length; i2 += 2) { + newC.push(newStates[i2]); + newH.push(newStates[i2 + 1]); } return [newC, newH]; } @@ -12781,9 +12781,9 @@ function spaceToBatchND_(x, blockShape, paddings) { const $x = convertToTensor(x, "x", "spaceToBatchND"); assert($x.rank >= 1 + blockShape.length, () => `input rank ${$x.rank} should be > than [blockShape] ${blockShape.length}`); assert(paddings.length === blockShape.length, () => `paddings.shape[0] ${paddings.length} must be equal to [blockShape] ${blockShape.length}`); - assert($x.shape.reduce((a, b, i) => { - if (i > 0 && i <= blockShape.length) { - return a && (b + paddings[i - 1][0] + paddings[i - 1][1]) % blockShape[i - 1] === 0; + assert($x.shape.reduce((a, b, i2) => { + if (i2 > 0 && i2 <= blockShape.length) { + return a && (b + paddings[i2 - 1][0] + paddings[i2 - 1][1]) % blockShape[i2 - 1] === 0; } return a; }, true), () => `input spatial dimensions ${$x.shape.slice(1)} with paddings ${paddings.toString()} must be divisible by blockShapes ${blockShape.toString()}`); @@ -12834,21 +12834,21 @@ function requiredSpaceToBatchPaddings(inputShape, blockShape, basePadding) { const padStart = basePadding.map((b) => b[0]); const origPadEnd = basePadding.map((b) => b[1]); const fullInputShape = inputShape.concat(padStart, origPadEnd); - const padEndExtra = blockShape.map((b, i) => (b - fullInputShape[i] % b) % b); - const padEnd = origPadEnd.map((s, i) => s + padEndExtra[i]); - const paddings = blockShape.map((_, i) => [padStart[i], padEnd[i]]); - const crops = blockShape.map((_, i) => [0, padEndExtra[i]]); + const padEndExtra = blockShape.map((b, i2) => (b - fullInputShape[i2] % b) % b); + const padEnd = origPadEnd.map((s2, i2) => s2 + padEndExtra[i2]); + const paddings = blockShape.map((_, i2) => [padStart[i2], padEnd[i2]]); + const crops = blockShape.map((_, i2) => [0, padEndExtra[i2]]); return [paddings, crops]; } function withSpaceToBatchBasePaddings(filterShape, dilation) { - const dilatedFilterShape = filterShape.map((s, i) => { - return s + (s - 1) * (dilation[i] - 1); + const dilatedFilterShape = filterShape.map((s2, i2) => { + return s2 + (s2 - 1) * (dilation[i2] - 1); }); - const padExtraShape = dilatedFilterShape.map((s) => s - 1); - const padExtraStart = padExtraShape.map((s) => Math.floor(s / 2)); - const padExtraEnd = padExtraShape.map((s, i) => s - padExtraStart[i]); - return padExtraShape.map((_, i) => { - return [padExtraStart[i], padExtraEnd[i]]; + const padExtraShape = dilatedFilterShape.map((s2) => s2 - 1); + const padExtraStart = padExtraShape.map((s2) => Math.floor(s2 / 2)); + const padExtraEnd = padExtraShape.map((s2, i2) => s2 - padExtraStart[i2]); + return padExtraShape.map((_, i2) => { + return [padExtraStart[i2], padExtraEnd[i2]]; }); } var pool = op({ pool_ }); @@ -12881,8 +12881,8 @@ function rand_(shape, randFunction, dtype) { } else { throw new Error(`Unknown data type ${dtype}`); } - for (let i = 0; i < size2; i++) { - values[i] = randFunction(); + for (let i2 = 0; i2 < size2; i2++) { + values[i2] = randFunction(); } return ENGINE.makeTensor(values, shape, dtype); } @@ -12911,13 +12911,13 @@ var MPRandGauss = class { let resultX, resultY; let isValid = false; while (!isValid) { - let v1, v2, s; + let v1, v2, s2; do { v1 = 2 * this.random() - 1; v2 = 2 * this.random() - 1; - s = v1 * v1 + v2 * v2; - } while (s >= 1 || s === 0); - const mul2 = Math.sqrt(-2 * Math.log(s) / s); + s2 = v1 * v1 + v2 * v2; + } while (s2 >= 1 || s2 === 0); + const mul2 = Math.sqrt(-2 * Math.log(s2) / s2); resultX = this.mean + this.stdDev * v1 * mul2; resultY = this.mean + this.stdDev * v2 * mul2; if (!this.truncated || this.isValidTruncated(resultX)) { @@ -13022,8 +13022,8 @@ function randomGamma_(shape, alpha2, beta = 1, dtype = "float32", seed) { } const rgamma = new RandGamma(alpha2, beta, dtype, seed); const res = buffer(shape, dtype); - for (let i = 0; i < res.values.length; i++) { - res.values[i] = rgamma.nextValue(); + for (let i2 = 0; i2 < res.values.length; i2++) { + res.values[i2] = rgamma.nextValue(); } return res.toTensor(); } @@ -13034,8 +13034,8 @@ function randomNormal_(shape, mean5 = 0, stdDev = 1, dtype, seed) { } const randGauss = new MPRandGauss(mean5, stdDev, dtype, false, seed); const res = buffer(shape, dtype); - for (let i = 0; i < res.values.length; i++) { - res.values[i] = randGauss.nextValue(); + for (let i2 = 0; i2 < res.values.length; i2++) { + res.values[i2] = randGauss.nextValue(); } return res.toTensor(); } @@ -13050,8 +13050,8 @@ var randomStandardNormal = op({ randomStandardNormal_ }); function randomUniform_(shape, minval = 0, maxval = 1, dtype = "float32", seed) { const res = buffer(shape, dtype); const random = new UniformRandom(minval, maxval, null, seed); - for (let i = 0; i < res.values.length; i++) { - res.values[i] = random.nextValue(); + for (let i2 = 0; i2 < res.values.length; i2++) { + res.values[i2] = random.nextValue(); } return res.toTensor(); } @@ -13170,17 +13170,17 @@ async function setdiff1dAsync_(x, y) { const yVals = await $y.data(); const ySet = new Set(yVals); let outputSize2 = 0; - for (let i = 0; i < xVals.length; i++) { - if (!ySet.has(xVals[i])) { + for (let i2 = 0; i2 < xVals.length; i2++) { + if (!ySet.has(xVals[i2])) { outputSize2++; } } const buffer2 = new TensorBuffer([outputSize2], $x.dtype); const indices = new TensorBuffer([outputSize2], "int32"); - for (let i = 0, p2 = 0; i < xVals.length; i++) { - if (!ySet.has(xVals[i])) { - buffer2.values[p2] = xVals[i]; - indices.values[p2] = i; + for (let i2 = 0, p2 = 0; i2 < xVals.length; i2++) { + if (!ySet.has(xVals[i2])) { + buffer2.values[p2] = xVals[i2]; + indices.values[p2] = i2; p2++; } } @@ -13267,9 +13267,9 @@ function irfft_(input2) { const imagInput = reshape(imag(input2), [batch, innerDimensionSize]); const realConjugate = reverse(slice(realInput, [0, 1], [batch, innerDimensionSize - 2]), 1); const imagConjugate = mul(reverse(slice(imagInput, [0, 1], [batch, innerDimensionSize - 2]), 1), scalar(-1)); - const r = concat([realInput, realConjugate], 1); - const i = concat([imagInput, imagConjugate], 1); - const complexInput = reshape(complex(r, i), [outputShape[0], outputShape[1]]); + const r2 = concat([realInput, realConjugate], 1); + const i2 = concat([imagInput, imagConjugate], 1); + const complexInput = reshape(complex(r2, i2), [outputShape[0], outputShape[1]]); ret = ifft(complexInput); } ret = real(ret); @@ -13466,8 +13466,8 @@ function truncatedNormal_(shape, mean5 = 0, stdDev = 1, dtype, seed) { } const randGauss = new MPRandGauss(mean5, stdDev, dtype, true, seed); const res = buffer(shape, dtype); - for (let i = 0; i < res.values.length; i++) { - res.values[i] = randGauss.nextValue(); + for (let i2 = 0; i2 < res.values.length; i2++) { + res.values[i2] = randGauss.nextValue(); } return res.toTensor(); } @@ -13506,16 +13506,16 @@ function variable(initialValue, trainable = true, name, dtype) { } function whereImpl(condShape, condVals) { const indices = []; - for (let i = 0; i < condVals.length; i++) { - if (condVals[i]) { - indices.push(i); + for (let i2 = 0; i2 < condVals.length; i2++) { + if (condVals[i2]) { + indices.push(i2); } } const inBuffer = buffer(condShape, "int32"); const out = buffer([indices.length, condShape.length], "int32"); - for (let i = 0; i < indices.length; i++) { - const loc = inBuffer.indexToLoc(indices[i]); - const offset = i * condShape.length; + for (let i2 = 0; i2 < indices.length; i2++) { + const loc = inBuffer.indexToLoc(indices[i2]); + const offset = i2 * condShape.length; out.values.set(loc, offset); } return out.toTensor(); @@ -13539,8 +13539,8 @@ async function booleanMaskAsync_(tensor2, mask2, axis) { assert(maskDim > 0, () => "mask cannot be scalar"); assertShapesMatch(tensorShape.slice(axisFrom, axisFrom + maskDim), $mask.shape, `mask's shape must match the first K dimensions of tensor's shape,`); let leadingSize = 1; - for (let i = axisFrom; i < axisFrom + maskDim; i++) { - leadingSize *= tensorShape[i]; + for (let i2 = axisFrom; i2 < axisFrom + maskDim; i2++) { + leadingSize *= tensorShape[i2]; } const targetTensorShape = tensorShape.slice(0, axisFrom).concat([leadingSize], tensorShape.slice(axisFrom + maskDim)); const reshapedTensor = reshape($tensor, targetTensorShape); @@ -13637,11 +13637,11 @@ function getNoiseShape(x, noiseShape) { } if (x.shape.length === noiseShape.length) { const newDimension = []; - for (let i = 0; i < x.shape.length; i++) { - if (noiseShape[i] == null && x.shape[i] != null) { - newDimension.push(x.shape[i]); + for (let i2 = 0; i2 < x.shape.length; i2++) { + if (noiseShape[i2] == null && x.shape[i2] != null) { + newDimension.push(x.shape[i2]); } else { - newDimension.push(noiseShape[i]); + newDimension.push(noiseShape[i2]); } } return newDimension; @@ -13667,9 +13667,9 @@ function enclosingPowerOfTwo(value) { function cosineWindow(windowLength, a, b) { const even = 1 - windowLength % 2; const newValues = new Float32Array(windowLength); - for (let i = 0; i < windowLength; ++i) { - const cosArg = 2 * Math.PI * i / (windowLength + even - 1); - newValues[i] = a - b * Math.cos(cosArg); + for (let i2 = 0; i2 < windowLength; ++i2) { + const cosArg = 2 * Math.PI * i2 / (windowLength + even - 1); + newValues[i2] = a - b * Math.cos(cosArg); } return tensor1d(newValues, "float32"); } @@ -13689,13 +13689,13 @@ async function inTopKAsync_(predictions, targets, k = 1) { const offset = b * size2; const vals = predictionsVals.subarray(offset, offset + size2); const valAndInd = []; - for (let i = 0; i < vals.length; i++) { - valAndInd.push({ value: vals[i], index: i }); + for (let i2 = 0; i2 < vals.length; i2++) { + valAndInd.push({ value: vals[i2], index: i2 }); } valAndInd.sort((a, b2) => b2.value - a.value); precision3[b] = 0; - for (let i = 0; i < k; i++) { - if (valAndInd[i].index === targetsVals[b]) { + for (let i2 = 0; i2 < k; i2++) { + if (valAndInd[i2].index === targetsVals[b]) { precision3[b] = 1; break; } @@ -13822,7 +13822,7 @@ function fusedConv2d_({ x, filter, strides: strides2, pad: pad3, dataFormat = "N } else if (alphaShape.length === 3) { try { assertAndGetBroadcastShape(alphaShape, convInfo.outShape); - } catch (e) { + } catch (e2) { const errMsg = `Error in fused conv2d: PReLU activation weights (${alphaShape}) is not compatible with the output shape of the conv2d (${convInfo.outShape}).`; throw Error(errMsg); } @@ -14246,9 +14246,9 @@ function nonMaxSuppressionV5Impl(boxes, scores, maxOutputSize, iouThreshold, sco } function nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, returnScoresTensor = false, padToMaxOutputSize = false, returnValidOutputs = false) { const candidates = []; - for (let i = 0; i < scores.length; i++) { - if (scores[i] > scoreThreshold) { - candidates.push({ score: scores[i], boxIndex: i, suppressBeginIndex: 0 }); + for (let i2 = 0; i2 < scores.length; i2++) { + if (scores[i2] > scoreThreshold) { + candidates.push({ score: scores[i2], boxIndex: i2, suppressBeginIndex: 0 }); } } candidates.sort(ascendingComparator); @@ -14298,8 +14298,8 @@ function nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scor } return result; } -function intersectionOverUnion(boxes, i, j) { - const iCoord = boxes.subarray(i * 4, i * 4 + 4); +function intersectionOverUnion(boxes, i2, j) { + const iCoord = boxes.subarray(i2 * 4, i2 * 4 + 4); const jCoord = boxes.subarray(j * 4, j * 4 + 4); const yminI = Math.min(iCoord[0], iCoord[2]); const xminI = Math.min(iCoord[1], iCoord[3]); @@ -14475,14 +14475,14 @@ function threshold_(image2, method = "binary", inverted = false, threshValue = 0 const BLUE_INTENCITY_COEF = 0.114; const totalPixelsInImage = $image.shape[0] * $image.shape[1]; let $threshold = mul(tensor1d([threshValue]), 255); - let r, g, b, grayscale; + let r2, g, b, grayscale; assert($image.rank === 3, () => `Error in threshold: image must be rank 3,but got rank ${$image.rank}.`); assert($image.shape[2] === 3 || $image.shape[2] === 1, () => `Error in threshold: image color channel must be equal to 3 or 1but got ${$image.shape[2]}.`); assert($image.dtype === "int32" || $image.dtype === "float32", () => `Error in dtype: image dtype must be int32 or float32,but got dtype ${$image.dtype}.`); assert(method === "otsu" || method === "binary", () => `Method must be binary or otsu, but was ${method}`); if ($image.shape[2] === 3) { - [r, g, b] = split($image, [1, 1, 1], -1); - const $r = mul(r, RED_INTENCITY_COEF); + [r2, g, b] = split($image, [1, 1, 1], -1); + const $r = mul(r2, RED_INTENCITY_COEF); const $g = mul(g, GREEN_INTENCITY_COEF); const $b = mul(b, BLUE_INTENCITY_COEF); grayscale = add2(add2($r, $g), $b); @@ -14554,9 +14554,9 @@ function bandPart_(a, numLower, numUpper) { if (numUpper < 0) { numUpper = N; } - const i = reshape(range(0, M, 1, "int32"), [-1, 1]); + const i2 = reshape(range(0, M, 1, "int32"), [-1, 1]); const j = range(0, N, 1, "int32"); - const ij = sub(i, j); + const ij = sub(i2, j); const inBand = logicalAnd(lessEqual(ij, scalar(+numLower, "int32")), greaterEqual(ij, scalar(-numUpper, "int32"))); const zero = zeros([M, N], $a.dtype); return reshape(stack(unstack(reshape($a, [-1, M, N])).map((mat) => where(inBand, mat, zero))), shape); @@ -14568,8 +14568,8 @@ function gramSchmidt_(xs) { inputIsTensor2D = false; assert(xs != null && xs.length > 0, () => "Gram-Schmidt process: input must not be null, undefined, or empty"); const dim = xs[0].shape[0]; - for (let i = 1; i < xs.length; ++i) { - assert(xs[i].shape[0] === dim, () => `Gram-Schmidt: Non-unique lengths found in the input vectors: (${xs[i].shape[0]} vs. ${dim})`); + for (let i2 = 1; i2 < xs.length; ++i2) { + assert(xs[i2].shape[0] === dim, () => `Gram-Schmidt: Non-unique lengths found in the input vectors: (${xs[i2].shape[0]} vs. ${dim})`); } } else { inputIsTensor2D = true; @@ -14578,11 +14578,11 @@ function gramSchmidt_(xs) { assert(xs.length <= xs[0].shape[0], () => `Gram-Schmidt: Number of vectors (${xs.length}) exceeds number of dimensions (${xs[0].shape[0]}).`); const ys = []; const xs1d = xs; - for (let i = 0; i < xs.length; ++i) { + for (let i2 = 0; i2 < xs.length; ++i2) { ys.push(ENGINE.tidy(() => { - let x = xs1d[i]; - if (i > 0) { - for (let j = 0; j < i; ++j) { + let x = xs1d[i2]; + if (i2 > 0) { + for (let j = 0; j < i2; ++j) { const proj = mul(sum2(mul(ys[j], x)), ys[j]); x = sub(x, proj); } @@ -14616,30 +14616,30 @@ function qr_(x, fullMatrices = false) { r2ds.push(r2d); }); const q = reshape(stack(q2ds, 0), x.shape); - const r = reshape(stack(r2ds, 0), x.shape); - return [q, r]; + const r2 = reshape(stack(r2ds, 0), x.shape); + return [q, r2]; } } function qr2d(x, fullMatrices = false) { return ENGINE.tidy(() => { assert(x.shape.length === 2, () => `qr2d() requires a 2D Tensor, but got a ${x.shape.length}D Tensor.`); const m = x.shape[0]; - const n = x.shape[1]; + const n2 = x.shape[1]; let q = eye(m); - let r = clone(x); + let r2 = clone(x); const one2D = tensor2d([[1]], [1, 1]); let w = clone(one2D); - const iters = m >= n ? n : m; + const iters = m >= n2 ? n2 : m; for (let j = 0; j < iters; ++j) { - const rTemp = r; + const rTemp = r2; const wTemp = w; const qTemp = q; - [w, r, q] = ENGINE.tidy(() => { - const rjEnd1 = slice(r, [j, j], [m - j, 1]); + [w, r2, q] = ENGINE.tidy(() => { + const rjEnd1 = slice(r2, [j, j], [m - j, 1]); const normX = norm(rjEnd1); - const rjj = slice(r, [j, j], [1, 1]); - const s = where(greater(rjj, 0), tensor2d([[-1]]), tensor2d([[1]])); - const u1 = sub(rjj, mul(s, normX)); + const rjj = slice(r2, [j, j], [1, 1]); + const s2 = where(greater(rjj, 0), tensor2d([[-1]]), tensor2d([[1]])); + const u1 = sub(rjj, mul(s2, normX)); const wPre = div(rjEnd1, u1); if (wPre.shape[0] === 1) { w = clone(one2D); @@ -14649,15 +14649,15 @@ function qr2d(x, fullMatrices = false) { slice(wPre, [1, 0], [wPre.shape[0] - 1, wPre.shape[1]]) ], 0); } - const tau = neg(div(matMul(s, u1), normX)); - const rjEndAll = slice(r, [j, 0], [m - j, n]); + const tau = neg(div(matMul(s2, u1), normX)); + const rjEndAll = slice(r2, [j, 0], [m - j, n2]); const tauTimesW = mul(tau, w); const wT = transpose(w); if (j === 0) { - r = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll))); + r2 = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll))); } else { const rTimesTau = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll))); - r = concat([slice(r, [0, 0], [j, n]), rTimesTau], 0); + r2 = concat([slice(r2, [0, 0], [j, n2]), rTimesTau], 0); } const tawTimesWT = transpose(tauTimesW); const qAllJEnd = slice(q, [0, j], [m, q.shape[1] - j]); @@ -14667,15 +14667,15 @@ function qr2d(x, fullMatrices = false) { const qTimesTau = sub(qAllJEnd, matMul(matMul(qAllJEnd, w), tawTimesWT)); q = concat([slice(q, [0, 0], [m, j]), qTimesTau], 1); } - return [w, r, q]; + return [w, r2, q]; }); dispose([rTemp, wTemp, qTemp]); } - if (!fullMatrices && m > n) { - q = slice(q, [0, 0], [m, n]); - r = slice(r, [0, 0], [n, n]); + if (!fullMatrices && m > n2) { + q = slice(q, [0, 0], [m, n2]); + r2 = slice(r2, [0, 0], [n2, n2]); } - return [q, r]; + return [q, r2]; }); } var qr = op({ qr_ }); @@ -15154,27 +15154,27 @@ var AdadeltaOptimizer = class extends Optimizer { } applyGradients(variableGradients) { const variableNames = Array.isArray(variableGradients) ? variableGradients.map((item) => item.name) : Object.keys(variableGradients); - variableNames.forEach((name, i) => { + variableNames.forEach((name, i2) => { const value = ENGINE.registeredVariables[name]; const trainable = false; - if (this.accumulatedGrads[i] == null) { - this.accumulatedGrads[i] = { + if (this.accumulatedGrads[i2] == null) { + this.accumulatedGrads[i2] = { originalName: `${name}/accum_grad`, variable: tidy(() => zerosLike(value).variable(trainable)) }; } - if (this.accumulatedUpdates[i] == null) { - this.accumulatedUpdates[i] = { + if (this.accumulatedUpdates[i2] == null) { + this.accumulatedUpdates[i2] = { originalName: `${name}/accum_var`, variable: tidy(() => zerosLike(value).variable(trainable)) }; } - const gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name]; + const gradient = Array.isArray(variableGradients) ? variableGradients[i2].tensor : variableGradients[name]; if (gradient == null) { return; } - const accumulatedGrad = this.accumulatedGrads[i].variable; - const accumulatedUpdate = this.accumulatedUpdates[i].variable; + const accumulatedGrad = this.accumulatedGrads[i2].variable; + const accumulatedUpdate = this.accumulatedUpdates[i2].variable; tidy(() => { const newAccumulatedGrad = add2(mul(accumulatedGrad, this.rho), mul(square(gradient), 1 - this.rho)); const updates = mul(div(sqrt(add2(accumulatedUpdate, this.epsilon)), sqrt(add2(accumulatedGrad, this.epsilon))), gradient); @@ -15232,20 +15232,20 @@ var AdagradOptimizer = class extends Optimizer { } applyGradients(variableGradients) { const variableNames = Array.isArray(variableGradients) ? variableGradients.map((item) => item.name) : Object.keys(variableGradients); - variableNames.forEach((name, i) => { + variableNames.forEach((name, i2) => { const value = ENGINE.registeredVariables[name]; - if (this.accumulatedGrads[i] == null) { + if (this.accumulatedGrads[i2] == null) { const trainable = false; - this.accumulatedGrads[i] = { + this.accumulatedGrads[i2] = { originalName: `${name}/accumulator`, variable: tidy(() => fill(value.shape, this.initialAccumulatorValue).variable(trainable)) }; } - const gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name]; + const gradient = Array.isArray(variableGradients) ? variableGradients[i2].tensor : variableGradients[name]; if (gradient == null) { return; } - const accumulatedGrad = this.accumulatedGrads[i].variable; + const accumulatedGrad = this.accumulatedGrads[i2].variable; tidy(() => { const newAccumulatedGrad = add2(accumulatedGrad, square(gradient)); accumulatedGrad.assign(newAccumulatedGrad); @@ -15302,27 +15302,27 @@ var AdamOptimizer = class extends Optimizer { tidy(() => { const oneMinusAccBeta1 = sub(1, this.accBeta1); const oneMinusAccBeta2 = sub(1, this.accBeta2); - varNames.forEach((name, i) => { + varNames.forEach((name, i2) => { const value = ENGINE.registeredVariables[name]; const trainable = false; - if (this.accumulatedFirstMoment[i] == null) { - this.accumulatedFirstMoment[i] = { + if (this.accumulatedFirstMoment[i2] == null) { + this.accumulatedFirstMoment[i2] = { originalName: `${name}/m`, variable: tidy(() => zerosLike(value).variable(trainable)) }; } - if (this.accumulatedSecondMoment[i] == null) { - this.accumulatedSecondMoment[i] = { + if (this.accumulatedSecondMoment[i2] == null) { + this.accumulatedSecondMoment[i2] = { originalName: `${name}/v`, variable: tidy(() => zerosLike(value).variable(trainable)) }; } - const gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name]; + const gradient = Array.isArray(variableGradients) ? variableGradients[i2].tensor : variableGradients[name]; if (gradient == null) { return; } - const firstMoment = this.accumulatedFirstMoment[i].variable; - const secondMoment = this.accumulatedSecondMoment[i].variable; + const firstMoment = this.accumulatedFirstMoment[i2].variable; + const secondMoment = this.accumulatedSecondMoment[i2].variable; const newFirstMoment = add2(mul(firstMoment, this.beta1), mul(gradient, 1 - this.beta1)); const newSecondMoment = add2(mul(secondMoment, this.beta2), mul(square(gradient), 1 - this.beta2)); const biasCorrectedFirstMoment = div(newFirstMoment, oneMinusAccBeta1); @@ -15405,27 +15405,27 @@ var AdamaxOptimizer = class extends Optimizer { tidy(() => { const oneMinusAccBeta1 = sub(1, this.accBeta1); const lr = div(-this.learningRate, add2(mul(this.iteration, this.decay), 1)); - variableNames.forEach((name, i) => { + variableNames.forEach((name, i2) => { const value = ENGINE.registeredVariables[name]; const trainable = false; - if (this.accumulatedFirstMoment[i] == null) { - this.accumulatedFirstMoment[i] = { + if (this.accumulatedFirstMoment[i2] == null) { + this.accumulatedFirstMoment[i2] = { originalName: `${name}/m`, variable: zerosLike(value).variable(trainable) }; } - if (this.accumulatedWeightedInfNorm[i] == null) { - this.accumulatedWeightedInfNorm[i] = { + if (this.accumulatedWeightedInfNorm[i2] == null) { + this.accumulatedWeightedInfNorm[i2] = { originalName: `${name}/v`, variable: zerosLike(value).variable(trainable) }; } - const gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name]; + const gradient = Array.isArray(variableGradients) ? variableGradients[i2].tensor : variableGradients[name]; if (gradient == null) { return; } - const firstMoment = this.accumulatedFirstMoment[i].variable; - const weightedInfNorm = this.accumulatedWeightedInfNorm[i].variable; + const firstMoment = this.accumulatedFirstMoment[i2].variable; + const weightedInfNorm = this.accumulatedWeightedInfNorm[i2].variable; const newFirstMoment = add2(mul(firstMoment, this.beta1), mul(gradient, 1 - this.beta1)); const ut0 = mul(weightedInfNorm, this.beta2); const ut1 = abs(gradient); @@ -15479,8 +15479,8 @@ var SGDOptimizer = class extends Optimizer { } applyGradients(variableGradients) { const varNames = Array.isArray(variableGradients) ? variableGradients.map((v) => v.name) : Object.keys(variableGradients); - varNames.forEach((name, i) => { - const gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name]; + varNames.forEach((name, i2) => { + const gradient = Array.isArray(variableGradients) ? variableGradients[i2].tensor : variableGradients[name]; if (gradient == null) { return; } @@ -15531,17 +15531,17 @@ var MomentumOptimizer = class extends SGDOptimizer { } applyGradients(variableGradients) { const variableNames = Array.isArray(variableGradients) ? variableGradients.map((item) => item.name) : Object.keys(variableGradients); - variableNames.forEach((name, i) => { + variableNames.forEach((name, i2) => { const value = ENGINE.registeredVariables[name]; - if (this.accumulations[i] == null) { + if (this.accumulations[i2] == null) { const trainable = false; - this.accumulations[i] = { + this.accumulations[i2] = { originalName: `${name}/momentum`, variable: tidy(() => zerosLike(value).variable(trainable)) }; } - const accumulation = this.accumulations[i].variable; - const gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name]; + const accumulation = this.accumulations[i2].variable; + const gradient = Array.isArray(variableGradients) ? variableGradients[i2].tensor : variableGradients[name]; if (gradient == null) { return; } @@ -15609,37 +15609,37 @@ var RMSPropOptimizer = class extends Optimizer { } applyGradients(variableGradients) { const variableNames = Array.isArray(variableGradients) ? variableGradients.map((item) => item.name) : Object.keys(variableGradients); - variableNames.forEach((name, i) => { + variableNames.forEach((name, i2) => { const value = ENGINE.registeredVariables[name]; const trainable = false; - if (this.accumulatedMeanSquares[i] == null) { - this.accumulatedMeanSquares[i] = { + if (this.accumulatedMeanSquares[i2] == null) { + this.accumulatedMeanSquares[i2] = { originalName: `${name}/rms`, variable: tidy(() => zerosLike(value).variable(trainable)) }; } - if (this.accumulatedMoments[i] == null) { - this.accumulatedMoments[i] = { + if (this.accumulatedMoments[i2] == null) { + this.accumulatedMoments[i2] = { originalName: `${name}/momentum`, variable: tidy(() => zerosLike(value).variable(trainable)) }; } - if (this.accumulatedMeanGrads[i] == null && this.centered) { - this.accumulatedMeanGrads[i] = { + if (this.accumulatedMeanGrads[i2] == null && this.centered) { + this.accumulatedMeanGrads[i2] = { originalName: `${name}/mg`, variable: tidy(() => zerosLike(value).variable(trainable)) }; } - const gradient = Array.isArray(variableGradients) ? variableGradients[i].tensor : variableGradients[name]; + const gradient = Array.isArray(variableGradients) ? variableGradients[i2].tensor : variableGradients[name]; if (gradient == null) { return; } - const accumulatedMeanSquare = this.accumulatedMeanSquares[i].variable; - const accumulatedMoments = this.accumulatedMoments[i].variable; + const accumulatedMeanSquare = this.accumulatedMeanSquares[i2].variable; + const accumulatedMoments = this.accumulatedMoments[i2].variable; tidy(() => { const newAccumulatedMeanSquare = add2(mul(accumulatedMeanSquare, this.decay), mul(square(gradient), 1 - this.decay)); if (this.centered) { - const accumulatedMeanGrad = this.accumulatedMeanGrads[i].variable; + const accumulatedMeanGrad = this.accumulatedMeanGrads[i2].variable; const newAccumulatedMeanGrad = add2(mul(accumulatedMeanGrad, this.decay), mul(gradient, 1 - this.decay)); const gradContribution = div(mul(gradient, this.learningRate), sqrt(sub(newAccumulatedMeanSquare, add2(square(newAccumulatedMeanGrad), this.epsilon)))); const newAccumulatedMoments = add2(mul(accumulatedMoments, this.momentum), gradContribution); @@ -15840,21 +15840,21 @@ __export2(backend_util_exports, { }); function assertParamsConsistent(shapes, axis) { const rank = shapes[0].length; - shapes.forEach((shape, i) => { - assert(shape.length === rank, () => `Error in concat${rank}D: rank of tensors[${i}] must be the same as the rank of the rest (${rank})`); + shapes.forEach((shape, i2) => { + assert(shape.length === rank, () => `Error in concat${rank}D: rank of tensors[${i2}] must be the same as the rank of the rest (${rank})`); }); assert(axis >= 0 && axis < rank, () => `Error in concat${rank}D: axis must be between 0 and ${rank - 1}.`); const firstShape = shapes[0]; - shapes.forEach((shape, i) => { - for (let r = 0; r < rank; r++) { - assert(r === axis || shape[r] === firstShape[r], () => `Error in concat${rank}D: Shape of tensors[${i}] (${shape}) does not match the shape of the rest (${firstShape}) along the non-concatenated axis ${i}.`); + shapes.forEach((shape, i2) => { + for (let r2 = 0; r2 < rank; r2++) { + assert(r2 === axis || shape[r2] === firstShape[r2], () => `Error in concat${rank}D: Shape of tensors[${i2}] (${shape}) does not match the shape of the rest (${firstShape}) along the non-concatenated axis ${i2}.`); } }); } function computeOutShape2(shapes, axis) { const outputShape = shapes[0].slice(); - for (let i = 1; i < shapes.length; i++) { - outputShape[axis] += shapes[i][axis]; + for (let i2 = 1; i2 < shapes.length; i2++) { + outputShape[axis] += shapes[i2][axis]; } return outputShape; } @@ -15879,8 +15879,8 @@ function getReshaped(inputShape, blockShape, prod6, batchToSpace = true) { } else { reshaped = reshaped.concat(inputShape[0]); const spatialLength = blockShape.length; - for (let i = 0; i < spatialLength; ++i) { - reshaped = reshaped.concat([inputShape[i + 1] / blockShape[i], blockShape[i]]); + for (let i2 = 0; i2 < spatialLength; ++i2) { + reshaped = reshaped.concat([inputShape[i2 + 1] / blockShape[i2], blockShape[i2]]); } reshaped = reshaped.concat(inputShape.slice(spatialLength + 1)); } @@ -15890,22 +15890,22 @@ function getPermuted(reshapedRank, blockShapeRank, batchToSpace = true) { const permuted = []; if (batchToSpace) { permuted.push(blockShapeRank); - for (let i = blockShapeRank + 1; i < reshapedRank; ++i) { - if (i <= 2 * blockShapeRank) { - permuted.push(i); - permuted.push(i - (blockShapeRank + 1)); + for (let i2 = blockShapeRank + 1; i2 < reshapedRank; ++i2) { + if (i2 <= 2 * blockShapeRank) { + permuted.push(i2); + permuted.push(i2 - (blockShapeRank + 1)); } else { - permuted.push(i); + permuted.push(i2); } } } else { const permutedBeforeBatch = []; const permutedAfterBatch = []; - for (let i = 1; i < reshapedRank; ++i) { - if (i >= blockShapeRank * 2 + 1 || i % 2 === 1) { - permutedAfterBatch.push(i); + for (let i2 = 1; i2 < reshapedRank; ++i2) { + if (i2 >= blockShapeRank * 2 + 1 || i2 % 2 === 1) { + permutedAfterBatch.push(i2); } else { - permutedBeforeBatch.push(i); + permutedBeforeBatch.push(i2); } } permuted.push(...permutedBeforeBatch); @@ -15921,30 +15921,30 @@ function getReshapedPermuted(inputShape, blockShape, prod6, batchToSpace = true) } else { reshapedPermuted.push(inputShape[0] * prod6); } - for (let i = 1; i < inputShape.length; ++i) { - if (i <= blockShape.length) { + for (let i2 = 1; i2 < inputShape.length; ++i2) { + if (i2 <= blockShape.length) { if (batchToSpace) { - reshapedPermuted.push(blockShape[i - 1] * inputShape[i]); + reshapedPermuted.push(blockShape[i2 - 1] * inputShape[i2]); } else { - reshapedPermuted.push(inputShape[i] / blockShape[i - 1]); + reshapedPermuted.push(inputShape[i2] / blockShape[i2 - 1]); } } else { - reshapedPermuted.push(inputShape[i]); + reshapedPermuted.push(inputShape[i2]); } } return reshapedPermuted; } function getSliceBeginCoords(crops, blockShape) { const sliceBeginCoords = [0]; - for (let i = 0; i < blockShape; ++i) { - sliceBeginCoords.push(crops[i][0]); + for (let i2 = 0; i2 < blockShape; ++i2) { + sliceBeginCoords.push(crops[i2][0]); } return sliceBeginCoords; } function getSliceSize(uncroppedShape, crops, blockShape) { const sliceSize = uncroppedShape.slice(0, 1); - for (let i = 0; i < blockShape; ++i) { - sliceSize.push(uncroppedShape[i + 1] - crops[i][0] - crops[i][1]); + for (let i2 = 0; i2 < blockShape; ++i2) { + sliceSize.push(uncroppedShape[i2 + 1] - crops[i2][0] - crops[i2][1]); } return sliceSize; } @@ -15961,18 +15961,18 @@ function mergeRealAndImagArrays(real5, imag5) { throw new Error(`Cannot merge real and imag arrays of different lengths. real:${real5.length}, imag: ${imag5.length}.`); } const result = new Float32Array(real5.length * 2); - for (let i = 0; i < result.length; i += 2) { - result[i] = real5[i / 2]; - result[i + 1] = imag5[i / 2]; + for (let i2 = 0; i2 < result.length; i2 += 2) { + result[i2] = real5[i2 / 2]; + result[i2 + 1] = imag5[i2 / 2]; } return result; } function splitRealAndImagArrays(complex5) { const real5 = new Float32Array(complex5.length / 2); const imag5 = new Float32Array(complex5.length / 2); - for (let i = 0; i < complex5.length; i += 2) { - real5[i / 2] = complex5[i]; - imag5[i / 2] = complex5[i + 1]; + for (let i2 = 0; i2 < complex5.length; i2 += 2) { + real5[i2 / 2] = complex5[i2]; + imag5[i2 / 2] = complex5[i2 + 1]; } return { real: real5, imag: imag5 }; } @@ -15980,9 +15980,9 @@ function complexWithEvenIndex(complex5) { const len = Math.ceil(complex5.length / 4); const real5 = new Float32Array(len); const imag5 = new Float32Array(len); - for (let i = 0; i < complex5.length; i += 4) { - real5[Math.floor(i / 4)] = complex5[i]; - imag5[Math.floor(i / 4)] = complex5[i + 1]; + for (let i2 = 0; i2 < complex5.length; i2 += 4) { + real5[Math.floor(i2 / 4)] = complex5[i2]; + imag5[Math.floor(i2 / 4)] = complex5[i2 + 1]; } return { real: real5, imag: imag5 }; } @@ -15990,9 +15990,9 @@ function complexWithOddIndex(complex5) { const len = Math.floor(complex5.length / 4); const real5 = new Float32Array(len); const imag5 = new Float32Array(len); - for (let i = 2; i < complex5.length; i += 4) { - real5[Math.floor(i / 4)] = complex5[i]; - imag5[Math.floor(i / 4)] = complex5[i + 1]; + for (let i2 = 2; i2 < complex5.length; i2 += 4) { + real5[Math.floor(i2 / 4)] = complex5[i2]; + imag5[Math.floor(i2 / 4)] = complex5[i2 + 1]; } return { real: real5, imag: imag5 }; } @@ -16005,18 +16005,18 @@ function assignToTypedArray(data, real5, imag5, index2) { data[index2 * 2] = real5; data[index2 * 2 + 1] = imag5; } -function exponents(n, inverse) { - const real5 = new Float32Array(n / 2); - const imag5 = new Float32Array(n / 2); - for (let i = 0; i < Math.ceil(n / 2); i++) { - const x = (inverse ? 2 : -2) * Math.PI * (i / n); - real5[i] = Math.cos(x); - imag5[i] = Math.sin(x); +function exponents(n2, inverse) { + const real5 = new Float32Array(n2 / 2); + const imag5 = new Float32Array(n2 / 2); + for (let i2 = 0; i2 < Math.ceil(n2 / 2); i2++) { + const x = (inverse ? 2 : -2) * Math.PI * (i2 / n2); + real5[i2] = Math.cos(x); + imag5[i2] = Math.sin(x); } return { real: real5, imag: imag5 }; } -function exponent(k, n, inverse) { - const x = (inverse ? 2 : -2) * Math.PI * (k / n); +function exponent(k, n2, inverse) { + const x = (inverse ? 2 : -2) * Math.PI * (k / n2); const real5 = Math.cos(x); const imag5 = Math.sin(x); return { real: real5, imag: imag5 }; @@ -16044,8 +16044,8 @@ function decodeEinsumEquation(equation, numTensors) { throw new Error("Support for more than 2 input tensors is not implemented yet."); } const allDims = []; - for (let i = 0; i < outputString.length; ++i) { - const dimName = outputString[i]; + for (let i2 = 0; i2 < outputString.length; ++i2) { + const dimName = outputString[i2]; if (!inputTerms.some((inputTerm) => inputTerm.indexOf(dimName) !== -1)) { throw new Error(`Output subscripts contain the label ${dimName} not present in the input subscripts.`); } @@ -16053,40 +16053,40 @@ function decodeEinsumEquation(equation, numTensors) { allDims.push(dimName); } } - for (let i = 0; i < inputString.length; ++i) { - const dimName = inputString[i]; + for (let i2 = 0; i2 < inputString.length; ++i2) { + const dimName = inputString[i2]; if (allDims.indexOf(dimName) === -1 && dimName !== COMMA) { allDims.push(dimName); } } const idDims = new Array(inputTerms.length); - for (let i = 0; i < numInputs; ++i) { - if (new Set(inputTerms[i].split("")).size !== inputTerms[i].length) { - throw new Error(`Found duplicate axes in input component ${inputTerms[i]}. Support for duplicate axes in input is not implemented yet.`); + for (let i2 = 0; i2 < numInputs; ++i2) { + if (new Set(inputTerms[i2].split("")).size !== inputTerms[i2].length) { + throw new Error(`Found duplicate axes in input component ${inputTerms[i2]}. Support for duplicate axes in input is not implemented yet.`); } - idDims[i] = []; - for (let j = 0; j < inputTerms[i].length; ++j) { - idDims[i].push(allDims.indexOf(inputTerms[i][j])); + idDims[i2] = []; + for (let j = 0; j < inputTerms[i2].length; ++j) { + idDims[i2].push(allDims.indexOf(inputTerms[i2][j])); } } const numDims = allDims.length; const numOutDims = outputString.length; const summedDims = []; - for (let i = numOutDims; i < numDims; ++i) { - summedDims.push(i); + for (let i2 = numOutDims; i2 < numDims; ++i2) { + summedDims.push(i2); } return { allDims, summedDims, idDims }; } function getEinsumPermutation(nDims, idDims) { let permutationIndices = new Array(nDims); permutationIndices.fill(-1); - for (let i = 0; i < idDims.length; ++i) { - permutationIndices[idDims[i]] = i; + for (let i2 = 0; i2 < idDims.length; ++i2) { + permutationIndices[idDims[i2]] = i2; } const expandDims7 = []; - for (let i = 0; i < nDims; ++i) { - if (permutationIndices[i] === -1) { - expandDims7.push(i); + for (let i2 = 0; i2 < nDims; ++i2) { + if (permutationIndices[i2] === -1) { + expandDims7.push(i2); } } permutationIndices = permutationIndices.filter((d) => d !== -1); @@ -16094,13 +16094,13 @@ function getEinsumPermutation(nDims, idDims) { } function checkEinsumDimSizes(nDims, idDims, tensors) { const dimSizes = new Array(nDims); - for (let i = 0; i < tensors.length; ++i) { - const shape = tensors[i].shape; - for (let j = 0; j < idDims[i].length; ++j) { - if (dimSizes[idDims[i][j]] === void 0) { - dimSizes[idDims[i][j]] = shape[j]; + for (let i2 = 0; i2 < tensors.length; ++i2) { + const shape = tensors[i2].shape; + for (let j = 0; j < idDims[i2].length; ++j) { + if (dimSizes[idDims[i2][j]] === void 0) { + dimSizes[idDims[i2][j]] = shape[j]; } else { - assert(dimSizes[idDims[i][j]] === shape[j], () => `Expected dimension ${dimSizes[idDims[i][j]]} at axis ${j} of input shaped ${JSON.stringify(shape)}, but got dimension ${shape[j]}`); + assert(dimSizes[idDims[i2][j]] === shape[j], () => `Expected dimension ${dimSizes[idDims[i2][j]]} at axis ${j} of input shaped ${JSON.stringify(shape)}, but got dimension ${shape[j]}`); } } } @@ -16113,16 +16113,16 @@ function getEinsumComputePath(summedDims, idDims) { path.push(-1); } nSteps = summedDims.length + 1; - for (let i = 0; i < nSteps; ++i) { + for (let i2 = 0; i2 < nSteps; ++i2) { steps.push([]); } const computedTermIndices = []; - for (let i = 0; i < path.length; ++i) { - const summedDim = path[i]; + for (let i2 = 0; i2 < path.length; ++i2) { + const summedDim = path[i2]; const termIndices = findTermsWithDim(idDims, summedDim); for (const termIndex of termIndices) { if (computedTermIndices.indexOf(termIndex) === -1) { - steps[i].push(termIndex); + steps[i2].push(termIndex); computedTermIndices.push(termIndex); } } @@ -16134,9 +16134,9 @@ function isIdentityPermutation(perm) { } function findTermsWithDim(idDims, dim) { const termIndices = []; - for (let i = 0; i < idDims.length; ++i) { - if (idDims[i].length === 0 || idDims[i].indexOf(dim) !== -1 || dim === -1) { - termIndices.push(i); + for (let i2 = 0; i2 < idDims.length; ++i2) { + if (idDims[i2].length === 0 || idDims[i2].indexOf(dim) !== -1 || dim === -1) { + termIndices.push(i2); } } return termIndices; @@ -16260,9 +16260,9 @@ function collectGatherOpShapeInfo(x, indices, axis, batchDims) { if (axis < batchDims) { throw new Error(`batchDims (${batchDims}) must be less than or equal to axis (${axis}).`); } - for (let i = 0; i < batchDims; ++i) { - if (x.shape[i] !== indices.shape[i]) { - throw new Error(`x.shape[${i}]: ${x.shape[i]} should be equal to indices.shape[${i}]: ${indices.shape[i]}.`); + for (let i2 = 0; i2 < batchDims; ++i2) { + if (x.shape[i2] !== indices.shape[i2]) { + throw new Error(`x.shape[${i2}]: ${x.shape[i2]} should be equal to indices.shape[${i2}]: ${indices.shape[i2]}.`); } } const dimSize = x.shape[axis]; @@ -16270,20 +16270,20 @@ function collectGatherOpShapeInfo(x, indices, axis, batchDims) { let batchSize = 1; let outerSize = 1; let sliceSize = 1; - for (let i = 0; i < batchDims; ++i) { - outputShape.push(x.shape[i]); - batchSize *= x.shape[i]; + for (let i2 = 0; i2 < batchDims; ++i2) { + outputShape.push(x.shape[i2]); + batchSize *= x.shape[i2]; } - for (let i = batchDims; i < axis; i++) { - outputShape.push(x.shape[i]); - outerSize *= x.shape[i]; + for (let i2 = batchDims; i2 < axis; i2++) { + outputShape.push(x.shape[i2]); + outerSize *= x.shape[i2]; } - for (let i = batchDims; i < indicesRank; i++) { - outputShape.push(indices.shape[i]); + for (let i2 = batchDims; i2 < indicesRank; i2++) { + outputShape.push(indices.shape[i2]); } - for (let i = axis + 1; i < xRank; i++) { - outputShape.push(x.shape[i]); - sliceSize *= x.shape[i]; + for (let i2 = axis + 1; i2 < xRank; i2++) { + outputShape.push(x.shape[i2]); + sliceSize *= x.shape[i2]; } return { batchSize, sliceSize, outerSize, dimSize, outputShape }; } @@ -16295,7 +16295,7 @@ function fromUint8ToStringArray(vals) { } } function fromStringArrayToUint8(strings) { - return strings.map((s) => encodeString(s)); + return strings.map((s2) => encodeString(s2)); } var kernel_impls_exports = {}; __export2(kernel_impls_exports, { @@ -16369,8 +16369,8 @@ var addNGradConfig = { saveAllInputs: true, gradFunc: (dy, saved) => { const ders = {}; - saved.forEach((_, i) => { - ders[i] = () => dy.clone(); + saved.forEach((_, i2) => { + ders[i2] = () => dy.clone(); }); return ders; } @@ -16570,17 +16570,17 @@ var broadcastToGradConfig = { const inputShape = broadCastToAttrs.inputShape; const outputShape = broadCastToAttrs.shape; const reps = Array.from(outputShape); - for (let i = inputShape.length - 1; i >= 0; i--) { - if (inputShape[i] === outputShape[i]) { - reps[i] = 1; - } else if (inputShape[i] !== 1) { + for (let i2 = inputShape.length - 1; i2 >= 0; i2--) { + if (inputShape[i2] === outputShape[i2]) { + reps[i2] = 1; + } else if (inputShape[i2] !== 1) { throw new Error(`broadcastTo(): [${inputShape}] cannot be broadcast to [${outputShape}].`); } } const axes = []; - for (let i = 0; i < reps.length; i++) { - if (reps[i] > 1) { - axes.push(i); + for (let i2 = 0; i2 < reps.length; i2++) { + if (reps[i2] > 1) { + axes.push(i2); } } return { x: () => sum2(dy, axes, true) }; @@ -16618,12 +16618,12 @@ var concatGradConfig = { kernelName: Concat, saveAllInputs: true, gradFunc: (dy, saved, attrs) => { - const shapes = saved.map((t) => t.shape); + const shapes = saved.map((t2) => t2.shape); const { axis } = attrs; const $axis = parseAxisParam(axis, saved[0].shape)[0]; - const sizeSplits = shapes.map((s) => s[$axis]); + const sizeSplits = shapes.map((s2) => s2[$axis]); const derTensors = split(dy, sizeSplits, $axis); - return derTensors.map((t) => () => t); + return derTensors.map((t2) => () => t2); } }; var conv2DGradConfig = { @@ -16833,8 +16833,8 @@ var fusedBatchNormGradConfig = { const reductionAxes = getReductionAxes(mean5.shape, x.shape); const tileShape = []; if (mean5.rank === 1) { - for (let i = 0; i < x.shape.length - 1; ++i) { - tileShape.push(x.shape[i]); + for (let i2 = 0; i2 < x.shape.length - 1; ++i2) { + tileShape.push(x.shape[i2]); } tileShape.push(1); } @@ -16918,16 +16918,16 @@ var gatherGradConfig = { }; function arrayRange(start, stop) { const result = []; - for (let i = start; i < stop; ++i) { - result.push(i); + for (let i2 = start; i2 < stop; ++i2) { + result.push(i2); } return result; } function arrayConcat(arrays) { const result = []; - for (let i = 0; i < arrays.length; ++i) { - for (let j = 0; j < arrays[i].length; ++j) { - result.push(arrays[i][j]); + for (let i2 = 0; i2 < arrays.length; ++i2) { + for (let j = 0; j < arrays[i2].length; ++j) { + result.push(arrays[i2][j]); } } return result; @@ -17276,7 +17276,7 @@ var packGradConfig = { gradFunc: (dy, saved, attrs) => { const { axis } = attrs; const derTensors = unstack(dy, axis); - return derTensors.map((t) => () => t); + return derTensors.map((t2) => () => t2); } }; var padV2GradConfig = { @@ -17377,7 +17377,7 @@ var prodGradConfig = { const { axis } = attrs; let axisArr = []; if (axis === void 0 || axis === null) { - axisArr = x.shape.map((_, i) => i); + axisArr = x.shape.map((_, i2) => i2); } else if (typeof axis === "number") { axisArr = [axis]; } else { @@ -17555,8 +17555,8 @@ var sliceGradConfig = { const inputShape = x.shape; const [begin_, size_] = parseSliceParams(x, begin, size2); const paddings = []; - for (let i = 0; i < dy.rank; i++) { - paddings.push([begin_[i], inputShape[i] - begin_[i] - size_[i]]); + for (let i2 = 0; i2 < dy.rank; i2++) { + paddings.push([begin_[i2], inputShape[i2] - begin_[i2] - size_[i2]]); } return { x: () => pad(dy, paddings) }; } @@ -17695,36 +17695,36 @@ var tileGradConfig = { const derX = () => { let xGrad = zerosLike(x); if (x.rank === 1) { - for (let i = 0; i < reps[0]; ++i) { - xGrad = add2(xGrad, slice(dy, [i * x.shape[0]], [x.shape[0]])); + for (let i2 = 0; i2 < reps[0]; ++i2) { + xGrad = add2(xGrad, slice(dy, [i2 * x.shape[0]], [x.shape[0]])); } } else if (x.rank === 2) { - for (let i = 0; i < reps[0]; ++i) { + for (let i2 = 0; i2 < reps[0]; ++i2) { for (let j = 0; j < reps[1]; ++j) { - xGrad = add2(xGrad, slice(dy, [i * x.shape[0], j * x.shape[1]], [ + xGrad = add2(xGrad, slice(dy, [i2 * x.shape[0], j * x.shape[1]], [ x.shape[0], x.shape[1] ])); } } } else if (x.rank === 3) { - for (let i = 0; i < reps[0]; ++i) { + for (let i2 = 0; i2 < reps[0]; ++i2) { for (let j = 0; j < reps[1]; ++j) { for (let k = 0; k < reps[2]; ++k) { - xGrad = add2(xGrad, slice(dy, [i * x.shape[0], j * x.shape[1], k * x.shape[2]], [x.shape[0], x.shape[1], x.shape[2]])); + xGrad = add2(xGrad, slice(dy, [i2 * x.shape[0], j * x.shape[1], k * x.shape[2]], [x.shape[0], x.shape[1], x.shape[2]])); } } } } else if (x.rank === 4) { - for (let i = 0; i < reps[0]; ++i) { + for (let i2 = 0; i2 < reps[0]; ++i2) { for (let j = 0; j < reps[1]; ++j) { for (let k = 0; k < reps[2]; ++k) { - for (let l = 0; l < reps[3]; ++l) { + for (let l3 = 0; l3 < reps[3]; ++l3) { xGrad = add2(xGrad, slice(dy, [ - i * x.shape[0], + i2 * x.shape[0], j * x.shape[1], k * x.shape[2], - l * x.shape[3] + l3 * x.shape[3] ], [x.shape[0], x.shape[1], x.shape[2], x.shape[3]])); } } @@ -17771,8 +17771,8 @@ function gatherDropNegatives(x, indices) { const gathered = gather(x, zeroClippedIndices); let isPositive = greaterEqual(indices, scalar(0, "int32")); const numIters = gathered.rank - isPositive.rank; - for (let i = 0; i < numIters; ++i) { - isPositive = expandDims(isPositive, i + 1); + for (let i2 = 0; i2 < numIters; ++i2) { + isPositive = expandDims(isPositive, i2 + 1); } isPositive = logicalAnd(isPositive, ones2(gathered.shape, "bool")); const zeroSlice = zerosLike(gathered); @@ -18508,7 +18508,7 @@ var LruCache = class { throw new Error(`The maxEntries of LRU caches must be at least 0, but got ${maxEntries}.`); } if (this.maxEntries > maxEntries) { - for (let i = 0; i < this.maxEntries - maxEntries; i++) { + for (let i2 = 0; i2 < this.maxEntries - maxEntries; i2++) { const keyToDelete = this.cache.keys().next().value; this.cache.delete(keyToDelete); } @@ -18519,7 +18519,7 @@ var LruCache = class { function pyListRepeat(value, numValues) { if (Array.isArray(value)) { let newArray = []; - for (let i = 0; i < numValues; i++) { + for (let i2 = 0; i2 < numValues; i2++) { newArray = newArray.concat(value); } return newArray; @@ -18707,12 +18707,12 @@ function checkStringTypeUnionValue(values, label, value) { function checkArrayTypeAndLength(x, expectedType, minLength = 0, maxLength = Infinity) { assert2(minLength >= 0); assert2(maxLength >= minLength); - return Array.isArray(x) && x.length >= minLength && x.length <= maxLength && x.every((e) => typeof e === expectedType); + return Array.isArray(x) && x.length >= minLength && x.length <= maxLength && x.every((e2) => typeof e2 === expectedType); } function assertPositiveInteger(value, name) { if (Array.isArray(value)) { util_exports.assert(value.length > 0, () => `${name} is unexpectedly an empty array.`); - value.forEach((v, i) => assertPositiveInteger(v, `element ${i + 1} of ${name}`)); + value.forEach((v, i2) => assertPositiveInteger(v, `element ${i2 + 1} of ${name}`)); } else { util_exports.assert(Number.isInteger(value) && value > 0, () => `Expected ${name} to be a positive integer, but got ${formatAsFriendlyString(value)}.`); } @@ -18792,9 +18792,9 @@ function nameScope(name, fn) { const val = fn(); _nameScopeStack.pop(); return val; - } catch (e) { + } catch (e2) { _nameScopeStack.pop(); - throw e; + throw e2; } } function currentNameScopePrefix() { @@ -18842,8 +18842,8 @@ function arrayProd(array2, begin, end) { end = array2.length; } let prod6 = 1; - for (let i = begin; i < end; ++i) { - prod6 *= array2[i]; + for (let i2 = begin; i2 < end; ++i2) { + prod6 *= array2[i2]; } return prod6; } @@ -18852,8 +18852,8 @@ function min2(array2) { return Number.NaN; } let min7 = Number.POSITIVE_INFINITY; - for (let i = 0; i < array2.length; i++) { - const value = array2[i]; + for (let i2 = 0; i2 < array2.length; i2++) { + const value = array2[i2]; if (value < min7) { min7 = value; } @@ -18865,8 +18865,8 @@ function max2(array2) { return Number.NaN; } let max7 = Number.NEGATIVE_INFINITY; - for (let i = 0; i < array2.length; i++) { - const value = array2[i]; + for (let i2 = 0; i2 < array2.length; i2++) { + const value = array2[i2]; if (value > max7) { max7 = value; } @@ -18878,8 +18878,8 @@ function range2(begin, end) { throw new ValueError(`end (${end}) < begin (${begin}) is forbidden.`); } const out = []; - for (let i = begin; i < end; ++i) { - out.push(i); + for (let i2 = begin; i2 < end; ++i2) { + out.push(i2); } return out; } @@ -18904,13 +18904,13 @@ function expandDims2(x, axis = -1) { outShape.splice(axis, 0, 1); return reshape(x, outShape); } -function repeat(x, n) { +function repeat(x, n2) { return tidy(() => { if (x.shape.length !== 2) { throw new ValueError(`repeat() expects a rank-2 tensor, but received a rank-${x.shape.length} tensor.`); } const y = expandDims2(x, 1); - return tile2(y, [1, n, 1]); + return tile2(y, [1, n2, 1]); }); } function flatten2(x) { @@ -19045,14 +19045,14 @@ function concatAlongFirstAxis(a, b) { throw new ValueError(`concatAlongFirstAxis() received an unsupported tensor rank: ${a.rank}`); } } -function tile2(x, n) { - if (!Array.isArray(n)) { - n = [n]; +function tile2(x, n2) { + if (!Array.isArray(n2)) { + n2 = [n2]; } - if (x.rank !== n.length) { - throw new ValueError(`The length of input n (${n.length}) does not match the number of dimensions in input x (${x.rank})`); + if (x.rank !== n2.length) { + throw new ValueError(`The length of input n (${n2.length}) does not match the number of dimensions in input x (${x.rank})`); } - return tile(x, n); + return tile(x, n2); } function randomNormal2(shape, mean5 = 0, stddev = 1, dtype, seed) { return randomNormal(shape, mean5, stddev, dtype, seed); @@ -19087,13 +19087,13 @@ function dot2(a, b, activation2, bias) { const bLastDim = bShape.pop(); const ySecondLastDim = bShape.pop(); const yOtherDims = [...bShape, bLastDim]; - const perm = Array.from({ length: b.rank }, (_, i) => { - if (i === 0) { + const perm = Array.from({ length: b.rank }, (_, i2) => { + if (i2 === 0) { return b.rank - 2; - } else if (i <= b.rank - 2) { - return i - 1; + } else if (i2 <= b.rank - 2) { + return i2 - 1; } - return i; + return i2; }); b = reshape(transpose(b, perm), [ySecondLastDim, -1]); const outputShape = [...aFirstDims, ...yOtherDims]; @@ -19951,9 +19951,9 @@ var Layer = class extends serialization_exports.Serializable { } } if (spec.shape != null) { - for (let i = 0; i < spec.shape.length; ++i) { - const specDim = spec.shape[i]; - const dim = x.shape[i]; + for (let i2 = 0; i2 < spec.shape.length; ++i2) { + const specDim = spec.shape[i2]; + const dim = x.shape[i2]; if (specDim != null && dim != null) { if (specDim !== dim) { throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name}: expected shape=${spec.shape}, found shape=${x.shape}.`); @@ -20057,8 +20057,8 @@ var Layer = class extends serialization_exports.Serializable { console.warn(`The rank of the input tensor provided (shape: ${JSON.stringify(inputShape)}) does not match that of the batchInputShape (${JSON.stringify(this.batchInputShape)}) of the layer ${this.name}`); } else { let dimMismatch = false; - this.batchInputShape.forEach((dimension, i) => { - if (dimension != null && inputShape[i] != null && inputShape[i] !== dimension) { + this.batchInputShape.forEach((dimension, i2) => { + if (dimension != null && inputShape[i2] != null && inputShape[i2] !== dimension) { dimMismatch = true; } }); @@ -20112,10 +20112,10 @@ var Layer = class extends serialization_exports.Serializable { } const weightValueTuples = []; const paramValues = batchGetValue(params); - for (let i = 0; i < paramValues.length; ++i) { - const pv = paramValues[i]; - const p2 = params[i]; - const w = weights[i]; + for (let i2 = 0; i2 < paramValues.length; ++i2) { + const pv = paramValues[i2]; + const p2 = params[i2]; + const w = weights[i2]; if (!util_exports.arraysEqual(pv.shape, w.shape)) { throw new ValueError(`Layer weight shape ${pv.shape} not compatible with provided weight shape ${w.shape}`); } @@ -20210,10 +20210,10 @@ var Layer = class extends serialization_exports.Serializable { inputShapes, outputShapes }, kwargs); - for (let i = 0; i < outputTensors.length; i++) { - outputTensors[i].sourceLayer = this; - outputTensors[i].nodeIndex = this.inboundNodes.length - 1; - outputTensors[i].tensorIndex = i; + for (let i2 = 0; i2 < outputTensors.length; i2++) { + outputTensors[i2].sourceLayer = this; + outputTensors[i2].nodeIndex = this.inboundNodes.length - 1; + outputTensors[i2].tensorIndex = i2; } } getConfig() { @@ -20274,10 +20274,10 @@ function getSourceInputs(tensor2, layer, nodeIndex) { return node2.inputTensors; } else { const sourceTensors = []; - for (let i = 0; i < node2.inboundLayers.length; i++) { - const x = node2.inputTensors[i]; - const layer2 = node2.inboundLayers[i]; - const nodeIndex2 = node2.nodeIndices[i]; + for (let i2 = 0; i2 < node2.inboundLayers.length; i2++) { + const x = node2.inputTensors[i2]; + const layer2 = node2.inboundLayers[i2]; + const nodeIndex2 = node2.nodeIndices[i2]; const previousSources = getSourceInputs(x, layer2, nodeIndex2); for (const x2 of previousSources) { if (sourceTensors.indexOf(x2) === -1) { @@ -20482,7 +20482,7 @@ function execute(fetches, feedDict, kwargs, probe) { const training = kwargs == null ? false : kwargs["training"]; const arrayFetches = Array.isArray(fetches); const fetchArray = arrayFetches ? fetches : [fetches]; - const outputNames = fetchArray.map((t) => t.name); + const outputNames = fetchArray.map((t2) => t2.name); const finalOutputs = []; const feedNames = feedDict.names(); for (const outputName of outputNames) { @@ -20511,7 +20511,7 @@ function execute(fetches, feedDict, kwargs, probe) { Object.assign(recipientCounts, cachedRecipientCounts.get(fetchAndFeedKey)); } const internalFeedDict = new FeedDict(feedDict); - for (let i = 0; i < sorted.length; ++i) { + for (let i2 = 0; i2 < sorted.length; ++i2) { if (probe != null) { const numTensors = memory().numTensors; if (numTensors > probe.maxNumTensors) { @@ -20521,7 +20521,7 @@ function execute(fetches, feedDict, kwargs, probe) { probe.minNumTensors = numTensors; } } - const symbolic = sorted[i]; + const symbolic = sorted[i2]; const srcLayer = symbolic.sourceLayer; if (srcLayer instanceof InputLayer) { continue; @@ -20556,13 +20556,13 @@ function execute(fetches, feedDict, kwargs, probe) { } const layerOutputs = getNodeOutputs(symbolic); const outputSymbolicTensors = Array.isArray(layerOutputs) ? layerOutputs : [layerOutputs]; - for (let i2 = 0; i2 < outputSymbolicTensors.length; ++i2) { - if (!internalFeedDict.hasKey(outputSymbolicTensors[i2])) { - internalFeedDict.add(outputSymbolicTensors[i2], outputTensors[i2], Array.isArray(outputMask) ? outputMask[0] : outputMask); + for (let i3 = 0; i3 < outputSymbolicTensors.length; ++i3) { + if (!internalFeedDict.hasKey(outputSymbolicTensors[i3])) { + internalFeedDict.add(outputSymbolicTensors[i3], outputTensors[i3], Array.isArray(outputMask) ? outputMask[0] : outputMask); } - const index2 = outputNames.indexOf(outputSymbolicTensors[i2].name); + const index2 = outputNames.indexOf(outputSymbolicTensors[i3].name); if (index2 !== -1) { - finalOutputs[index2] = outputTensors[i2]; + finalOutputs[index2] = outputTensors[i3]; } } if (!training) { @@ -20656,10 +20656,10 @@ function getNodeOutputs(fetch4) { layerOutputs = fetch4.sourceLayer.output; } else { let nodeIndex = null; - for (let i = 0; i < fetch4.sourceLayer.inboundNodes.length; ++i) { - for (const outputTensor of fetch4.sourceLayer.inboundNodes[i].outputTensors) { + for (let i2 = 0; i2 < fetch4.sourceLayer.inboundNodes.length; ++i2) { + for (const outputTensor of fetch4.sourceLayer.inboundNodes[i2].outputTensors) { if (outputTensor.id === fetch4.id) { - nodeIndex = i; + nodeIndex = i2; break; } } @@ -20955,8 +20955,8 @@ async function resolveScalarsInLogs(logs) { } if (promises.length > 0) { const values = await Promise.all(promises); - for (let i = 0; i < values.length; ++i) { - logs[keys[i]] = values[i][0]; + for (let i2 = 0; i2 < values.length; ++i2) { + logs[keys[i2]] = values[i2][0]; } dispose(scalarsToDispose); } @@ -21149,20 +21149,20 @@ var History = class extends BaseCallback { const indices = []; for (const key in this.history) { const valueArray = this.history[key]; - for (let i = 0; i < valueArray.length; ++i) { - if (typeof valueArray[i] !== "number") { - const valueScalar = valueArray[i]; + for (let i2 = 0; i2 < valueArray.length; ++i2) { + if (typeof valueArray[i2] !== "number") { + const valueScalar = valueArray[i2]; promises.push(valueScalar.data()); keys.push(key); - indices.push(i); + indices.push(i2); } } } const values = await Promise.all(promises); - for (let n = 0; n < values.length; ++n) { - const tensorToDispose = this.history[keys[n]][indices[n]]; + for (let n2 = 0; n2 < values.length; ++n2) { + const tensorToDispose = this.history[keys[n2]][indices[n2]]; tensorToDispose.dispose(); - this.history[keys[n]][indices[n]] = values[n][0]; + this.history[keys[n2]][indices[n2]] = values[n2][0]; } } }; @@ -21677,13 +21677,13 @@ function printSummary(model22, lineLength, positions, printFn = console.log) { printRow(toDisplay, positions, printFn); printFn("=".repeat(lineLength)); const layers = model22.layers; - for (let i = 0; i < layers.length; ++i) { + for (let i2 = 0; i2 < layers.length; ++i2) { if (sequentialLike) { - printLayerSummary(layers[i], positions, printFn); + printLayerSummary(layers[i2], positions, printFn); } else { - printLayerSummaryWithConnections(layers[i], positions, relevantNodes, printFn); + printLayerSummaryWithConnections(layers[i2], positions, relevantNodes, printFn); } - printFn((i === layers.length - 1 ? "=" : "_").repeat(lineLength)); + printFn((i2 === layers.length - 1 ? "=" : "_").repeat(lineLength)); } model22.checkTrainableWeightsConsistency(); const trainableCount = countTrainableParams(model22); @@ -21738,13 +21738,13 @@ function isModelSequentialLike(model22) { } function printRow(fields, positions, printFn = console.log) { let line = ""; - for (let i = 0; i < fields.length; ++i) { - if (i > 0) { + for (let i2 = 0; i2 < fields.length; ++i2) { + if (i2 > 0) { line = line.slice(0, line.length - 1) + " "; } - line += fields[i]; - line = line.slice(0, positions[i]); - line += " ".repeat(positions[i] - line.length); + line += fields[i2]; + line = line.slice(0, positions[i2]); + line += " ".repeat(positions[i2] - line.length); } printFn(line); } @@ -21789,10 +21789,10 @@ function printLayerSummaryWithConnections(layer, positions, relevantNodes, print if (relevantNodes != null && relevantNodes.length > 0 && relevantNodes.indexOf(node2) === -1) { continue; } - for (let i = 0; i < node2.inboundLayers.length; ++i) { - const inboundLayer = node2.inboundLayers[i].name; - const inboundLayerIndex = node2.nodeIndices[i]; - const inboundTensorIndex = node2.tensorIndices[i]; + for (let i2 = 0; i2 < node2.inboundLayers.length; ++i2) { + const inboundLayer = node2.inboundLayers[i2].name; + const inboundLayerIndex = node2.nodeIndices[i2]; + const inboundTensorIndex = node2.tensorIndices[i2]; connections.push(`${inboundLayer}[${inboundLayerIndex}][${inboundTensorIndex}]`); } } @@ -21807,8 +21807,8 @@ function printLayerSummaryWithConnections(layer, positions, relevantNodes, print firstConnection ]; printRow(fields, positions, printFn); - for (let i = 1; i < connections.length; ++i) { - printRow(["", "", "", "", connections[i]], positions, printFn); + for (let i2 = 1; i2 < connections.length; ++i2) { + printRow(["", "", "", "", connections[i2]], positions, printFn); } } function isArrayItemInputOrOutputName(key, index2, value) { @@ -21824,9 +21824,9 @@ function convertPythonicToTs(pythonicConfig, key) { } else if (pythonicConfig instanceof Array) { const tsArray = []; const arrayLength = pythonicConfig.length; - for (let i = 0; i < arrayLength; ++i) { - const item = pythonicConfig[i]; - if (isArrayItemInputOrOutputName(key, i, item)) { + for (let i2 = 0; i2 < arrayLength; ++i2) { + const item = pythonicConfig[i2]; + if (isArrayItemInputOrOutputName(key, i2, item)) { tsArray.push(item); } else { tsArray.push(convertPythonicToTs(item, key)); @@ -21857,9 +21857,9 @@ function convertTsToPythonic(tsConfig, key) { } else if (tsConfig instanceof Array) { const pyArray = []; const arrayLength = tsConfig.length; - for (let i = 0; i < arrayLength; ++i) { - const item = tsConfig[i]; - if (isArrayItemInputOrOutputName(key, i, item)) { + for (let i2 = 0; i2 < arrayLength; ++i2) { + const item = tsConfig[i2]; + if (isArrayItemInputOrOutputName(key, i2, item)) { pyArray.push(item); } else { pyArray.push(convertTsToPythonic(item, key)); @@ -21939,10 +21939,10 @@ var Container = class extends Layer { this.feedInputShapes = []; this.feedInputNames = []; this.feedOutputNames = []; - for (let i = 0; i < this.inputLayers.length; i++) { - const layer = this.inputLayers[i]; + for (let i2 = 0; i2 < this.inputLayers.length; i2++) { + const layer = this.inputLayers[i2]; if (!(layer instanceof InputLayer)) { - throw new TypeError(`Input layers to a LayersModel must be InputLayer objects. Received inputs: ${args.inputs}. Input ${i} (0-based) originates from layer type ${layer.getClassName()}.`); + throw new TypeError(`Input layers to a LayersModel must be InputLayer objects. Received inputs: ${args.inputs}. Input ${i2} (0-based) originates from layer type ${layer.getClassName()}.`); } this.inputNames.push(layer.name); this.feedInputShapes.push(layer.batchInputShape); @@ -21980,11 +21980,11 @@ var Container = class extends Layer { nodesInProgress2.push(node2); } const numInboundLayers = node2.inboundLayers.length; - for (let i = 0; i < numInboundLayers; i++) { - const x = node2.inputTensors[i]; - const layer2 = node2.inboundLayers[i]; - const nodeIndex2 = node2.nodeIndices[i]; - const tensorIndex2 = node2.tensorIndices[i]; + for (let i2 = 0; i2 < numInboundLayers; i2++) { + const x = node2.inputTensors[i2]; + const layer2 = node2.inboundLayers[i2]; + const nodeIndex2 = node2.nodeIndices[i2]; + const tensorIndex2 = node2.tensorIndices[i2]; buildMapOfGraph(x, finishedNodes2, nodesInProgress2, layer2, nodeIndex2, tensorIndex2); } finishedNodes2.push(node2); @@ -22010,9 +22010,9 @@ var Container = class extends Layer { layersDepths[node2.outboundLayer.id] = depth; layerIDToLayer[node2.outboundLayer.id] = node2.outboundLayer; nodesDepths[node2.id] = depth; - for (let i = 0; i < node2.inboundLayers.length; i++) { - const inboundLayer = node2.inboundLayers[i]; - const nodeIndex = node2.nodeIndices[i]; + for (let i2 = 0; i2 < node2.inboundLayers.length; i2++) { + const inboundLayer = node2.inboundLayers[i2]; + const nodeIndex = node2.nodeIndices[i2]; const inboundNode = inboundLayer.inboundNodes[nodeIndex]; const previousDepth2 = nodesDepths[inboundNode.id] == null ? 0 : nodesDepths[inboundNode.id]; nodesDepths[inboundNode.id] = Math.max(depth + 1, previousDepth2); @@ -22215,8 +22215,8 @@ var Container = class extends Layer { return tidy(() => { inputs = toList(inputs); const feedDict = new FeedDict(); - for (let i = 0; i < this.inputs.length; ++i) { - feedDict.add(this.inputs[i], inputs[i]); + for (let i2 = 0; i2 < this.inputs.length; ++i2) { + feedDict.add(this.inputs[i2], inputs[i2]); } return execute(this.outputs, feedDict, kwargs); }); @@ -22239,9 +22239,9 @@ var Container = class extends Layer { throw new ValueError(`Invalid inputShape argument ${inputShape}: model has ${this.inputLayers.length} tensor inputs.`); } const layersToOutputShapes = {}; - for (let i = 0; i < inputShapes.length; i++) { - const layer = this.inputLayers[i]; - const inputShape2 = inputShapes[i]; + for (let i2 = 0; i2 < inputShapes.length; i2++) { + const layer = this.inputLayers[i2]; + const inputShape2 = inputShapes[i2]; const shapeKey = layer.name + "_0_0"; layersToOutputShapes[shapeKey] = inputShape2; } @@ -22275,15 +22275,15 @@ var Container = class extends Layer { } const outputShapes = []; const outputShapeKeys = []; - for (let i = 0; i < this.outputLayers.length; i++) { - const layer = this.outputLayers[i]; - const nodeIndex = this.outputLayersNodeIndices[i]; - const tensorIndex = this.outputLayersTensorIndices[i]; + for (let i2 = 0; i2 < this.outputLayers.length; i2++) { + const layer = this.outputLayers[i2]; + const nodeIndex = this.outputLayersNodeIndices[i2]; + const tensorIndex = this.outputLayersTensorIndices[i2]; const shapeKey = `${layer.name}_${nodeIndex}_${tensorIndex}`; outputShapeKeys.push(shapeKey); } - for (let i = 0; i < outputShapeKeys.length; i++) { - const key = outputShapeKeys[i]; + for (let i2 = 0; i2 < outputShapeKeys.length; i2++) { + const key = outputShapeKeys[i2]; assert2(key in layersToOutputShapes); outputShapes.push(layersToOutputShapes[key]); } @@ -22294,10 +22294,10 @@ var Container = class extends Layer { masks = pyListRepeat(null, inputs.length); } const tensorMap = {}; - for (let i = 0; i < this.inputs.length; ++i) { - const x = this.inputs[i]; - const y = inputs[i]; - const mask2 = masks[i]; + for (let i2 = 0; i2 < this.inputs.length; ++i2) { + const x = this.inputs[i2]; + const y = inputs[i2]; + const mask2 = masks[i2]; tensorMap[x.id] = [y, mask2]; } const depthKeys = Object.keys(this.nodesByDepth).map((x) => parseInt(x, 10)).sort(reverseNumberCompare); @@ -22343,10 +22343,10 @@ var Container = class extends Layer { if (layer.activityRegularizer) { throw new NotImplementedError("LayersModel invocation with concrete Tensor value(s) in the presence of activity regularizer(s) is not supported yet."); } - for (let i = 0; i < referenceOutputTensors.length; ++i) { - const x = referenceOutputTensors[i]; - const y = outputTensors2[i]; - const mask2 = outputMasks2[i]; + for (let i2 = 0; i2 < referenceOutputTensors.length; ++i2) { + const x = referenceOutputTensors[i2]; + const y = outputTensors2[i2]; + const mask2 = outputMasks2[i2]; tensorMap[x.id] = [y, mask2]; } } @@ -22436,10 +22436,10 @@ var Container = class extends Layer { } if (node2.inboundLayers.length > 0) { const nodeData = []; - for (let i = 0; i < node2.inboundLayers.length; i++) { - const inboundLayer = node2.inboundLayers[i]; - const nodeIndex = node2.nodeIndices[i]; - const tensorIndex = node2.tensorIndices[i]; + for (let i2 = 0; i2 < node2.inboundLayers.length; i2++) { + const inboundLayer = node2.inboundLayers[i2]; + const nodeIndex = node2.nodeIndices[i2]; + const tensorIndex = node2.tensorIndices[i2]; const nodeKey2 = Container.nodeKey(inboundLayer, nodeIndex); let newNodeIndex = nodeConversionMap[nodeKey2]; if (newNodeIndex == null) { @@ -22460,9 +22460,9 @@ var Container = class extends Layer { } config3["layers"] = layerConfigs; const modelInputs = []; - for (let i = 0; i < this.inputLayers.length; i++) { - const layer = this.inputLayers[i]; - const nodeIndex = this.inputLayersNodeIndices[i]; + for (let i2 = 0; i2 < this.inputLayers.length; i2++) { + const layer = this.inputLayers[i2]; + const nodeIndex = this.inputLayersNodeIndices[i2]; const nodeKey = Container.nodeKey(layer, nodeIndex); if (!this.containerNodes.has(nodeKey)) { continue; @@ -22471,14 +22471,14 @@ var Container = class extends Layer { if (newNodeIndex === null || newNodeIndex === void 0) { newNodeIndex = 0; } - const tensorIndex = this.inputLayersTensorIndices[i]; + const tensorIndex = this.inputLayersTensorIndices[i2]; modelInputs.push([layer.name, newNodeIndex, tensorIndex]); } config3["inputLayers"] = modelInputs; const modelOutputs = []; - for (let i = 0; i < this.outputLayers.length; i++) { - const layer = this.outputLayers[i]; - const nodeIndex = this.outputLayersNodeIndices[i]; + for (let i2 = 0; i2 < this.outputLayers.length; i2++) { + const layer = this.outputLayers[i2]; + const nodeIndex = this.outputLayersNodeIndices[i2]; const nodeKey = Container.nodeKey(layer, nodeIndex); if (!this.containerNodes.has(nodeKey)) { continue; @@ -22487,7 +22487,7 @@ var Container = class extends Layer { if (newNodeIndex === null || newNodeIndex === void 0) { newNodeIndex = 0; } - const tensorIndex = this.outputLayersTensorIndices[i]; + const tensorIndex = this.outputLayersTensorIndices[i2]; modelOutputs.push([layer.name, newNodeIndex, tensorIndex]); } config3["outputLayers"] = modelOutputs; @@ -22752,7 +22752,7 @@ async function fitDataset(model22, dataset, args) { const outLabels = model22.getDedupedMetricsNames(); let callbackMetrics; if (doValidation) { - callbackMetrics = outLabels.slice().concat(outLabels.map((n) => "val_" + n)); + callbackMetrics = outLabels.slice().concat(outLabels.map((n2) => "val_" + n2)); } else { callbackMetrics = outLabels.slice(); } @@ -22798,16 +22798,16 @@ async function fitDataset(model22, dataset, args) { const sampleWeights = []; if (args.classWeight != null) { const standardClassWeights = standardizeClassWeights(args.classWeight, model22.outputNames); - for (let i = 0; i < standardClassWeights.length; ++i) { - sampleWeights.push(await standardizeWeights(ys[i], null, standardClassWeights[i])); + for (let i2 = 0; i2 < standardClassWeights.length; ++i2) { + sampleWeights.push(await standardizeWeights(ys[i2], null, standardClassWeights[i2])); } } const ins = xs.concat(ys).concat(sampleWeights); const outs = trainFunction(ins); dispose(ins); - for (let i = 0; i < outLabels.length; ++i) { - const label = outLabels[i]; - const out = outs[i]; + for (let i2 = 0; i2 < outLabels.length; ++i2) { + const label = outLabels[i2]; + const out = outs[i2]; batchLogs[label] = out; keep(out); } @@ -22827,8 +22827,8 @@ async function fitDataset(model22, dataset, args) { verbose: 0 })); } - for (let i = 0; i < model22.metricsNames.length; ++i) { - epochLogs[`val_${model22.metricsNames[i]}`] = valOuts[i]; + for (let i2 = 0; i2 < model22.metricsNames.length; ++i2) { + epochLogs[`val_${model22.metricsNames[i2]}`] = valOuts[i2]; } } break; @@ -22886,15 +22886,15 @@ async function evaluateDataset(model22, dataset, args) { const batchOuts = tidy(() => f(xsAndYs)); dispose(xsAndYs); if (batch === 0) { - for (let i = 0; i < batchOuts.length; ++i) { + for (let i2 = 0; i2 < batchOuts.length; ++i2) { outs.push(scalar(0)); } } const batchSize = xsAndYs[0].shape[0]; - for (let i = 0; i < batchOuts.length; ++i) { - const batchOut = batchOuts[i]; - const oldScalar = outs[i]; - outs[i] = tidy(() => add2(outs[i], mul(batchSize, batchOut))); + for (let i2 = 0; i2 < batchOuts.length; ++i2) { + const batchOut = batchOuts[i2]; + const oldScalar = outs[i2]; + outs[i2] = tidy(() => add2(outs[i2], mul(batchSize, batchOut))); if (batch > 0) { dispose(oldScalar); } @@ -22912,9 +22912,9 @@ async function evaluateDataset(model22, dataset, args) { break; } } - for (let i = 0; i < outs.length; ++i) { - const oldScalar = outs[i]; - outs[i] = div(outs[i], numExamples); + for (let i2 = 0; i2 < outs.length; ++i2) { + const oldScalar = outs[i2]; + outs[i2] = div(outs[i2], numExamples); dispose(oldScalar); } return singletonOrArray(outs); @@ -23016,18 +23016,18 @@ async function fitLoop(model22, f, ins, outLabels, batchSize, epochs, verbose, c batchLogs["size"] = batchEnd - batchStart; const insBatch = sliceArraysByIndices(ins, batchIds); const outs = f(insBatch); - for (let i = 0; i < outLabels.length; ++i) { - const label = outLabels[i]; - const out = outs[i]; + for (let i2 = 0; i2 < outLabels.length; ++i2) { + const label = outLabels[i2]; + const out = outs[i2]; batchLogs[label] = out; keep(out); } if (batchIndex === batches.length - 1) { if (doValidation) { const valOuts = model22.testLoop(valF, valIns, batchSize); - for (let i = 0; i < outLabels.length; ++i) { - const label = outLabels[i]; - const out = valOuts[i]; + for (let i2 = 0; i2 < outLabels.length; ++i2) { + const label = outLabels[i2]; + const out = valOuts[i2]; keep(out); epochLogs["val_" + label] = out; } @@ -23113,7 +23113,7 @@ async function fitTensors(model22, x, y, args = {}) { if (doValidation) { model22.makeTestFunction(); valFunction = model22.testFunction; - callbackMetrics = outLabels.slice().concat(outLabels.map((n) => "val_" + n)); + callbackMetrics = outLabels.slice().concat(outLabels.map((n2) => "val_" + n2)); } else { valFunction = null; valIns = []; @@ -23140,8 +23140,8 @@ function ensureTensorsRank2OrHigher(tensors) { if (tensors instanceof Tensor) { tensors = [tensors]; } - for (let i = 0; i < tensors.length; ++i) { - const tensor2 = tensors[i]; + for (let i2 = 0; i2 < tensors.length; ++i2) { + const tensor2 = tensors[i2]; if (tensor2.rank === 1) { outs.push(expandDims2(tensor2, 1)); } else if (tensor2.rank === 0) { @@ -23160,7 +23160,7 @@ function disposeNewTensors(tensors, refTensors) { if (refTensors instanceof Tensor) { oldTensorIds.push(refTensors.id); } else if (Array.isArray(refTensors)) { - refTensors.forEach((t) => oldTensorIds.push(t.id)); + refTensors.forEach((t2) => oldTensorIds.push(t2.id)); } else if (refTensors != null) { for (const name in refTensors) { const oldTensor = refTensors[name]; @@ -23173,9 +23173,9 @@ function disposeNewTensors(tensors, refTensors) { tensorsToDispose.push(tensors); } } else if (Array.isArray(tensors)) { - tensors.forEach((t) => { - if (oldTensorIds.indexOf(t.id) === -1) { - tensorsToDispose.push(t); + tensors.forEach((t2) => { + if (oldTensorIds.indexOf(t2.id) === -1) { + tensorsToDispose.push(t2); } }); } else if (tensors != null) { @@ -23186,9 +23186,9 @@ function disposeNewTensors(tensors, refTensors) { } } } - tensorsToDispose.forEach((t) => { - if (!t.isDisposed) { - t.dispose(); + tensorsToDispose.forEach((t2) => { + if (!t2.isDisposed) { + t2.dispose(); } }); } @@ -23251,22 +23251,22 @@ function standardizeInputData(data, names, shapes, checkBatchAxis = true, except } arrays = ensureTensorsRank2OrHigher(arrays); if (shapes != null) { - for (let i = 0; i < names.length; ++i) { - if (shapes[i] == null) { + for (let i2 = 0; i2 < names.length; ++i2) { + if (shapes[i2] == null) { continue; } - const array2 = arrays[i]; - if (array2.shape.length !== shapes[i].length) { - throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i]} to have ${shapes[i].length} dimension(s). but got array with shape ${array2.shape}`); + const array2 = arrays[i2]; + if (array2.shape.length !== shapes[i2].length) { + throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i2]} to have ${shapes[i2].length} dimension(s). but got array with shape ${array2.shape}`); } - for (let j = 0; j < shapes[i].length; ++j) { + for (let j = 0; j < shapes[i2].length; ++j) { if (j === 0 && !checkBatchAxis) { continue; } const dim = array2.shape[j]; - const refDim = shapes[i][j]; + const refDim = shapes[i2][j]; if (refDim != null && refDim >= 0 && dim !== refDim) { - throw new ValueError(`${exceptionPrefix} expected a batch of elements where each example has shape [${shapes[i].slice(1, shapes[i].length)}] (i.e.,tensor shape [*,${shapes[i].slice(1, shapes[i].length)}]) but the ${exceptionPrefix} received an input with ${array2.shape[0]} examples, each with shape [${array2.shape.slice(1, array2.shape.length)}] (tensor shape [${array2.shape}])`); + throw new ValueError(`${exceptionPrefix} expected a batch of elements where each example has shape [${shapes[i2].slice(1, shapes[i2].length)}] (i.e.,tensor shape [*,${shapes[i2].slice(1, shapes[i2].length)}]) but the ${exceptionPrefix} received an input with ${array2.shape[0]} examples, each with shape [${array2.shape.slice(1, array2.shape.length)}] (tensor shape [${array2.shape}])`); } } } @@ -23294,10 +23294,10 @@ function checkLossAndTargetCompatibility(targets, lossFns, outputShapes) { binaryCrossentropy, categoricalCrossentropy ]; - for (let i = 0; i < targets.length; ++i) { - const y = targets[i]; - const loss = lossFns[i]; - const shape = outputShapes[i]; + for (let i2 = 0; i2 < targets.length; ++i2) { + const y = targets[i2]; + const loss = lossFns[i2]; + const shape = outputShapes[i2]; if (loss == null) { continue; } @@ -23333,23 +23333,23 @@ function checkInputData(data, names, shapes, checkBatchAxis = true, exceptionPre arrays = [data]; } if (shapes != null) { - for (let i = 0; i < names.length; ++i) { - if (shapes[i] == null) { + for (let i2 = 0; i2 < names.length; ++i2) { + if (shapes[i2] == null) { continue; } - const array2 = arrays[i]; - if (array2.shape.length !== shapes[i].length) { - throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i]} to have ${shapes[i].length} dimension(s), but got array with shape ${JSON.stringify(array2.shape)}`); + const array2 = arrays[i2]; + if (array2.shape.length !== shapes[i2].length) { + throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i2]} to have ${shapes[i2].length} dimension(s), but got array with shape ${JSON.stringify(array2.shape)}`); } - for (let j = 0; j < shapes[i].length; ++j) { + for (let j = 0; j < shapes[i2].length; ++j) { if (j === 0 && !checkBatchAxis) { continue; } const dim = array2.shape[j]; - const refDim = shapes[i][j]; + const refDim = shapes[i2][j]; if (refDim != null) { if (refDim !== dim) { - throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i]} to have shape ${JSON.stringify(shapes[i])} but got array with shape ${JSON.stringify(array2.shape)}.`); + throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i2]} to have shape ${JSON.stringify(shapes[i2])} but got array with shape ${JSON.stringify(array2.shape)}.`); } } } @@ -23428,7 +23428,7 @@ var LayersModel = class extends Container { throw new ValueError(`When passing an Array as loss, it should have one entry per model output. The model has ${this.outputs.length} output(s), but you passed loss=${args.loss}.`); } const theLosses = args.loss; - lossFunctions = theLosses.map((l) => get(l)); + lossFunctions = theLosses.map((l3) => get(l3)); } else { const lossFunction = get(args.loss); this.outputs.forEach((_) => { @@ -23439,26 +23439,26 @@ var LayersModel = class extends Container { this.feedOutputNames = []; this.feedOutputShapes = []; this.feedLossFns = []; - for (let i = 0; i < this.outputs.length; ++i) { - const shape = this.internalOutputShapes[i]; - const name = this.outputNames[i]; + for (let i2 = 0; i2 < this.outputs.length; ++i2) { + const shape = this.internalOutputShapes[i2]; + const name = this.outputNames[i2]; this.feedOutputNames.push(name); this.feedOutputShapes.push(shape); - this.feedLossFns.push(this.lossFunctions[i]); + this.feedLossFns.push(this.lossFunctions[i2]); } const skipTargetIndices = []; this.metrics = args.metrics; this.metricsNames = ["loss"]; this.metricsTensors = []; nameScope("loss", () => { - for (let i = 0; i < this.outputs.length; ++i) { - if (skipTargetIndices.indexOf(i) !== -1) { + for (let i2 = 0; i2 < this.outputs.length; ++i2) { + if (skipTargetIndices.indexOf(i2) !== -1) { continue; } - const weightedLoss = this.lossFunctions[i]; + const weightedLoss = this.lossFunctions[i2]; if (this.outputs.length > 1) { - this.metricsTensors.push([weightedLoss, i]); - this.metricsNames.push(this.outputNames[i] + "_loss"); + this.metricsTensors.push([weightedLoss, i2]); + this.metricsNames.push(this.outputNames[i2] + "_loss"); } } }); @@ -23471,11 +23471,11 @@ var LayersModel = class extends Container { this.metricsTensors.push([metricTensor, outputIndex]); }; nameScope("metric", () => { - for (let i = 0; i < this.outputs.length; ++i) { - if (skipTargetIndices.indexOf(i) !== -1) { + for (let i2 = 0; i2 < this.outputs.length; ++i2) { + if (skipTargetIndices.indexOf(i2) !== -1) { continue; } - const outputMetrics = nestedMetrics[i]; + const outputMetrics = nestedMetrics[i2]; const handleMetrics = (metrics) => { const metricNamePrefix = ""; let metricName; @@ -23483,14 +23483,14 @@ var LayersModel = class extends Container { let weightedMetricFn; for (const metric of metrics) { if (typeof metric === "string" && ["accuracy", "acc", "crossentropy", "ce"].indexOf(metric) !== -1) { - const outputShape = this.internalOutputShapes[i]; - if (outputShape[outputShape.length - 1] === 1 || this.lossFunctions[i] === binaryCrossentropy) { + const outputShape = this.internalOutputShapes[i2]; + if (outputShape[outputShape.length - 1] === 1 || this.lossFunctions[i2] === binaryCrossentropy) { if (["accuracy", "acc"].indexOf(metric) !== -1) { accFn = binaryAccuracy; } else if (["crossentropy", "ce"].indexOf(metric) !== -1) { accFn = binaryCrossentropy2; } - } else if (this.lossFunctions[i] === sparseCategoricalCrossentropy) { + } else if (this.lossFunctions[i2] === sparseCategoricalCrossentropy) { if (["accuracy", "acc"].indexOf(metric) !== -1) { accFn = sparseCategoricalAccuracy; } else if (["crossentropy", "ce"].indexOf(metric) !== -1) { @@ -23520,7 +23520,7 @@ var LayersModel = class extends Container { nameScope(metricName, () => { metricResult = weightedMetricFn; }); - appendMetric(i, metricName, metricResult); + appendMetric(i2, metricName, metricResult); } }; handleMetrics(outputMetrics); @@ -23589,8 +23589,8 @@ var LayersModel = class extends Container { if (inputs.length !== this.inputs.length) { throw new ValueError(`The number of inputs provided (${inputs.length}) does not match the number of inputs of this model (${this.inputs.length}).`); } - for (let i = 0; i < this.inputs.length; ++i) { - feedDict.add(this.inputs[i], inputs[i]); + for (let i2 = 0; i2 < this.inputs.length; ++i2) { + feedDict.add(this.inputs[i2], inputs[i2]); } } else { for (const input2 of this.inputs) { @@ -23610,10 +23610,10 @@ var LayersModel = class extends Container { for (const layer of this.layers) { const layerOutputs = Array.isArray(layer.output) ? layer.output : [layer.output]; const layerOutputNames = layerOutputs.map((output) => output.name); - for (let i = 0; i < symbolicTensorNames.length; ++i) { - const index2 = layerOutputNames.indexOf(symbolicTensorNames[i]); + for (let i2 = 0; i2 < symbolicTensorNames.length; ++i2) { + const index2 = layerOutputNames.indexOf(symbolicTensorNames[i2]); if (index2 !== -1) { - outputSymbolicTensors[i] = layerOutputs[index2]; + outputSymbolicTensors[i2] = layerOutputs[index2]; outputsRemaining--; } if (outputsRemaining === 0) { @@ -23626,9 +23626,9 @@ var LayersModel = class extends Container { } if (outputsRemaining > 0) { const remainingNames = []; - outputSymbolicTensors.forEach((tensor2, i) => { + outputSymbolicTensors.forEach((tensor2, i2) => { if (tensor2 == null) { - remainingNames.push(symbolicTensorNames[i]); + remainingNames.push(symbolicTensorNames[i2]); } }); throw new ValueError(`Cannot find SymbolicTensors for output name(s): ${JSON.stringify(remainingNames)}`); @@ -23650,8 +23650,8 @@ var LayersModel = class extends Container { const insBatch = sliceArrays(ins, batchStart, batchEnd); const feeds = []; if (Array.isArray(insBatch)) { - for (let i = 0; i < insBatch.length; ++i) { - feeds.push({ key: this.inputs[i], value: insBatch[i] }); + for (let i2 = 0; i2 < insBatch.length; ++i2) { + feeds.push({ key: this.inputs[i2], value: insBatch[i2] }); } } else { feeds.push({ key: this.inputs[0], value: insBatch }); @@ -23659,7 +23659,7 @@ var LayersModel = class extends Container { const feedDict = new FeedDict(feeds); return execute(this.outputs, feedDict); }); - batchOuts.forEach((batchOut, i) => outsBatches[i].push(batchOut)); + batchOuts.forEach((batchOut, i2) => outsBatches[i2].push(batchOut)); } return singletonOrArray(outsBatches.map((batches2) => concat(batches2, 0))); }); @@ -23685,9 +23685,9 @@ var LayersModel = class extends Container { throw new RuntimeError("You must compile a model before training/testing. Use LayersModel.compile(modelCompileArgs)."); } const outputShapes = []; - for (let i = 0; i < this.feedOutputShapes.length; ++i) { - const outputShape = this.feedOutputShapes[i]; - const lossFn = this.feedLossFns[i]; + for (let i2 = 0; i2 < this.feedOutputShapes.length; ++i2) { + const outputShape = this.feedOutputShapes[i2]; + const lossFn = this.feedLossFns[i2]; if (lossFn === sparseCategoricalCrossentropy) { outputShapes.push(outputShape.slice(0, outputShape.length - 1).concat([1])); } else { @@ -23714,8 +23714,8 @@ var LayersModel = class extends Container { if (classWeight != null) { const classWeights = standardizeClassWeights(classWeight, this.outputNames); standardSampleWeights = []; - for (let i = 0; i < classWeights.length; ++i) { - standardSampleWeights.push(await standardizeWeights(standardYs[i], null, classWeights[i])); + for (let i2 = 0; i2 < classWeights.length; ++i2) { + standardSampleWeights.push(await standardizeWeights(standardYs[i2], null, classWeights[i2])); } } return [standardXs, standardYs, standardSampleWeights]; @@ -23739,17 +23739,17 @@ var LayersModel = class extends Container { const insBatch = sliceArraysByIndices(ins, batchIds); const batchOuts = f(insBatch); if (batchIndex === 0) { - for (let i = 0; i < batchOuts.length; ++i) { + for (let i2 = 0; i2 < batchOuts.length; ++i2) { outs.push(scalar(0)); } } - for (let i = 0; i < batchOuts.length; ++i) { - const batchOut = batchOuts[i]; - outs[i] = add2(outs[i], mul(batchEnd - batchStart, batchOut)); + for (let i2 = 0; i2 < batchOuts.length; ++i2) { + const batchOut = batchOuts[i2]; + outs[i2] = add2(outs[i2], mul(batchEnd - batchStart, batchOut)); } } - for (let i = 0; i < outs.length; ++i) { - outs[i] = div(outs[i], numSamples); + for (let i2 = 0; i2 < outs.length; ++i2) { + outs[i2] = div(outs[i2], numSamples); } } return outs; @@ -23758,11 +23758,11 @@ var LayersModel = class extends Container { getDedupedMetricsNames() { const outLabels = this.metricsNames; const dedupedOutLabels = []; - for (let i = 0; i < outLabels.length; ++i) { - const label = outLabels[i]; + for (let i2 = 0; i2 < outLabels.length; ++i2) { + const label = outLabels[i2]; let newLabel = label; if (count(outLabels, label) > 1) { - const dupIndex = count(outLabels.slice(0, i), label); + const dupIndex = count(outLabels.slice(0, i2), label); newLabel += `_${dupIndex}`; } dedupedOutLabels.push(newLabel); @@ -23778,33 +23778,33 @@ var LayersModel = class extends Container { const metricsValues = []; const totalLossFunction = () => { const feeds = []; - for (let i = 0; i < this.inputs.length; ++i) { - feeds.push({ key: this.inputs[i], value: inputs[i] }); + for (let i2 = 0; i2 < this.inputs.length; ++i2) { + feeds.push({ key: this.inputs[i2], value: inputs[i2] }); } const feedDict = new FeedDict(feeds); const outputs = execute(this.outputs, feedDict, { "training": true }); let totalLoss; - for (let i = 0; i < this.lossFunctions.length; ++i) { - const lossFunction = this.lossFunctions[i]; - let loss = lossFunction(targets[i], outputs[i]); - if (sampleWeights[i] != null) { - loss = computeWeightedLoss2(loss, sampleWeights[i]); + for (let i2 = 0; i2 < this.lossFunctions.length; ++i2) { + const lossFunction = this.lossFunctions[i2]; + let loss = lossFunction(targets[i2], outputs[i2]); + if (sampleWeights[i2] != null) { + loss = computeWeightedLoss2(loss, sampleWeights[i2]); } const meanLoss = mean(loss); lossValues.push(meanLoss); - if (i === 0) { + if (i2 === 0) { totalLoss = loss; } else { totalLoss = add2(totalLoss, loss); } } - for (let i = 0; i < this.metricsTensors.length; ++i) { + for (let i2 = 0; i2 < this.metricsTensors.length; ++i2) { let weightedMetric; - if (this.outputs.length > 1 && i < this.outputs.length) { - weightedMetric = lossValues[i]; + if (this.outputs.length > 1 && i2 < this.outputs.length) { + weightedMetric = lossValues[i2]; } else { - const metric = this.metricsTensors[i][0]; - const outputIndex = this.metricsTensors[i][1]; + const metric = this.metricsTensors[i2][0]; + const outputIndex = this.metricsTensors[i2][1]; weightedMetric = mean(metric(targets[outputIndex], outputs[outputIndex])); } keep(weightedMetric); @@ -23830,24 +23830,24 @@ var LayersModel = class extends Container { const inputs = data.slice(0, this.inputs.length); const targets = data.slice(this.inputs.length, this.inputs.length + this.outputs.length); const feeds = []; - for (let i = 0; i < this.inputs.length; ++i) { - feeds.push({ key: this.inputs[i], value: inputs[i] }); + for (let i2 = 0; i2 < this.inputs.length; ++i2) { + feeds.push({ key: this.inputs[i2], value: inputs[i2] }); } const feedDict = new FeedDict(feeds); const outputs = execute(this.outputs, feedDict); - for (let i = 0; i < this.lossFunctions.length; ++i) { - const lossFunction = this.lossFunctions[i]; - const loss = mean(lossFunction(targets[i], outputs[i])); - if (i === 0) { + for (let i2 = 0; i2 < this.lossFunctions.length; ++i2) { + const lossFunction = this.lossFunctions[i2]; + const loss = mean(lossFunction(targets[i2], outputs[i2])); + if (i2 === 0) { totalLoss = loss; } else { totalLoss = add2(totalLoss, loss); } valOutputs.push(totalLoss); } - for (let i = 0; i < this.metricsTensors.length; ++i) { - const metric = this.metricsTensors[i][0]; - const outputIndex = this.metricsTensors[i][1]; + for (let i2 = 0; i2 < this.metricsTensors.length; ++i2) { + const metric = this.metricsTensors[i2][0]; + const outputIndex = this.metricsTensors[i2][1]; const meanMetric = mean(metric(targets[outputIndex], outputs[outputIndex])); valOutputs.push(meanMetric); } @@ -23882,11 +23882,11 @@ var LayersModel = class extends Container { const trainableOnly = config3 != null && config3.trainableOnly; const weights = trainableOnly ? this.trainableWeights : this.weights; const weightValues = this.getWeights(trainableOnly); - for (let i = 0; i < weights.length; ++i) { - if (trainableOnly && !weights[i].trainable) { + for (let i2 = 0; i2 < weights.length; ++i2) { + if (trainableOnly && !weights[i2].trainable) { continue; } - namedWeights.push({ name: weights[i].originalName, tensor: weightValues[i] }); + namedWeights.push({ name: weights[i2].originalName, tensor: weightValues[i2] }); } return namedWeights; } @@ -24683,15 +24683,15 @@ var PReLU = class extends Layer { inputShape = getExactlyOneShape(inputShape); const paramShape = inputShape.slice(1); if (this.sharedAxes != null) { - for (const i of this.sharedAxes) { - paramShape[i - 1] = 1; + for (const i2 of this.sharedAxes) { + paramShape[i2 - 1] = 1; } } this.alpha = this.addWeight("alpha", paramShape, "float32", this.alphaInitializer, this.alphaRegularizer, true, this.alphaConstraint); const axes = {}; if (this.sharedAxes != null) { - for (let i = 1; i < inputShape.length; ++i) { - axes[i] = inputShape[i]; + for (let i2 = 1; i2 < inputShape.length; ++i2) { + axes[i2] = inputShape[i2]; } } this.inputSpec = [new InputSpec({ @@ -24797,17 +24797,17 @@ var Softmax3 = class extends Layer { }; Softmax3.className = "Softmax"; serialization_exports.registerClass(Softmax3); -function normalizeArray(value, n, name) { +function normalizeArray(value, n2, name) { if (typeof value === "number") { - return pyListRepeat(value, n); + return pyListRepeat(value, n2); } else { - if (value.length !== n) { - throw new ValueError(`The ${name} argument must be an integer or tuple of ${n} integers. Received: ${value.length} elements.`); + if (value.length !== n2) { + throw new ValueError(`The ${name} argument must be an integer or tuple of ${n2} integers. Received: ${value.length} elements.`); } - for (let i = 0; i < n; ++i) { - const singleValue = value[i]; + for (let i2 = 0; i2 < n2; ++i2) { + const singleValue = value[i2]; if (!isInteger(singleValue)) { - throw new ValueError(`The ${name} argument must be an integer or tuple of ${n} integers. Received: ${JSON.stringify(value)} including a non-integer number ${singleValue}`); + throw new ValueError(`The ${name} argument must be an integer or tuple of ${n2} integers. Received: ${JSON.stringify(value)} including a non-integer number ${singleValue}`); } } return value; @@ -25066,8 +25066,8 @@ var Conv = class extends BaseConv { inputShape = getExactlyOneShape(inputShape); const newSpace = []; const space = this.dataFormat === "channelsLast" ? inputShape.slice(1, inputShape.length - 1) : inputShape.slice(2); - for (let i = 0; i < space.length; ++i) { - const newDim = convOutputLength(space[i], this.kernelSize[i], this.padding, this.strides[i], typeof this.dilationRate === "number" ? this.dilationRate : this.dilationRate[i]); + for (let i2 = 0; i2 < space.length; ++i2) { + const newDim = convOutputLength(space[i2], this.kernelSize[i2], this.padding, this.strides[i2], typeof this.dilationRate === "number" ? this.dilationRate : this.dilationRate[i2]); newSpace.push(newDim); } let outputShape = [inputShape[0]]; @@ -25384,7 +25384,7 @@ var SeparableConv = class extends Conv { const inputDim = inputShape[channelAxis]; const depthwiseKernelShape = this.kernelSize.concat([inputDim, this.depthMultiplier]); const pointwiseKernelShape = []; - for (let i = 0; i < this.rank; ++i) { + for (let i2 = 0; i2 < this.rank; ++i2) { pointwiseKernelShape.push(1); } pointwiseKernelShape.push(inputDim * this.depthMultiplier, this.filters); @@ -25723,19 +25723,19 @@ function rnn(stepFunction, inputs, initialStates, goBackwards = false, mask2, co if (mask2 != null) { perStepMasks = unstack(mask2); } - for (let t = 0; t < timeSteps; ++t) { - const currentInput = perStepInputs[t]; + for (let t2 = 0; t2 < timeSteps; ++t2) { + const currentInput = perStepInputs[t2]; const stepOutputs = tidy(() => stepFunction(currentInput, states)); if (mask2 == null) { lastOutput = stepOutputs[0]; states = stepOutputs[1]; } else { const maskedOutputs = tidy(() => { - const stepMask = perStepMasks[t]; + const stepMask = perStepMasks[t2]; const negStepMask = sub(onesLike(stepMask), stepMask); const output = add2(mul(stepOutputs[0], stepMask), mul(states[0], negStepMask)); - const newStates = states.map((state, i) => { - return add2(mul(stepOutputs[1][i], stepMask), mul(state, negStepMask)); + const newStates = states.map((state, i2) => { + return add2(mul(stepOutputs[1][i2], stepMask), mul(state, negStepMask)); }); return { output, newStates }; }); @@ -25825,7 +25825,7 @@ var RNN = class extends Layer { } const outputMask = this.returnSequences ? mask2 : null; if (this.returnState) { - const stateMask = this.states.map((s) => null); + const stateMask = this.states.map((s2) => null); return [outputMask].concat(stateMask); } else { return outputMask; @@ -25836,7 +25836,7 @@ var RNN = class extends Layer { if (this.states_ == null) { const numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1; const output = []; - for (let i = 0; i < numStates; ++i) { + for (let i2 = 0; i2 < numStates; ++i2) { output.push(null); } return output; @@ -25844,8 +25844,8 @@ var RNN = class extends Layer { return this.states_; } } - set states(s) { - this.states_ = s; + set states(s2) { + this.states_ = s2; } build(inputShape) { const constantShape = null; @@ -26289,7 +26289,7 @@ var GRUCell = class extends RNNCell { const dpMask = this.dropoutMask; const recDpMask = this.recurrentDropoutMask; let z; - let r; + let r2; let hh; if (0 < this.dropout && this.dropout < 1) { inputs = mul(inputs, dpMask[0]); @@ -26307,8 +26307,8 @@ var GRUCell = class extends RNNCell { const [xZ, xR, xH] = split(matrixX, 3, matrixX.rank - 1); const [recurrentZ, recurrentR] = split(matrixInner, 2, matrixInner.rank - 1); z = this.recurrentActivation.apply(add2(xZ, recurrentZ)); - r = this.recurrentActivation.apply(add2(xR, recurrentR)); - const recurrentH = dot2(mul(r, hTMinus1), rk2); + r2 = this.recurrentActivation.apply(add2(xR, recurrentR)); + const recurrentH = dot2(mul(r2, hTMinus1), rk2); hh = this.activation.apply(add2(xH, recurrentH)); const h = add2(mul(z, hTMinus1), mul(add2(1, neg(z)), hh)); return [h, h]; @@ -26466,7 +26466,7 @@ var LSTMCell = class extends RNNCell { } const dpMask = this.dropoutMask; const recDpMask = this.recurrentDropoutMask; - let i; + let i2; let f; let c; let o; @@ -26482,9 +26482,9 @@ var LSTMCell = class extends RNNCell { z = biasAdd(z, this.bias.read()); } const [z0, z1, z2, z3] = split(z, 4, z.rank - 1); - i = this.recurrentActivation.apply(z0); + i2 = this.recurrentActivation.apply(z0); f = this.recurrentActivation.apply(z1); - c = add2(mul(f, cTMinus1), mul(i, this.activation.apply(z2))); + c = add2(mul(f, cTMinus1), mul(i2, this.activation.apply(z2))); o = this.recurrentActivation.apply(z3); const h = mul(o, this.activation.apply(c)); return [h, h, c]; @@ -26581,10 +26581,10 @@ var StackedRNNCells = class extends RNNCell { nestedStates.reverse(); const newNestedStates = []; let callInputs; - for (let i = 0; i < this.cells.length; ++i) { - const cell = this.cells[i]; - states = nestedStates[i]; - if (i === 0) { + for (let i2 = 0; i2 < this.cells.length; ++i2) { + const cell = this.cells[i2]; + states = nestedStates[i2]; + if (i2 === 0) { callInputs = [inputs[0]].concat(states); } else { callInputs = [callInputs[0]].concat(states); @@ -26605,8 +26605,8 @@ var StackedRNNCells = class extends RNNCell { } inputShape = inputShape; let outputDim; - this.cells.forEach((cell, i) => { - nameScope(`RNNCell_${i}`, () => { + this.cells.forEach((cell, i2) => { + nameScope(`RNNCell_${i2}`, () => { cell.build(inputShape); if (Array.isArray(cell.stateSize)) { outputDim = cell.stateSize[0]; @@ -26673,8 +26673,8 @@ var StackedRNNCells = class extends RNNCell { for (const cell of this.cells) { const numParams = cell.weights.length; const inputWeights = weights.splice(numParams); - for (let i = 0; i < cell.weights.length; ++i) { - tuples.push([cell.weights[i], inputWeights[i]]); + for (let i2 = 0; i2 < cell.weights.length; ++i2) { + tuples.push([cell.weights[i2], inputWeights[i2]]); } } batchSetValue(tuples); @@ -26692,17 +26692,17 @@ function generateDropoutMask(args) { const masks = Array(count22).fill(void 0).map(createMask); return masks.map((m) => keep(m.clone())); } -var __rest = function(s, e) { - var t = {}; - for (var p2 in s) - if (Object.prototype.hasOwnProperty.call(s, p2) && e.indexOf(p2) < 0) - t[p2] = s[p2]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p2 = Object.getOwnPropertySymbols(s); i < p2.length; i++) { - if (e.indexOf(p2[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i])) - t[p2[i]] = s[p2[i]]; +var __rest = function(s2, e2) { + var t2 = {}; + for (var p2 in s2) + if (Object.prototype.hasOwnProperty.call(s2, p2) && e2.indexOf(p2) < 0) + t2[p2] = s2[p2]; + if (s2 != null && typeof Object.getOwnPropertySymbols === "function") + for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s2); i2 < p2.length; i2++) { + if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s2, p2[i2])) + t2[p2[i2]] = s2[p2[i2]]; } - return t; + return t2; }; var ConvRNN2D = class extends RNN { constructor(args) { @@ -26931,9 +26931,9 @@ var ConvLSTM2DCell = class extends LSTMCell { hF = this.recurrentConv(hF, recKernelF); hC = this.recurrentConv(hC, recKernelC); hO = this.recurrentConv(hO, recKernelO); - const i = this.recurrentActivation.apply(add2(xI, hI)); + const i2 = this.recurrentActivation.apply(add2(xI, hI)); const f = this.recurrentActivation.apply(add2(xF, hF)); - const c = add2(mul(f, cTMinus1), mul(i, this.activation.apply(add2(xC, hC)))); + const c = add2(mul(f, cTMinus1), mul(i2, this.activation.apply(add2(xC, hC)))); const h = mul(this.recurrentActivation.apply(add2(xO, hO)), this.activation.apply(c)); return [h, h, c]; }); @@ -26989,8 +26989,8 @@ var Dropout = class extends Layer { } const inputShape = input2.shape; const noiseShape = []; - for (let i = 0; i < this.noiseShape.length; ++i) { - noiseShape.push(this.noiseShape[i] == null ? inputShape[i] : this.noiseShape[i]); + for (let i2 = 0; i2 < this.noiseShape.length; ++i2) { + noiseShape.push(this.noiseShape[i2] == null ? inputShape[i2] : this.noiseShape[i2]); } return noiseShape; } @@ -27147,8 +27147,8 @@ var Flatten = class extends Layer { let input2 = getExactlyOneTensor(inputs); if (this.dataFormat === "channelsFirst" && input2.rank > 1) { const permutation = [0]; - for (let i = 2; i < input2.rank; ++i) { - permutation.push(i); + for (let i2 = 2; i2 < input2.rank; ++i2) { + permutation.push(i2); } permutation.push(1); input2 = transpose(input2, permutation); @@ -27220,9 +27220,9 @@ var Reshape2 = class extends Layer { constructor(args) { super(args); this.targetShape = args.targetShape; - for (let i = 0; i < this.targetShape.length; ++i) { - if (this.isUnknown(this.targetShape[i])) { - this.targetShape[i] = null; + for (let i2 = 0; i2 < this.targetShape.length; ++i2) { + if (this.isUnknown(this.targetShape[i2])) { + this.targetShape[i2] = null; } } } @@ -27234,11 +27234,11 @@ var Reshape2 = class extends Layer { const finalShape = outputShape.slice(); let known = 1; let unknown = null; - for (let i = 0; i < finalShape.length; ++i) { - const dim = finalShape[i]; + for (let i2 = 0; i2 < finalShape.length; ++i2) { + const dim = finalShape[i2]; if (this.isUnknown(dim)) { if (unknown === null) { - unknown = i; + unknown = i2; } else { throw new ValueError("Can only specifiy one unknown dimension."); } @@ -27259,8 +27259,8 @@ var Reshape2 = class extends Layer { } computeOutputShape(inputShape) { let anyUnknownDims = false; - for (let i = 0; i < inputShape.length; ++i) { - if (this.isUnknown(inputShape[i])) { + for (let i2 = 0; i2 < inputShape.length; ++i2) { + if (this.isUnknown(inputShape[i2])) { anyUnknownDims = true; break; } @@ -27311,8 +27311,8 @@ var Permute = class extends Layer { computeOutputShape(inputShape) { inputShape = getExactlyOneShape(inputShape); const outputShape = inputShape.slice(); - this.dims.forEach((dim, i) => { - outputShape[i + 1] = inputShape[dim]; + this.dims.forEach((dim, i2) => { + outputShape[i2 + 1] = inputShape[dim]; }); return outputShape; } @@ -27421,16 +27421,16 @@ var Embedding = class extends Layer { if (inLens.length !== inputShape.length - 1) { throw new ValueError(`"inputLength" is ${this.inputLength}, but received input shape has shape ${inputShape}`); } else { - let i = 0; + let i2 = 0; for (let k = 0; k < inLens.length; ++k) { const s1 = inLens[k]; const s2 = inputShape[k + 1]; if (s1 != null && s2 != null && s1 !== s2) { throw new ValueError(`"inputLength" is ${this.inputLength}, but received input shape has shape ${inputShape}`); } else if (s1 == null) { - inLens[i] = s2; + inLens[i2] = s2; } - i++; + i2++; } } return [inputShape[0], ...inLens, this.outputDim]; @@ -27482,19 +27482,19 @@ var Merge = class extends Layer { } const outputShape = shape1.slice(0, shape1.length - shape2.length); for (let k = 0; k < shape2.length; ++k) { - const i = shape1[shape1.length - shape2.length + k]; + const i2 = shape1[shape1.length - shape2.length + k]; const j = shape2[k]; - if (i == null || j == null || i < 0 || j < 0) { + if (i2 == null || j == null || i2 < 0 || j < 0) { outputShape.push(null); - } else if (i === 1) { + } else if (i2 === 1) { outputShape.push(j); } else if (j === 1) { - outputShape.push(i); + outputShape.push(i2); } else { - if (i !== j) { + if (i2 !== j) { throw new ValueError("Operands could not be broadcast together with shapes " + JSON.stringify(shape1) + " " + JSON.stringify(shape2)); } - outputShape.push(i); + outputShape.push(i2); } } return outputShape; @@ -27518,8 +27518,8 @@ var Merge = class extends Layer { throw new ValueError(`Can not merge tensors with different batch sizes. Got tensors with shapes: ${JSON.stringify(inputShape)}.`); } let outputShape = inputShape[0] == null ? null : inputShape[0].slice(1); - for (let i = 1; i < inputShape.length; ++i) { - const shape = inputShape[i] == null ? null : inputShape[i].slice(1); + for (let i2 = 1; i2 < inputShape.length; ++i2) { + const shape = inputShape[i2] == null ? null : inputShape[i2].slice(1); outputShape = this.computeElementwiseOpOutputShape(outputShape, shape); } const allRanks = inputShape.map((shape) => shape.length); @@ -27595,8 +27595,8 @@ var Merge = class extends Layer { } else { outputShape = inputShape[0].slice(1); } - for (let i = 1; i < inputShape.length; ++i) { - const shape = inputShape[i] == null ? null : inputShape[i].slice(1); + for (let i2 = 1; i2 < inputShape.length; ++i2) { + const shape = inputShape[i2] == null ? null : inputShape[i2].slice(1); outputShape = this.computeElementwiseOpOutputShape(outputShape, shape); } let batchSizes = []; @@ -27632,8 +27632,8 @@ var Merge = class extends Layer { } mask2 = mask2.map((m) => m == null ? m : expandDims(m, 0)); let output = mask2[0]; - for (let i = 1; i < mask2.length - 1; ++i) { - output = logicalAnd(output, mask2[i]); + for (let i2 = 1; i2 < mask2.length - 1; ++i2) { + output = logicalAnd(output, mask2[i2]); } return output; }); @@ -27646,8 +27646,8 @@ var Add2 = class extends Merge { mergeFunction(inputs) { return tidy(() => { let output = inputs[0].clone(); - for (let i = 1; i < inputs.length; ++i) { - output = add2(output, inputs[i]); + for (let i2 = 1; i2 < inputs.length; ++i2) { + output = add2(output, inputs[i2]); } return output; }); @@ -27662,8 +27662,8 @@ var Multiply2 = class extends Merge { mergeFunction(inputs) { return tidy(() => { let output = inputs[0].clone(); - for (let i = 1; i < inputs.length; ++i) { - output = mul(output, inputs[i]); + for (let i2 = 1; i2 < inputs.length; ++i2) { + output = mul(output, inputs[i2]); } return output; }); @@ -27678,8 +27678,8 @@ var Average = class extends Merge { mergeFunction(inputs) { return tidy(() => { let output = inputs[0].clone(); - for (let i = 1; i < inputs.length; ++i) { - output = add2(output, inputs[i]); + for (let i2 = 1; i2 < inputs.length; ++i2) { + output = add2(output, inputs[i2]); } return mul(1 / inputs.length, output); }); @@ -27694,8 +27694,8 @@ var Maximum2 = class extends Merge { mergeFunction(inputs) { return tidy(() => { let output = inputs[0]; - for (let i = 1; i < inputs.length; ++i) { - output = maximum(output, inputs[i]); + for (let i2 = 1; i2 < inputs.length; ++i2) { + output = maximum(output, inputs[i2]); } return output; }); @@ -27710,8 +27710,8 @@ var Minimum2 = class extends Merge { mergeFunction(inputs) { return tidy(() => { let output = inputs[0]; - for (let i = 1; i < inputs.length; ++i) { - output = minimum(output, inputs[i]); + for (let i2 = 1; i2 < inputs.length; ++i2) { + output = minimum(output, inputs[i2]); } return output; }); @@ -27746,8 +27746,8 @@ var Concatenate = class extends Merge { return; } const shapeSet = []; - for (let i = 0; i < inputShape.length; ++i) { - const shapeWithoutConcatAxis = inputShape[i].slice(); + for (let i2 = 0; i2 < inputShape.length; ++i2) { + const shapeWithoutConcatAxis = inputShape[i2].slice(); shapeWithoutConcatAxis.splice(this.axis, 1); let exists = false; for (const shape of shapeSet) { @@ -27810,13 +27810,13 @@ var Concatenate = class extends Merge { return null; } const outputMasks = []; - for (let i = 0; i < inputs.length; ++i) { - if (mask2[i] == null) { - outputMasks.push(cast(onesLike(inputs[i]), "bool")); - } else if (mask2[i].rank < inputs[i].rank) { - outputMasks.push(expandDims(mask2[i], -1)); + for (let i2 = 0; i2 < inputs.length; ++i2) { + if (mask2[i2] == null) { + outputMasks.push(cast(onesLike(inputs[i2]), "bool")); + } else if (mask2[i2].rank < inputs[i2].rank) { + outputMasks.push(expandDims(mask2[i2], -1)); } else { - outputMasks.push(mask2[i]); + outputMasks.push(mask2[i2]); } } const concatenatedMasks = concat(outputMasks, this.axis); @@ -27863,14 +27863,14 @@ function batchDot(x, y, axes) { if (xNDim > yNDim) { diff = xNDim - yNDim; const diffShape = []; - for (let i = 0; i < diff; ++i) { + for (let i2 = 0; i2 < diff; ++i2) { diffShape.push(1); } y = reshape(y, y.shape.concat(diffShape)); } else if (yNDim > xNDim) { diff = yNDim - xNDim; const diffShape = []; - for (let i = 0; i < diff; ++i) { + for (let i2 = 0; i2 < diff; ++i2) { diffShape.push(1); } x = reshape(x, x.shape.concat(diffShape)); @@ -27897,8 +27897,8 @@ function batchDot(x, y, axes) { idx = xNDim - 1; } const squeezeAxes = []; - for (let i = idx; i < idx + diff; ++i) { - squeezeAxes.push(i); + for (let i2 = idx; i2 < idx + diff; ++i2) { + squeezeAxes.push(i2); } out = squeeze(out, squeezeAxes); } @@ -27941,7 +27941,7 @@ var Dot = class extends Merge { interpretAxis(this.axes, x2.shape.length) ]; } else { - axes = this.axes.map((axis, i) => interpretAxis(axis, inputs[i].shape.length)); + axes = this.axes.map((axis, i2) => interpretAxis(axis, inputs[i2].shape.length)); } if (this.normalize) { x1 = l2Normalize(x1, axes[0]); @@ -28288,9 +28288,9 @@ var LayerNormalization = class extends Layer { if (typeof this.axis === "number") { this.axis = [this.axis]; } - for (let i = 0; i < this.axis.length; ++i) { - if (this.axis[i] < 0) { - this.axis[i] += nDims; + for (let i2 = 0; i2 < this.axis.length; ++i2) { + if (this.axis[i2] < 0) { + this.axis[i2] += nDims; } } for (const axis of this.axis) { @@ -28337,13 +28337,13 @@ var LayerNormalization = class extends Layer { let offset = this.center ? broadcast(this.beta.read()) : null; const momentsTiling = []; const scaleOffsetTiling = []; - for (let i = 0; i < nDims; ++i) { - if (this.axis.indexOf(i) !== -1) { - momentsTiling.push(inputShape[i]); + for (let i2 = 0; i2 < nDims; ++i2) { + if (this.axis.indexOf(i2) !== -1) { + momentsTiling.push(inputShape[i2]); scaleOffsetTiling.push(1); } else { momentsTiling.push(1); - scaleOffsetTiling.push(inputShape[i]); + scaleOffsetTiling.push(inputShape[i2]); } } mean5 = tile(mean5, momentsTiling); @@ -29773,9 +29773,9 @@ function getPadding(node2, tensorMap, context) { if (pad3 === "explicit") { pad3 = getParamValue("explicitPaddings", node2, tensorMap, context); const explicitPadding = [[0, 0], [0, 0], [0, 0], [0, 0]]; - for (let i = 0; i < 4; i++) { - explicitPadding[i][0] = pad3[i * 2]; - explicitPadding[i][1] = pad3[i * 2 + 1]; + for (let i2 = 0; i2 < 4; i2++) { + explicitPadding[i2][0] = pad3[i2 * 2]; + explicitPadding[i2][1] = pad3[i2 * 2 + 1]; } return explicitPadding; } @@ -36147,8 +36147,8 @@ function decodeBase64(text) { throw new Error("Unable to decode base64 in this environment. Missing built-in atob() or Buffer()"); } } -function parseStringParam(s, keepCase) { - const value = Array.isArray(s) ? String.fromCharCode.apply(null, s) : decodeBase64(s); +function parseStringParam(s2, keepCase) { + const value = Array.isArray(s2) ? String.fromCharCode.apply(null, s2) : decodeBase64(s2); return keepCase ? value : value.toLowerCase(); } function getStringParam(attrs, name, def, keepCase = false) { @@ -36680,9 +36680,9 @@ function assertShapesMatchAllowUndefinedSize(shapeA, shapeB, errorMessagePrefix return; } util_exports.assert(shapeA.length === shapeB.length, () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); - for (let i = 0; i < shapeA.length; i++) { - const dim0 = shapeA[i]; - const dim1 = shapeB[i]; + for (let i2 = 0; i2 < shapeA.length; i2++) { + const dim0 = shapeA[i2]; + const dim1 = shapeB[i2]; util_exports.assert(dim0 < 0 || dim1 < 0 || dim0 === dim1, () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); } } @@ -36719,13 +36719,13 @@ function mergeElementShape(elementShapeA, elementShapeB) { throw new Error(`Incompatible ranks during merge: ${elementShapeA} vs. ${elementShapeB}`); } const result = []; - for (let i = 0; i < elementShapeA.length; ++i) { - const dim0 = elementShapeA[i]; - const dim1 = elementShapeB[i]; + for (let i2 = 0; i2 < elementShapeA.length; ++i2) { + const dim0 = elementShapeA[i2]; + const dim1 = elementShapeB[i2]; if (dim0 >= 0 && dim1 >= 0 && dim0 !== dim1) { throw new Error(`Incompatible shape during merge: ${elementShapeA} vs. ${elementShapeB}`); } - result[i] = dim0 >= 0 ? dim0 : dim1; + result[i2] = dim0 >= 0 ? dim0 : dim1; } return result; } @@ -36789,7 +36789,7 @@ var TensorArray = class { if (index2 < 0 || !this.dynamicSize && index2 >= this.maxSize) { throw new Error(`Tried to write to index ${index2}, but array is not resizeable and size is: ${this.maxSize}`); } - const t = this.tensors[index2] || {}; + const t2 = this.tensors[index2] || {}; if (tensor2.dtype !== this.dtype) { throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index2}, because the value dtype is ${tensor2.dtype}, but TensorArray dtype is ${this.dtype}.`); @@ -36798,22 +36798,22 @@ var TensorArray = class { this.elementShape = tensor2.shape; } assertShapesMatchAllowUndefinedSize(this.elementShape, tensor2.shape, `TensorArray ${this.name}: Could not write to TensorArray index ${index2}.`); - if (t.read) { + if (t2.read) { throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index2}, because it has already been read.`); } - if (t.written) { + if (t2.written) { throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index2}, because it has already been written.`); } - t.tensor = tensor2; + t2.tensor = tensor2; keep(tensor2); - t.written = true; - this.tensors[index2] = t; + t2.written = true; + this.tensors[index2] = t2; } writeMany(indices, tensors) { if (indices.length !== tensors.length) { throw new Error(`TensorArray ${this.name}: could not write multiple tensors,because the index size: ${indices.length} is not the same as tensors size: ${tensors.length}.`); } - indices.forEach((i, index2) => this.write(i, tensors[index2])); + indices.forEach((i2, index2) => this.write(i2, tensors[index2])); } gather(indices, dtype) { if (!!dtype && dtype !== this.dtype) { @@ -36821,8 +36821,8 @@ var TensorArray = class { } if (!indices) { indices = []; - for (let i = 0; i < this.size(); i++) { - indices.push(i); + for (let i2 = 0; i2 < this.size(); i2++) { + indices.push(i2); } } else { indices = indices.slice(0, this.size()); @@ -36842,8 +36842,8 @@ var TensorArray = class { return tensor([], [0].concat(this.elementShape)); } const indices = []; - for (let i = 0; i < this.size(); i++) { - indices.push(i); + for (let i2 = 0; i2 < this.size(); i2++) { + indices.push(i2); } const tensors = this.readMany(indices); assertShapesMatchAllowUndefinedSize(this.elementShape, tensors[0].shape, `TensorArray shape mismatch: tensor array shape (${this.elementShape}) vs first tensor shape (${tensors[0].shape})`); @@ -36883,17 +36883,17 @@ var TensorArray = class { const tensors = []; tidy(() => { tensor2 = reshape(tensor2, [1, totalLength, elementPerRow]); - for (let i = 0; i < length.length; ++i) { - const previousLength = i === 0 ? 0 : cumulativeLengths[i - 1]; + for (let i2 = 0; i2 < length.length; ++i2) { + const previousLength = i2 === 0 ? 0 : cumulativeLengths[i2 - 1]; const indices2 = [0, previousLength, 0]; - const sizes = [1, length[i], elementPerRow]; - tensors[i] = reshape(slice(tensor2, indices2, sizes), this.elementShape); + const sizes = [1, length[i2], elementPerRow]; + tensors[i2] = reshape(slice(tensor2, indices2, sizes), this.elementShape); } return tensors; }); const indices = []; - for (let i = 0; i < length.length; i++) { - indices[i] = i; + for (let i2 = 0; i2 < length.length; i2++) { + indices[i2] = i2; } this.writeMany(indices, tensors); } @@ -36980,8 +36980,8 @@ var TensorList = class { } const destTensorList = new TensorList([], this.elementShape, this.elementDtype, this.maxNumElements); destTensorList.tensors.length = size2; - for (let i = 0; i < Math.min(this.tensors.length, size2); ++i) { - destTensorList.tensors[i] = this.tensors[i]; + for (let i2 = 0; i2 < Math.min(this.tensors.length, size2); ++i2) { + destTensorList.tensors[i2] = this.tensors[i2]; } return destTensorList; } @@ -37021,7 +37021,7 @@ var TensorList = class { return tensor([], [0].concat(outputElementShape)); } return tidy(() => { - const tensors = indices.map((i) => reshape(this.tensors[i], outputElementShape)); + const tensors = indices.map((i2) => reshape(this.tensors[i2], outputElementShape)); return stack(tensors, 0); }); } @@ -37035,7 +37035,7 @@ var TensorList = class { return tensor([], [0].concat(outputElementShape)); } return tidy(() => { - const tensors = this.tensors.map((t) => reshape(t, outputElementShape)); + const tensors = this.tensors.map((t2) => reshape(t2, outputElementShape)); return concat(tensors, 0); }); } @@ -37088,18 +37088,18 @@ function split2(tensor2, length, elementShape) { const tensors = tidy(() => { const tensors2 = []; tensor2 = reshape(tensor2, [1, totalLength, elementPerRow]); - for (let i = 0; i < length.length; ++i) { - const previousLength = i === 0 ? 0 : cumulativeLengths[i - 1]; + for (let i2 = 0; i2 < length.length; ++i2) { + const previousLength = i2 === 0 ? 0 : cumulativeLengths[i2 - 1]; const indices = [0, previousLength, 0]; - const sizes = [1, length[i], elementPerRow]; - tensors2[i] = reshape(slice(tensor2, indices, sizes), outputElementShape); + const sizes = [1, length[i2], elementPerRow]; + tensors2[i2] = reshape(slice(tensor2, indices, sizes), outputElementShape); } tensor2.dispose(); return tensors2; }); const list = new TensorList([], elementShape, tensor2.dtype, length.length); - for (let i = 0; i < tensors.length; i++) { - list.setItem(i, tensors[i]); + for (let i2 = 0; i2 < tensors.length; i2++) { + list.setItem(i2, tensors[i2]); } return list; } @@ -37684,14 +37684,14 @@ var executeOp8 = (node2, tensorMap, context, ops = ops_for_converter_exports) => return [cloneTensor(data2)]; } case "IdentityN": - return getParamValue("x", node2, tensorMap, context).map((t) => cloneTensor(t)); + return getParamValue("x", node2, tensorMap, context).map((t2) => cloneTensor(t2)); case "Snapshot": const snapshot = getParamValue("x", node2, tensorMap, context); return [cloneTensor(snapshot)]; case "Shape": return [ops.tensor1d(getParamValue("x", node2, tensorMap, context).shape, "int32")]; case "ShapeN": - return getParamValue("x", node2, tensorMap, context).map((t) => ops.tensor1d(t.shape)); + return getParamValue("x", node2, tensorMap, context).map((t2) => ops.tensor1d(t2.shape)); case "Size": return [ops.scalar(getParamValue("x", node2, tensorMap, context).size, "int32")]; case "Rank": @@ -37705,8 +37705,8 @@ var executeOp8 = (node2, tensorMap, context, ops = ops_for_converter_exports) => const summarize = getParamValue("summarize", node2, tensorMap, context); console.warn("The graph has a tf.print() operation,usually used for debugging, which slows down performance."); console.log(message); - for (let i = 0; i < data.length; i++) { - console.log(Array.prototype.slice.call(data[i].dataSync()).slice(0, summarize)); + for (let i2 = 0; i2 < data.length; i2++) { + console.log(Array.prototype.slice.call(data[i2].dataSync()).slice(0, summarize)); } return [input2]; default: @@ -37745,9 +37745,9 @@ var HashTable = class { const keysLength = $keys.length; const valuesLength = $values.length; util_exports.assert(keysLength === valuesLength, () => `The number of elements doesn't match, keys has ${keysLength} elements, the values has ${valuesLength} elements.`); - for (let i = 0; i < keysLength; i++) { - const key = $keys[i]; - const value = $values[i]; + for (let i2 = 0; i2 < keysLength; i2++) { + const key = $keys[i2]; + const value = $values[i2]; keep(value); this.tensorMap.set(key, value); } @@ -37759,8 +37759,8 @@ var HashTable = class { const $keys = await keys.data(); return tidy(() => { const result = []; - for (let i = 0; i < $keys.length; i++) { - const key = $keys[i]; + for (let i2 = 0; i2 < $keys.length; i2++) { + const key = $keys[i2]; const value = this.findWithDefault(key, defaultValue); result.push(value); } @@ -38034,10 +38034,10 @@ var executeOp15 = (node2, tensorMap, context, ops = ops_for_converter_exports) = switch (node2.op) { case "ConcatV2": case "Concat": { - const n = getParamValue("n", node2, tensorMap, context); + const n2 = getParamValue("n", node2, tensorMap, context); const axis = getParamValue("axis", node2, tensorMap, context); let inputs = getParamValue("tensors", node2, tensorMap, context); - inputs = inputs.slice(0, n); + inputs = inputs.slice(0, n2); return [ops.concat(inputs, axis)]; } case "Gather": { @@ -38055,9 +38055,9 @@ var executeOp15 = (node2, tensorMap, context, ops = ops_for_converter_exports) = case "Reverse": { const dims = getParamValue("dims", node2, tensorMap, context); const axis = []; - for (let i = 0; i < dims.length; i++) { - if (dims[i]) { - axis.push(i); + for (let i2 = 0; i2 < dims.length; i2++) { + if (dims[i2]) { + axis.push(i2); } } const input2 = getParamValue("x", node2, tensorMap, context); @@ -38338,8 +38338,8 @@ var ExecutionContext = class { } generateCurrentContextIds() { const names = []; - for (let i = 0; i < this.contexts.length - 1; i++) { - const contexts2 = this.contexts.slice(0, this.contexts.length - i); + for (let i2 = 0; i2 < this.contexts.length - 1; i2++) { + const contexts2 = this.contexts.slice(0, this.contexts.length - i2); names.push(this.contextIdforContexts(contexts2)); } names.push(""); @@ -38604,7 +38604,7 @@ var GraphExecutor = class { throw new Error(`This execution contains the node '${dynamicNode.name}', which has the dynamic op '${dynamicNode.op}'. Please use model.executeAsync() instead. Alternatively, to avoid the dynamic ops, specify the inputs [${syncInputs}]`); } if (missingInputs.length > 0) { - const outNames = outputs.map((n) => n.name); + const outNames = outputs.map((n2) => n2.name); const inNames = Object.keys(inputs); throw new Error(`Cannot compute the outputs [${outNames}] from the provided inputs [${inNames}]. Missing the following inputs: [${missingInputs}]`); } @@ -38643,8 +38643,8 @@ var GraphExecutor = class { }); const tensorsToKeep = this.getFrozenTensorIds(tensorsMap); const intermediateTensorConsumerCount = {}; - for (let i = 0; i < orderedNodes.length; i++) { - const node2 = orderedNodes[i]; + for (let i2 = 0; i2 < orderedNodes.length; i2++) { + const node2 = orderedNodes[i2]; if (!tensorsMap[node2.name]) { const tensors = executeOp20(node2, tensorsMap, context, this._resourceManager); if (util_exports.isPromise(tensors)) { @@ -38744,14 +38744,14 @@ var GraphExecutor = class { } try { this.keepTensorForDebug = env().getBool("KEEP_INTERMEDIATE_TENSORS"); - } catch (e) { - console.warn(e.message); + } catch (e2) { + console.warn(e2.message); } this.resetIntermediateTensors(); const context = new ExecutionContext(this.weightMap, tensorArrayMap, tensorListMap, this.functionExecutorMap); this.tensorsMap = await this.executeWithControlFlow(inputs, context, outputs, isFunctionExecution); const results = outputs.map((name) => getTensor(name, this.tensorsMap, context)); - const outputIds = results.map((t) => t.id); + const outputIds = results.map((t2) => t2.id); const inputIds = Object.keys(inputs).map((name) => inputs[name].id); this.keepIds = /* @__PURE__ */ new Set([...outputIds, ...inputIds, ...this.weightIds]); if (!this.keepTensorForDebug) { @@ -38828,12 +38828,12 @@ var GraphExecutor = class { } const currentContext = context.currentContext; if (util_exports.isPromise(tensors)) { - promises.push(tensors.then((t) => { - tensorMap[nodeName] = t; + promises.push(tensors.then((t2) => { + tensorMap[nodeName] = t2; context.currentContext = currentContext; this.checkTensorForDisposal(nodeName, item.node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount); this.processChildNodes(item.node, stack2, context, tensorMap, added, usedNodes); - return t; + return t2; })); } else { tensorMap[nodeName] = tensors; @@ -39065,7 +39065,7 @@ var GraphModel = class { if (this.structuredOutputKeys) { const outputTensorsArray = outputTensors instanceof Tensor ? [outputTensors] : outputTensors; const outputTensorMap = {}; - outputTensorsArray.forEach((outputTensor, i) => outputTensorMap[this.structuredOutputKeys[i]] = outputTensor); + outputTensorsArray.forEach((outputTensor, i2) => outputTensorMap[this.structuredOutputKeys[i2]] = outputTensor); return outputTensorMap; } return outputTensors; @@ -39078,8 +39078,8 @@ var GraphModel = class { if (inputs.length !== this.inputNodes.length) { throw new Error(`Input tensor count mismatch,the graph model has ${this.inputNodes.length} placeholders, while there are ${inputs.length} input tensors.`); } - return this.inputNodes.reduce((map, inputName, i) => { - map[inputName] = inputs[i]; + return this.inputNodes.reduce((map, inputName, i2) => { + map[inputName] = inputs[i2]; return map; }, {}); } @@ -39403,8 +39403,8 @@ var GrowingRingBuffer = class extends RingBuffer { const newCapacity = this.capacity * 2; const newData = new Array(newCapacity); const len = this.length(); - for (let i = 0; i < len; i++) { - newData[i] = this.get(this.wrap(this.begin + i)); + for (let i2 = 0; i2 < len; i2++) { + newData[i2] = this.get(this.wrap(this.begin + i2)); } this.data = newData; this.capacity = newCapacity; @@ -39545,9 +39545,9 @@ var FunctionCallIterator = class extends LazyIterator { async next() { try { return this.nextFn(); - } catch (e) { - e.message = `Error thrown while iterating through a dataset: ${e.message}`; - throw e; + } catch (e2) { + e2.message = `Error thrown while iterating through a dataset: ${e2.message}`; + throw e2; } } }; @@ -39682,9 +39682,9 @@ var MapIterator = class extends LazyIterator { const inputTensors = tensor_util_exports.getTensorsInContainer(item.value); const mapped = this.transform(item.value); const outputTensors = tensor_util_exports.getTensorsInContainer(mapped); - for (const t of inputTensors) { - if (!tensor_util_exports.isTensorInList(t, outputTensors)) { - t.dispose(); + for (const t2 of inputTensors) { + if (!tensor_util_exports.isTensorInList(t2, outputTensors)) { + t2.dispose(); } } return { value: mapped, done: false }; @@ -39709,8 +39709,8 @@ var ErrorHandlingLazyIterator = class extends LazyIterator { while (true) { try { return await this.upstream.next(); - } catch (e) { - if (!this.handler(e)) { + } catch (e2) { + if (!this.handler(e2)) { return { value: null, done: true }; } } @@ -39734,9 +39734,9 @@ var AsyncMapIterator = class extends LazyIterator { const inputTensors = tensor_util_exports.getTensorsInContainer(item.value); const mapped = await this.transform(item.value); const outputTensors = tensor_util_exports.getTensorsInContainer(mapped); - for (const t of inputTensors) { - if (!tensor_util_exports.isTensorInList(t, outputTensors)) { - t.dispose(); + for (const t2 of inputTensors) { + if (!tensor_util_exports.isTensorInList(t2, outputTensors)) { + t2.dispose(); } } return { value: mapped, done: false }; @@ -39779,9 +39779,9 @@ var FlatmapIterator = class extends OneToManyIterator { const mappedArray = this.transform(item.value); const outputTensors = tensor_util_exports.getTensorsInContainer(mappedArray); this.outputQueue.pushAll(mappedArray); - for (const t of inputTensors) { - if (!tensor_util_exports.isTensorInList(t, outputTensors)) { - t.dispose(); + for (const t2 of inputTensors) { + if (!tensor_util_exports.isTensorInList(t2, outputTensors)) { + t2.dispose(); } } return true; @@ -40100,8 +40100,8 @@ function zip(datasets) { } let size2; if (Array.isArray(datasets)) { - for (let i = 0; i < datasets.length; i++) { - size2 = size2 == null ? datasets[i].size : Math.min(size2, datasets[i].size); + for (let i2 = 0; i2 < datasets.length; i2++) { + size2 = size2 == null ? datasets[i2].size : Math.min(size2, datasets[i2].size); } } else if (datasets instanceof Object) { for (const ds in datasets) { @@ -40252,13 +40252,13 @@ var CSVDataset = class extends Dataset { const values = this.parseRow(line); const features = {}; const labels2 = {}; - for (let i = 0; i < this.fullColumnNames.length; i++) { - const key = this.fullColumnNames[i]; + for (let i2 = 0; i2 < this.fullColumnNames.length; i2++) { + const key = this.fullColumnNames[i2]; const config3 = this.columnConfigs ? this.columnConfigs[key] : null; if (this.configuredColumnsOnly && !config3) { continue; } else { - const value = values[i]; + const value = values[i2]; let parsedValue = null; if (value === "") { if (config3 && config3.default !== void 0) { @@ -40315,16 +40315,16 @@ var CSVDataset = class extends Dataset { let readOffset = 0; const readLength = line.length; let currentState = STATE_OUT; - for (let i = 0; i < readLength; i++) { + for (let i2 = 0; i2 < readLength; i2++) { switch (currentState) { case STATE_OUT: - switch (line.charAt(i)) { + switch (line.charAt(i2)) { case CODE_QUOTE: - readOffset = i + 1; + readOffset = i2 + 1; currentState = STATE_QUOTE; break; case this.delimiter: - readOffset = i + 1; + readOffset = i2 + 1; if (this.delimiter === " " && this.delimWhitespace) { break; } @@ -40333,22 +40333,22 @@ var CSVDataset = class extends Dataset { break; default: currentState = STATE_FIELD; - readOffset = i; + readOffset = i2; break; } break; case STATE_FIELD: - switch (line.charAt(i)) { + switch (line.charAt(i2)) { case this.delimiter: - result.push(line.substring(readOffset, i)); + result.push(line.substring(readOffset, i2)); currentState = STATE_OUT; - readOffset = i + 1; + readOffset = i2 + 1; break; default: } break; case STATE_QUOTE: - switch (line.charAt(i)) { + switch (line.charAt(i2)) { case CODE_QUOTE: currentState = STATE_QUOTE_AFTER_QUOTE; break; @@ -40356,11 +40356,11 @@ var CSVDataset = class extends Dataset { } break; case STATE_QUOTE_AFTER_QUOTE: - switch (line.charAt(i)) { + switch (line.charAt(i2)) { case this.delimiter: - result.push(line.substring(readOffset, i - 1)); + result.push(line.substring(readOffset, i2 - 1)); currentState = STATE_OUT; - readOffset = i + 1; + readOffset = i2 + 1; break; case CODE_QUOTE: currentState = STATE_QUOTE; @@ -40371,7 +40371,7 @@ var CSVDataset = class extends Dataset { } break; case STATE_WITHIN_QUOTE_IN_QUOTE: - switch (line.charAt(i)) { + switch (line.charAt(i2)) { case CODE_QUOTE: currentState = STATE_QUOTE; break; @@ -40430,8 +40430,8 @@ var MicrophoneIterator = class extends LazyIterator { audio: this.audioTrackConstraints == null ? true : this.audioTrackConstraints, video: false }); - } catch (e) { - throw new Error(`Error thrown while initializing video stream: ${e.message}`); + } catch (e2) { + throw new Error(`Error thrown while initializing video stream: ${e2.message}`); } if (!this.stream) { throw new Error("Could not obtain audio from microphone."); @@ -40518,7 +40518,7 @@ var MicrophoneIterator = class extends LazyIterator { flattenQueue(queue) { const frameSize = queue[0].length; const freqData = new Float32Array(queue.length * frameSize); - queue.forEach((data, i) => freqData.set(data, i * frameSize)); + queue.forEach((data, i2) => freqData.set(data, i2 * frameSize)); return freqData; } getTensorFromAudioDataArray(freqData, shape) { @@ -40583,9 +40583,9 @@ var WebcamIterator = class extends LazyIterator { height: this.webcamVideoElement.height } }); - } catch (e) { - e.message = `Error thrown while initializing video stream: ${e.message}`; - throw e; + } catch (e2) { + e2.message = `Error thrown while initializing video stream: ${e2.message}`; + throw e2; } if (!this.stream) { throw new Error("Could not obtain video from webcam."); @@ -40611,14 +40611,14 @@ var WebcamIterator = class extends LazyIterator { let img; try { img = browser_exports.fromPixels(this.webcamVideoElement); - } catch (e) { - throw new Error(`Error thrown converting video to pixels: ${JSON.stringify(e)}`); + } catch (e2) { + throw new Error(`Error thrown converting video to pixels: ${JSON.stringify(e2)}`); } if (this.resize) { try { return { value: this.cropAndResizeFrame(img), done: false }; - } catch (e) { - throw new Error(`Error thrown cropping the video: ${e.message}`); + } catch (e2) { + throw new Error(`Error thrown cropping the video: ${e2.message}`); } finally { img.dispose(); } @@ -40890,9 +40890,9 @@ function assertNotComplex(tensor2, opName) { if (!Array.isArray(tensor2)) { tensor2 = [tensor2]; } - tensor2.forEach((t) => { - if (t != null) { - util_exports.assert(t.dtype !== "complex64", () => `${opName} does not support complex64 tensors in the CPU backend.`); + tensor2.forEach((t2) => { + if (t2 != null) { + util_exports.assert(t2.dtype !== "complex64", () => `${opName} does not support complex64 tensors in the CPU backend.`); } }); } @@ -40963,17 +40963,17 @@ var MathBackendCPU = class extends KernelBackend { } return this.data.get(dataId).values; } - bufferSync(t) { - const data = this.readSync(t.dataId); - if (t.dtype === "string") { + bufferSync(t2) { + const data = this.readSync(t2.dataId); + if (t2.dtype === "string") { try { const strings = data.map((d) => util_exports.decodeString(d)); - return buffer(t.shape, t.dtype, strings); + return buffer(t2.shape, t2.dtype, strings); } catch (_a) { throw new Error("Failed to decode encoded string bytes into utf-8"); } } - return buffer(t.shape, t.dtype, data); + return buffer(t2.shape, t2.dtype, data); } makeOutput(values, shape, dtype) { return engine().makeTensorFromTensorInfo(this.makeTensorInfo(shape, dtype, values), this); @@ -41072,8 +41072,8 @@ __export2(shared_exports, { }); function simpleAbsImpl(vals) { const resultValues = new Float32Array(vals.length); - for (let i = 0; i < vals.length; ++i) { - resultValues[i] = Math.abs(vals[i]); + for (let i2 = 0; i2 < vals.length; ++i2) { + resultValues[i2] = Math.abs(vals[i2]); } return resultValues; } @@ -41105,19 +41105,19 @@ function createSimpleBinaryKernelImpl(op2) { const aBroadcastDims = backend_util_exports.getBroadcastDims(aShape, newShape); const bBroadcastDims = backend_util_exports.getBroadcastDims(bShape, newShape); if (aBroadcastDims.length + bBroadcastDims.length === 0) { - for (let i = 0; i < result.length; ++i) { - result[i] = op2(aVals[i % aVals.length], bVals[i % bVals.length]); + for (let i2 = 0; i2 < result.length; ++i2) { + result[i2] = op2(aVals[i2 % aVals.length], bVals[i2 % bVals.length]); } } else { - for (let i = 0; i < result.length; ++i) { - const loc = util_exports.indexToLoc(i, resultRank, resultStrides); + for (let i2 = 0; i2 < result.length; ++i2) { + const loc = util_exports.indexToLoc(i2, resultRank, resultStrides); const aLoc = loc.slice(-aRank); aBroadcastDims.forEach((d) => aLoc[d] = 0); const aIndex = util_exports.locToIndex(aLoc, aRank, aStrides); const bLoc = loc.slice(-bRank); bBroadcastDims.forEach((d) => bLoc[d] = 0); const bIndex = util_exports.locToIndex(bLoc, bRank, bStrides); - result[i] = op2(aVals[aIndex], bVals[bIndex]); + result[i2] = op2(aVals[aIndex], bVals[bIndex]); } } return [result, newShape]; @@ -41282,16 +41282,16 @@ function createComplexBinaryKernelImpl(op2) { const bRank = bShape.length; const bStrides = util_exports.computeStrides(bShape); if (aBroadcastDims.length + bBroadcastDims.length === 0) { - for (let i = 0; i < resultRealVals.length; i++) { - const aIdx = i % aVals.length; - const bIdx = i % bVals.length; + for (let i2 = 0; i2 < resultRealVals.length; i2++) { + const aIdx = i2 % aVals.length; + const bIdx = i2 % bVals.length; const result = op2(aVals[aIdx * 2], aVals[aIdx * 2 + 1], bVals[bIdx * 2], bVals[bIdx * 2 + 1]); - resultRealVals[i] = result.real; - resultImagVals[i] = result.imag; + resultRealVals[i2] = result.real; + resultImagVals[i2] = result.imag; } } else { - for (let i = 0; i < resultRealVals.length; i++) { - const loc = util_exports.indexToLoc(i, resultRank, resultStrides); + for (let i2 = 0; i2 < resultRealVals.length; i2++) { + const loc = util_exports.indexToLoc(i2, resultRank, resultStrides); const aLoc = loc.slice(-aRank); aBroadcastDims.forEach((d) => aLoc[d] = 0); const aIndex = util_exports.locToIndex(aLoc, aRank, aStrides); @@ -41299,8 +41299,8 @@ function createComplexBinaryKernelImpl(op2) { bBroadcastDims.forEach((d) => bLoc[d] = 0); const bIndex = util_exports.locToIndex(bLoc, bRank, bStrides); const opResult = op2(aVals[aIndex * 2], aVals[aIndex * 2 + 1], bVals[bIndex * 2], bVals[bIndex * 2 + 1]); - resultRealVals[i] = opResult.real; - resultImagVals[i] = opResult.imag; + resultRealVals[i2] = opResult.real; + resultImagVals[i2] = opResult.imag; } } return [resultRealVals, resultImagVals, resultShape]; @@ -41319,8 +41319,8 @@ var addConfig = { function bincountImpl(xVals, weightsVals, weightsDtype, weightsShape, size2) { const weightsSize = util_exports.sizeFromShape(weightsShape); const outVals = util_exports.makeZerosTypedArray(size2, weightsDtype); - for (let i = 0; i < xVals.length; i++) { - const value = xVals[i]; + for (let i2 = 0; i2 < xVals.length; i2++) { + const value = xVals[i2]; if (value < 0) { throw new Error("Input x must be non-negative!"); } @@ -41328,7 +41328,7 @@ function bincountImpl(xVals, weightsVals, weightsDtype, weightsShape, size2) { continue; } if (weightsSize > 0) { - outVals[value] += weightsVals[i]; + outVals[value] += weightsVals[i2]; } else { outVals[value] += 1; } @@ -41339,9 +41339,9 @@ function bincountReduceImpl(xBuf, weightsBuf, size2, binaryOutput = false) { const numRows = xBuf.shape[0]; const numCols = xBuf.shape[1]; const outBuf = buffer([numRows, size2], weightsBuf.dtype); - for (let i = 0; i < numRows; i++) { + for (let i2 = 0; i2 < numRows; i2++) { for (let j = 0; j < numCols; j++) { - const value = xBuf.get(i, j); + const value = xBuf.get(i2, j); if (value < 0) { throw new Error("Input x must be non-negative!"); } @@ -41349,12 +41349,12 @@ function bincountReduceImpl(xBuf, weightsBuf, size2, binaryOutput = false) { continue; } if (binaryOutput) { - outBuf.set(1, i, value); + outBuf.set(1, i2, value); } else { if (weightsBuf.size > 0) { - outBuf.set(outBuf.get(i, value) + weightsBuf.get(i, j), i, value); + outBuf.set(outBuf.get(i2, value) + weightsBuf.get(i2, j), i2, value); } else { - outBuf.set(outBuf.get(i, value) + 1, i, value); + outBuf.set(outBuf.get(i2, value) + 1, i2, value); } } } @@ -41364,8 +41364,8 @@ function bincountReduceImpl(xBuf, weightsBuf, size2, binaryOutput = false) { function createSimpleUnaryImpl(op2) { return (values, dtype, attrs) => { const newValues = util_exports.getTypedArrayFromDType(dtype, values.length); - for (let i = 0; i < values.length; ++i) { - newValues[i] = op2(values[i], attrs); + for (let i2 = 0; i2 < values.length; ++i2) { + newValues[i2] = op2(values[i2], attrs); } return newValues; }; @@ -41382,8 +41382,8 @@ function unaryKernelFunc(name, op2, dtype) { const xSize = util_exports.sizeFromShape(x.shape); const $dtype = dtype || x.dtype; const newValues = util_exports.getArrayFromDType($dtype, xSize); - for (let i = 0; i < xSize; ++i) { - newValues[i] = op2(values[i], attrs); + for (let i2 = 0; i2 < xSize; ++i2) { + newValues[i2] = op2(values[i2], attrs); } return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues); }; @@ -41464,11 +41464,11 @@ var floorConfig = { }; function gatherNdImpl(indicesData, paramsBuf, dtype, numSlices, sliceRank, sliceSize, strides2, paramsShape, paramsSize) { const outBuf = buffer([numSlices, sliceSize], dtype); - for (let i = 0; i < numSlices; i++) { + for (let i2 = 0; i2 < numSlices; i2++) { const index2 = []; let flattenIndex = 0; for (let j = 0; j < sliceRank; j++) { - const dim = indicesData[i * sliceRank + j]; + const dim = indicesData[i2 * sliceRank + j]; flattenIndex += dim * strides2[j]; index2.push(dim); } @@ -41476,15 +41476,15 @@ function gatherNdImpl(indicesData, paramsBuf, dtype, numSlices, sliceRank, slice throw new Error(`Invalid indices: ${index2} does not index into ${paramsShape}`); } for (let k = 0; k < sliceSize; k++) { - outBuf.values[i * sliceSize + k] = paramsBuf.get(...paramsBuf.indexToLoc(flattenIndex * sliceSize + k)); + outBuf.values[i2 * sliceSize + k] = paramsBuf.get(...paramsBuf.indexToLoc(flattenIndex * sliceSize + k)); } } return outBuf; } function gatherV2Impl(xBuf, indicesBuf, flattenOutputShape) { const outBuf = buffer(flattenOutputShape, xBuf.dtype); - for (let i = 0; i < outBuf.size; ++i) { - const newLoc = outBuf.indexToLoc(i); + for (let i2 = 0; i2 < outBuf.size; ++i2) { + const newLoc = outBuf.indexToLoc(i2); const originalLoc = newLoc.slice(); const batchIdx = originalLoc[0]; const indicesIdx = originalLoc[2]; @@ -41492,7 +41492,7 @@ function gatherV2Impl(xBuf, indicesBuf, flattenOutputShape) { originalLoc[2] = indicesBuf.values[indicesIndex]; const originalIndex = xBuf.locToIndex(originalLoc); if (0 <= originalIndex && originalIndex < xBuf.values.length) { - outBuf.values[i] = xBuf.values[originalIndex]; + outBuf.values[i2] = xBuf.values[originalIndex]; } } return outBuf; @@ -41529,8 +41529,8 @@ function linSpaceImpl(start, stop, num) { const step5 = (stop - start) / (num - 1); const values = util_exports.makeZerosTypedArray(num, "float32"); values[0] = start; - for (let i = 1; i < values.length; i++) { - values[i] = values[i - 1] + step5; + for (let i2 = 1; i2 < values.length; i2++) { + values[i2] = values[i2 - 1] + step5; } return values; } @@ -41543,8 +41543,8 @@ var logConfig = { }; function maxImpl(aVals, reduceSize, outShape, dtype) { const vals = util_exports.getTypedArrayFromDType(dtype, util_exports.sizeFromShape(outShape)); - for (let i = 0; i < vals.length; ++i) { - const offset = i * reduceSize; + for (let i2 = 0; i2 < vals.length; ++i2) { + const offset = i2 * reduceSize; let max7 = aVals[offset]; for (let j = 0; j < reduceSize; ++j) { const value = aVals[offset + j]; @@ -41552,7 +41552,7 @@ function maxImpl(aVals, reduceSize, outShape, dtype) { max7 = value; } } - vals[i] = max7; + vals[i2] = max7; } return vals; } @@ -41613,14 +41613,14 @@ function transposeImpl(xVals, xShape, dtype, perm, newShape) { const xStrides = util_exports.computeStrides(xShape); const newStrides = util_exports.computeStrides(newShape); const result = util_exports.getTypedArrayFromDType(dtype, util_exports.sizeFromShape(newShape)); - for (let i = 0; i < xSize; ++i) { - const loc = util_exports.indexToLoc(i, xRank, xStrides); + for (let i2 = 0; i2 < xSize; ++i2) { + const loc = util_exports.indexToLoc(i2, xRank, xStrides); const newLoc = new Array(loc.length); - for (let i2 = 0; i2 < newLoc.length; i2++) { - newLoc[i2] = loc[perm[i2]]; + for (let i3 = 0; i3 < newLoc.length; i3++) { + newLoc[i3] = loc[perm[i3]]; } const newIndex = util_exports.locToIndex(newLoc, xRank, newStrides); - result[newIndex] = xVals[i]; + result[newIndex] = xVals[i2]; } return result; } @@ -41631,8 +41631,8 @@ function transpose2(args) { assertNotComplex(x, "transpose"); const xRank = x.shape.length; const newShape = new Array(xRank); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = x.shape[perm[i]]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = x.shape[perm[i2]]; } const values = backend2.data.get(x.dataId).values; const result = transposeImpl(values, x.shape, x.dtype, perm, newShape); @@ -41649,13 +41649,13 @@ function prodImpl(xShape, xDtype, xVals, reductionAxes) { const outDtype = upcastType(xDtype, "int32"); const outVals = util_exports.makeZerosTypedArray(util_exports.sizeFromShape(outShape), outDtype); const reduceSize = util_exports.sizeFromShape(reduceShape); - for (let i = 0; i < outVals.length; ++i) { - const offset = i * reduceSize; + for (let i2 = 0; i2 < outVals.length; ++i2) { + const offset = i2 * reduceSize; let prod6 = 1; for (let j = 0; j < reduceSize; ++j) { prod6 *= xVals[offset + j]; } - outVals[i] = prod6; + outVals[i2] = prod6; } return { outVals, outShape, outDtype }; } @@ -41681,7 +41681,7 @@ function prod2(args) { if (keepDims) { resultShape = backend_util_exports.expandShapeToKeepDim(outShape, axes); } - intermediateTensorInfos.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediateTensorInfos.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return backend2.makeTensorInfo(resultShape, outDtype, outVals); } var prodConfig = { @@ -41702,8 +41702,8 @@ function rangeImpl(start, stop, step5, dtype) { step5 = -1; } values[0] = start; - for (let i = 1; i < values.length; i++) { - values[i] = values[i - 1] + step5; + for (let i2 = 1; i2 < values.length; i2++) { + values[i2] = values[i2 - 1] + step5; } return values; } @@ -41729,11 +41729,11 @@ function scatterImpl(indices, updates, shape, outputSize2, sliceSize, numUpdates } else if (typeof defaultValue === "boolean") { outBuf.values.fill(+defaultValue); } - for (let i = 0; i < numUpdates; i++) { + for (let i2 = 0; i2 < numUpdates; i2++) { const index2 = []; let flattenIndex = 0; for (let j = 0; j < sliceRank; j++) { - const dim = indicesData[i * sliceRank + j]; + const dim = indicesData[i2 * sliceRank + j]; index2.push(dim); flattenIndex += dim * strides2[j]; } @@ -41742,9 +41742,9 @@ function scatterImpl(indices, updates, shape, outputSize2, sliceSize, numUpdates } for (let k = 0; k < sliceSize; k++) { if (sumDupeIndices) { - outBuf.values[flattenIndex * sliceSize + k] += updatesData[i * sliceSize + k]; + outBuf.values[flattenIndex * sliceSize + k] += updatesData[i2 * sliceSize + k]; } else { - outBuf.values[flattenIndex * sliceSize + k] = updates.rank === 0 ? updatesData[0] : updatesData[i * sliceSize + k]; + outBuf.values[flattenIndex * sliceSize + k] = updates.rank === 0 ? updatesData[0] : updatesData[i2 * sliceSize + k]; } } } @@ -41771,8 +41771,8 @@ function sliceImpl(vals, begin, size2, shape, dtype) { const decodedData = dtype === "string" ? backend_util_exports.fromUint8ToStringArray(vals) : vals; const inBuf = buffer(shape, dtype, decodedData); const outBuf = buffer(size2, dtype); - for (let i = 0; i < outBuf.size; ++i) { - const outLoc = outBuf.indexToLoc(i); + for (let i2 = 0; i2 < outBuf.size; ++i2) { + const outLoc = outBuf.indexToLoc(i2); const inLoc = outLoc.map((idx, j) => idx + begin[j]); outBuf.set(inBuf.get(...inLoc), ...outLoc); } @@ -41820,13 +41820,13 @@ function sparseFillEmptyRowsImpl(indices, indicesShape, indicesDType, values, va let rowsAreOrdered = true; let lastIndicesRow = 0; const csrOffset = new Array(denseRows).fill(0); - for (let i = 0; i < indicesCount; ++i) { - const row = indices[i * rank]; + for (let i2 = 0; i2 < indicesCount; ++i2) { + const row = indices[i2 * rank]; if (row < 0) { - throw new Error(backend_util_exports.getSparseFillEmptyRowsNegativeIndexErrorMessage(i, row)); + throw new Error(backend_util_exports.getSparseFillEmptyRowsNegativeIndexErrorMessage(i2, row)); } if (row >= denseRows) { - throw new Error(backend_util_exports.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(i, row, denseRows)); + throw new Error(backend_util_exports.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(i2, row, denseRows)); } ++csrOffset[row]; rowsAreOrdered = rowsAreOrdered && row >= lastIndicesRow; @@ -41845,8 +41845,8 @@ function sparseFillEmptyRowsImpl(indices, indicesShape, indicesDType, values, va if (allRowsFull && rowsAreOrdered) { const outputIndices = indices; const outputValues = values; - for (let i = 0; i < indicesCount; ++i) { - reverseIndexMap[i] = i; + for (let i2 = 0; i2 < indicesCount; ++i2) { + reverseIndexMap[i2] = i2; } return [ outputIndices, @@ -41860,16 +41860,16 @@ function sparseFillEmptyRowsImpl(indices, indicesShape, indicesDType, values, va const outputIndices = util_exports.getArrayFromDType(indicesDType, fullIndicesCount * rank); const outputValues = util_exports.getArrayFromDType(valuesDType, fullIndicesCount); const filledCount = new Array(denseRows).fill(0); - for (let i = 0; i < indicesCount; ++i) { - const row = indices[i * rank]; + for (let i2 = 0; i2 < indicesCount; ++i2) { + const row = indices[i2 * rank]; const offset = filledCount[row]; const outputI = (row === 0 ? 0 : csrOffset[row - 1]) + offset; filledCount[row]++; for (let j = 0; j < rank; ++j) { - outputIndices[outputI * rank + j] = indices[i * rank + j]; + outputIndices[outputI * rank + j] = indices[i2 * rank + j]; } - outputValues[outputI] = values[i]; - reverseIndexMap[i] = outputI; + outputValues[outputI] = values[i2]; + reverseIndexMap[i2] = outputI; } for (let row = 0; row < denseRows; ++row) { const rowCount = filledCount[row]; @@ -41944,13 +41944,13 @@ function sparseReshapeImpl(inputIndices, inputIndicesShape, inputDType, inputSha } } const newIndices = util_exports.getArrayFromDType(inputDType, nnz * outputRank); - for (let i = 0; i < nnz; ++i) { + for (let i2 = 0; i2 < nnz; ++i2) { let id = 0; for (let j = 0; j < inputRank; ++j) { - id += inputIndices[i * inputRank + j] * inputStrides[j]; + id += inputIndices[i2 * inputRank + j] * inputStrides[j]; } for (let j = 0; j < outputRank; ++j) { - newIndices[i * outputRank + j] = Math.trunc(id / outputStrides[j]); + newIndices[i2 * outputRank + j] = Math.trunc(id / outputStrides[j]); id %= outputStrides[j]; } } @@ -41999,10 +41999,10 @@ function sparseSegmentReductionImpl(input2, inputShape, inputDType, indices, seg if (outIndex > uninitializedIndex) { output.fill(defaultValue, uninitializedIndex * numCol, outIndex * numCol); } - for (let i = start; i < end; ++i) { - const index2 = indices[i]; + for (let i2 = start; i2 < end; ++i2) { + const index2 = indices[i2]; if (index2 < 0 || index2 >= inputFlat[0]) { - throw new Error(backend_util_exports.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(i, indices[i], inputFlat[0])); + throw new Error(backend_util_exports.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(i2, indices[i2], inputFlat[0])); } for (let j = 0; j < numCol; j++) { output[outIndex * numCol + j] += input2[index2 * numCol + j]; @@ -42045,8 +42045,8 @@ var squaredDifferenceConfig = { }; function stridedSliceImpl(outShape, xBuf, strides2, begin) { const outBuf = buffer(outShape, xBuf.dtype); - for (let i = 0; i < outBuf.size; i++) { - const loc = outBuf.indexToLoc(i); + for (let i2 = 0; i2 < outBuf.size; i2++) { + const loc = outBuf.indexToLoc(i2); const newLoc = new Array(loc.length); for (let j = 0; j < newLoc.length; j++) { newLoc[j] = loc[j] * strides2[j] + begin[j]; @@ -42080,8 +42080,8 @@ var StringNGramsOp = class { const dataStartIndex = splitIndex + (leftPadding > 0 ? 0 : nGramIndex - padWidth); let nGramSize = 0; nGramSize += leftPadding * this.leftPad.length; - for (let n = 0; n < numTokens; ++n) { - nGramSize += data[dataStartIndex + n].length; + for (let n2 = 0; n2 < numTokens; ++n2) { + nGramSize += data[dataStartIndex + n2].length; } nGramSize += rightPadding * this.rightPad.length; const numSeparators = leftPadding + rightPadding + numTokens - 1; @@ -42090,22 +42090,22 @@ var StringNGramsOp = class { const nGram = output[outputStartIndex + nGramIndex]; let nextNGramIndex = 0; const appendToNGram = (str) => str.forEach((value) => nGram[nextNGramIndex++] = value); - for (let n = 0; n < leftPadding; ++n) { + for (let n2 = 0; n2 < leftPadding; ++n2) { appendToNGram(this.leftPad); appendToNGram(this.separator); } - for (let n = 0; n < numTokens - 1; ++n) { - appendToNGram(data[dataStartIndex + n]); + for (let n2 = 0; n2 < numTokens - 1; ++n2) { + appendToNGram(data[dataStartIndex + n2]); appendToNGram(this.separator); } if (numTokens > 0) { appendToNGram(data[dataStartIndex + numTokens - 1]); - for (let n = 0; n < rightPadding; ++n) { + for (let n2 = 0; n2 < rightPadding; ++n2) { appendToNGram(this.separator); appendToNGram(this.rightPad); } } else { - for (let n = 0; n < rightPadding - 1; ++n) { + for (let n2 = 0; n2 < rightPadding - 1; ++n2) { appendToNGram(this.rightPad); appendToNGram(this.separator); } @@ -42121,13 +42121,13 @@ var StringNGramsOp = class { if (prevSplit !== 0) { throw new Error(`First split value must be 0, got ${prevSplit}`); } - for (let i = 1; i < splitsSize; ++i) { - let validSplits = splits[i] >= prevSplit; - validSplits = validSplits && splits[i] <= inputDataSize; + for (let i2 = 1; i2 < splitsSize; ++i2) { + let validSplits = splits[i2] >= prevSplit; + validSplits = validSplits && splits[i2] <= inputDataSize; if (!validSplits) { - throw new Error(`Invalid split value ${splits[i]}, must be in [${prevSplit}, ${inputDataSize}]`); + throw new Error(`Invalid split value ${splits[i2]}, must be in [${prevSplit}, ${inputDataSize}]`); } - prevSplit = splits[i]; + prevSplit = splits[i2]; } if (prevSplit !== inputDataSize) { throw new Error(`Last split value must be data size. Expected ${inputDataSize}, got ${prevSplit}`); @@ -42137,14 +42137,14 @@ var StringNGramsOp = class { const nGramsSplits = util_exports.getArrayFromDType("int32", splitsSize); if (inputDataSize === 0 || splitsSize === 0) { const empty = new Array(inputDataSize); - for (let i = 0; i <= numBatchItems; ++i) { - nGramsSplits[i] = 0; + for (let i2 = 0; i2 <= numBatchItems; ++i2) { + nGramsSplits[i2] = 0; } return [empty, nGramsSplits]; } nGramsSplits[0] = 0; - for (let i = 1; i <= numBatchItems; ++i) { - const length = splits[i] - splits[i - 1]; + for (let i2 = 1; i2 <= numBatchItems; ++i2) { + const length = splits[i2] - splits[i2 - 1]; let numNGrams = 0; this.nGramWidths.forEach((nGramWidth) => { numNGrams += this.getNumNGrams(length, nGramWidth); @@ -42152,20 +42152,20 @@ var StringNGramsOp = class { if (this.preserveShort && length > 0 && numNGrams === 0) { numNGrams = 1; } - nGramsSplits[i] = nGramsSplits[i - 1] + numNGrams; + nGramsSplits[i2] = nGramsSplits[i2 - 1] + numNGrams; } const nGrams = new Array(nGramsSplits[numBatchItems]); - for (let i = 0; i < numBatchItems; ++i) { - const splitIndex = splits[i]; - let outputStartIdx = nGramsSplits[i]; + for (let i2 = 0; i2 < numBatchItems; ++i2) { + const splitIndex = splits[i2]; + let outputStartIdx = nGramsSplits[i2]; this.nGramWidths.forEach((nGramWidth) => { - const length = splits[i + 1] - splits[i]; + const length = splits[i2 + 1] - splits[i2]; const numNGrams = this.getNumNGrams(length, nGramWidth); this.createNGrams(data, splitIndex, nGrams, outputStartIdx, numNGrams, nGramWidth); outputStartIdx += numNGrams; }); - if (this.preserveShort && outputStartIdx === nGramsSplits[i]) { - const dataLength = splits[i + 1] - splits[i]; + if (this.preserveShort && outputStartIdx === nGramsSplits[i2]) { + const dataLength = splits[i2 + 1] - splits[i2]; if (dataLength === 0) { continue; } @@ -42185,8 +42185,8 @@ function split3(str, delimiters, skipEmpty, result) { return; } if (delimiters.length === 0) { - for (let i = 0; i < str.length; ++i) { - result.push(str.subarray(i, i + 1)); + for (let i2 = 0; i2 < str.length; ++i2) { + result.push(str.subarray(i2, i2 + 1)); } return; } @@ -42207,13 +42207,13 @@ function split3(str, delimiters, skipEmpty, result) { return; } let tokenStart = 0; - for (let i = 0; i < str.length + 1; i++) { - if (i === str.length || delimiters.indexOf(str[i]) !== -1) { - const token = str.subarray(tokenStart, i); + for (let i2 = 0; i2 < str.length + 1; i2++) { + if (i2 === str.length || delimiters.indexOf(str[i2]) !== -1) { + const token = str.subarray(tokenStart, i2); if (!skipEmpty || token.length !== 0) { result.push(token); } - tokenStart = i + 1; + tokenStart = i2 + 1; } } } @@ -42223,11 +42223,11 @@ function stringSplitImpl(input2, delimiter, skipEmpty) { let outputSize2 = 0; let maxNumEntries = 0; const numIndices = new Array(batchSize); - for (let i = 0; i < batchSize; ++i) { + for (let i2 = 0; i2 < batchSize; ++i2) { const prevTokensLength = tokens.length; - split3(input2[i], delimiter, skipEmpty, tokens); + split3(input2[i2], delimiter, skipEmpty, tokens); const nEntries = tokens.length - prevTokensLength; - numIndices[i] = nEntries; + numIndices[i2] = nEntries; outputSize2 += nEntries; maxNumEntries = Math.max(maxNumEntries, nEntries); } @@ -42235,9 +42235,9 @@ function stringSplitImpl(input2, delimiter, skipEmpty) { const values = new Array(outputSize2); const shape = [batchSize, maxNumEntries]; let c = 0; - for (let i = 0; i < batchSize; ++i) { - for (let j = 0; j < numIndices[i]; ++j) { - indices[c * 2] = i; + for (let i2 = 0; i2 < batchSize; ++i2) { + for (let j = 0; j < numIndices[i2]; ++j) { + indices[c * 2] = i2; indices[c * 2 + 1] = j; values[c] = tokens[c]; ++c; @@ -42247,8 +42247,8 @@ function stringSplitImpl(input2, delimiter, skipEmpty) { } function stringToHashBucketFastImpl(input2, numBuckets) { const output = util_exports.getArrayFromDType("int32", input2.length); - for (let i = 0; i < input2.length; ++i) { - output[i] = util_exports.fingerPrint64(input2[i]).modulo(numBuckets).getLowBitsUnsigned(); + for (let i2 = 0; i2 < input2.length; ++i2) { + output[i2] = util_exports.fingerPrint64(input2[i2]).modulo(numBuckets).getLowBitsUnsigned(); } return output; } @@ -42264,18 +42264,18 @@ var subConfig = { }; function tileImpl(xBuf, reps) { const newShape = new Array(xBuf.rank); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = xBuf.shape[i] * reps[i]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = xBuf.shape[i2] * reps[i2]; } const result = buffer(newShape, xBuf.dtype); - for (let i = 0; i < result.values.length; ++i) { - const newLoc = result.indexToLoc(i); + for (let i2 = 0; i2 < result.values.length; ++i2) { + const newLoc = result.indexToLoc(i2); const originalLoc = new Array(xBuf.rank); for (let j = 0; j < originalLoc.length; j++) { originalLoc[j] = newLoc[j] % xBuf.shape[j]; } const originalIndex = xBuf.locToIndex(originalLoc); - result.values[i] = xBuf.values[originalIndex]; + result.values[i2] = xBuf.values[originalIndex]; } return result; } @@ -42286,34 +42286,34 @@ var comparePair = (a, b) => { function select(array2, k, left = 0, right = array2.length - 1) { while (right > left) { if (right - left > 600) { - const n = right - left + 1; - const i2 = k - left + 1; - const z = Math.log(n); - const s = 0.5 * Math.exp(2 * z / 3); - const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * Math.sign(i2 - n / 2); - const newLeft = Math.max(left, Math.floor(k - i2 * s / n + sd)); - const newRight = Math.min(right, Math.floor(k + (n - i2) * s / n + sd)); + const n2 = right - left + 1; + const i3 = k - left + 1; + const z = Math.log(n2); + const s2 = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s2 * (n2 - s2) / n2) * Math.sign(i3 - n2 / 2); + const newLeft = Math.max(left, Math.floor(k - i3 * s2 / n2 + sd)); + const newRight = Math.min(right, Math.floor(k + (n2 - i3) * s2 / n2 + sd)); select(array2, k, newLeft, newRight); } - const t = array2[k]; - let i = left; + const t2 = array2[k]; + let i2 = left; let j = right; util_exports.swap(array2, left, k); - if (comparePair(array2[right], t) > 0) { + if (comparePair(array2[right], t2) > 0) { util_exports.swap(array2, left, right); } - while (i < j) { - util_exports.swap(array2, i, j); - i++; + while (i2 < j) { + util_exports.swap(array2, i2, j); + i2++; j--; - while (comparePair(array2[i], t) < 0) { - i = i + 1; + while (comparePair(array2[i2], t2) < 0) { + i2 = i2 + 1; } - while (comparePair(array2[j], t) > 0) { + while (comparePair(array2[j], t2) > 0) { j = j - 1; } } - if (comparePair(array2[left], t) === 0) { + if (comparePair(array2[left], t2) === 0) { util_exports.swap(array2, left, j); } else { j = j + 1; @@ -42347,9 +42347,9 @@ function topKImpl(x, xShape, xDtype, k, sorted) { const outOffset = b * k; const topKVals = allTopKVals.subarray(outOffset, outOffset + k); const topKIndices = allTopKIndices.subarray(outOffset, outOffset + k); - for (let i = 0; i < k; i++) { - topKVals[i] = valAndInd[i].value; - topKIndices[i] = valAndInd[i].index; + for (let i2 = 0; i2 < k; i2++) { + topKVals[i2] = valAndInd[i2].value; + topKIndices[i2] = valAndInd[i2].index; } } const outputShape = xShape.slice(); @@ -42362,47 +42362,47 @@ function topKImpl(x, xShape, xDtype, k, sorted) { function uniqueImpl(values, axis, shape, dtype) { const $axis = util_exports.parseAxisParam(axis, shape)[0]; const newShape = [1, shape[0], 1]; - for (let i = 0; i < $axis; i++) { - newShape[0] *= shape[i]; + for (let i2 = 0; i2 < $axis; i2++) { + newShape[0] *= shape[i2]; } newShape[1] = shape[$axis]; - for (let i = $axis + 1; i < shape.length; i++) { - newShape[2] *= shape[i]; + for (let i2 = $axis + 1; i2 < shape.length; i2++) { + newShape[2] *= shape[i2]; } const uniqueElements = {}; const indices = new Int32Array(shape[$axis]); const inputBuffer = new TensorBuffer(newShape, dtype, values); const uniqueIndices = []; const is1DTensor = newShape[0] === 1 && newShape[2] === 1; - for (let i = 0; i < shape[$axis]; i++) { + for (let i2 = 0; i2 < shape[$axis]; i2++) { let element; if (is1DTensor) { - element = values[i].toString(); + element = values[i2].toString(); } else { const axisValues = []; for (let m = 0; m < newShape[0]; m++) { - for (let n = 0; n < newShape[2]; n++) { - axisValues.push(inputBuffer.get(m, i, n)); + for (let n2 = 0; n2 < newShape[2]; n2++) { + axisValues.push(inputBuffer.get(m, i2, n2)); } } element = axisValues.join(","); } if (uniqueElements[element] !== void 0) { - indices[i] = uniqueElements[element]; + indices[i2] = uniqueElements[element]; } else { const uniqueIndex = Object.keys(uniqueElements).length; uniqueElements[element] = uniqueIndex; - indices[i] = uniqueIndex; - uniqueIndices.push(i); + indices[i2] = uniqueIndex; + uniqueIndices.push(i2); } } const outputTmpShape = newShape.slice(); outputTmpShape[1] = Object.keys(uniqueElements).length; const outputBuffer = new TensorBuffer(outputTmpShape, dtype); - uniqueIndices.forEach((uniqueElementIndex, i) => { + uniqueIndices.forEach((uniqueElementIndex, i2) => { for (let m = 0; m < newShape[0]; m++) { - for (let n = 0; n < newShape[2]; n++) { - outputBuffer.set(inputBuffer.get(m, uniqueElementIndex, n), m, i, n); + for (let n2 = 0; n2 < newShape[2]; n2++) { + outputBuffer.set(inputBuffer.get(m, uniqueElementIndex, n2), m, i2, n2); } } }); @@ -42429,8 +42429,8 @@ function leakyRelu2(args) { const xSize = util_exports.sizeFromShape(x.shape); const xVals = backend2.data.get(x.dataId).values; const outVals = util_exports.getTypedArrayFromDType("float32", xSize); - for (let i = 0; i < xVals.length; i++) { - outVals[i] = xVals[i] < 0 ? alpha2 * xVals[i] : xVals[i]; + for (let i2 = 0; i2 < xVals.length; i2++) { + outVals[i2] = xVals[i2] < 0 ? alpha2 * xVals[i2] : xVals[i2]; } return backend2.makeTensorInfo(x.shape, "float32", outVals); } @@ -42550,17 +42550,17 @@ function batchMatMul(args) { const iBlock = Math.min(i0 + blockSize, leftDim); const jBlock = Math.min(j0 + blockSize, rightDim); const kBlock = Math.min(k02 + blockSize, sharedDim); - for (let i = i0; i < iBlock; i++) { + for (let i2 = i0; i2 < iBlock; i2++) { for (let j = j0; j < jBlock; j++) { let sum7 = 0; for (let k = k02; k < kBlock; k++) { const batchOffsetA = Math.min(bi, batchDimA - 1) * aBatch; const batchOffsetB = Math.min(bi, batchDimB - 1) * bBatch; - const aVal = a3dValues[batchOffsetA + i * aOuterStep + k * aInnerStep]; + const aVal = a3dValues[batchOffsetA + i2 * aOuterStep + k * aInnerStep]; const bVal = b3dValues[k * bInnerStep + j * bOuterStep + batchOffsetB]; sum7 += aVal * bVal; } - resVals[bi * size2 + (i * rightDim + j)] += sum7; + resVals[bi * size2 + (i2 * rightDim + j)] += sum7; } } } @@ -42596,8 +42596,8 @@ function _fusedMatMul(args) { intermediates.push(current); current = activationRes; } - for (const i of intermediates) { - backend2.disposeIntermediateTensorInfo(i); + for (const i2 of intermediates) { + backend2.disposeIntermediateTensorInfo(i2); } return current; } @@ -42622,11 +42622,11 @@ function addN2(args) { const { inputs, backend: backend2 } = args; const tensors = inputs; assertNotComplex(inputs, "addN"); - const vals = tensors.map((t) => backend2.data.get(t.dataId).values); + const vals = tensors.map((t2) => backend2.data.get(t2.dataId).values); const outBuf = buffer(tensors[0].shape, tensors[0].dtype); const outVals = outBuf.values; - for (let i = 0; i < tensors.length; i++) { - const currVals = vals[i]; + for (let i2 = 0; i2 < tensors.length; i2++) { + const currVals = vals[i2]; for (let j = 0; j < outVals.length; j++) { outVals[j] += currVals[j]; } @@ -42656,14 +42656,14 @@ function all2(args) { const reduceSize = util_exports.sizeFromShape(reduceShape); const vals = util_exports.makeZerosTypedArray(util_exports.sizeFromShape(outShape), $x.dtype); const aVals = backend2.data.get($x.dataId).values; - for (let i = 0; i < vals.length; ++i) { - const offset = i * reduceSize; + for (let i2 = 0; i2 < vals.length; ++i2) { + const offset = i2 * reduceSize; let all52 = aVals[offset]; for (let j = 0; j < reduceSize; ++j) { const value = aVals[offset + j]; all52 = all52 && value; } - vals[i] = all52; + vals[i2] = all52; } if (permutedAxes != null) { backend2.disposeIntermediateTensorInfo($x); @@ -42700,14 +42700,14 @@ function any2(args) { const reduceSize = util_exports.sizeFromShape(reduceShape); const vals = util_exports.makeZerosTypedArray(util_exports.sizeFromShape(outShape), $x.dtype); const aVals = backend2.data.get($x.dataId).values; - for (let i = 0; i < vals.length; ++i) { - const offset = i * reduceSize; + for (let i2 = 0; i2 < vals.length; ++i2) { + const offset = i2 * reduceSize; let anyVal = aVals[offset]; for (let j = 0; j < reduceSize; ++j) { const value = aVals[offset + j]; anyVal = anyVal || value; } - vals[i] = anyVal; + vals[i2] = anyVal; } if (permutedAxes != null) { backend2.disposeIntermediateTensorInfo($x); @@ -42747,8 +42747,8 @@ function argMax2(args) { const vals = util_exports.makeZerosTypedArray(outSize, "int32"); const reduceSize = util_exports.sizeFromShape(reduceShape); const aVals = backend2.data.get($x.dataId).values; - for (let i = 0; i < vals.length; ++i) { - const offset = i * reduceSize; + for (let i2 = 0; i2 < vals.length; ++i2) { + const offset = i2 * reduceSize; let max7 = aVals[offset]; let maxIndex = 0; for (let j = 0; j < reduceSize; ++j) { @@ -42758,9 +42758,9 @@ function argMax2(args) { maxIndex = j; } } - vals[i] = maxIndex; + vals[i2] = maxIndex; } - intermediateTensorInfos.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediateTensorInfos.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return backend2.makeTensorInfo(outShape, "int32", vals); } var argMaxConfig = { @@ -42789,8 +42789,8 @@ function argMin2(args) { const vals = util_exports.makeZerosTypedArray(outSize, "int32"); const reduceSize = util_exports.sizeFromShape(reduceShape); const aVals = backend2.data.get($x.dataId).values; - for (let i = 0; i < vals.length; ++i) { - const offset = i * reduceSize; + for (let i2 = 0; i2 < vals.length; ++i2) { + const offset = i2 * reduceSize; let min7 = aVals[offset]; let minIndex = 0; for (let j = 0; j < reduceSize; ++j) { @@ -42800,9 +42800,9 @@ function argMin2(args) { minIndex = j; } } - vals[i] = minIndex; + vals[i2] = minIndex; } - intermediateTensorInfos.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediateTensorInfos.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return backend2.makeTensorInfo(outShape, "int32", vals); } var argMinConfig = { @@ -43277,8 +43277,8 @@ function batchNorm2(args) { let mi = 0; let si = 0; let vi = 0; - for (let i = 0; i < xVals.length; ++i) { - outVals[i] = offVals[offi++] + (xVals[i] - mVals[mi++]) * sVals[si++] / Math.sqrt(varVals[vi++] + varianceEpsilon); + for (let i2 = 0; i2 < xVals.length; ++i2) { + outVals[i2] = offVals[offi++] + (xVals[i2] - mVals[mi++]) * sVals[si++] / Math.sqrt(varVals[vi++] + varianceEpsilon); if (offi >= offValsLength) { offi = 0; } @@ -43376,10 +43376,10 @@ var complexAbs = (args) => { const imag5 = complexVals.complexTensorInfos.imag; const realVals = cpuBackend.data.get(real5.dataId).values; const imagVals = cpuBackend.data.get(imag5.dataId).values; - for (let i = 0; i < realVals.length; i++) { - const real6 = realVals[i]; - const imag6 = imagVals[i]; - resultValues[i] = Math.hypot(real6, imag6); + for (let i2 = 0; i2 < realVals.length; i2++) { + const real6 = realVals[i2]; + const imag6 = imagVals[i2]; + resultValues[i2] = Math.hypot(real6, imag6); } return cpuBackend.makeOutput(resultValues, x.shape, "float32"); }; @@ -43404,42 +43404,42 @@ function concat2(args) { const { inputs, backend: backend2, attrs } = args; const { axis } = attrs; const $axis = util_exports.parseAxisParam(axis, inputs[0].shape)[0]; - let outShape = backend_util_exports.computeOutShape(inputs.map((t) => t.shape), $axis); + let outShape = backend_util_exports.computeOutShape(inputs.map((t2) => t2.shape), $axis); if (util_exports.sizeFromShape(outShape) === 0) { return backend2.makeTensorInfo(outShape, inputs[0].dtype, []); } - const $inputs = inputs.filter((t) => util_exports.sizeFromShape(t.shape) > 0); + const $inputs = inputs.filter((t2) => util_exports.sizeFromShape(t2.shape) > 0); if ($inputs.length === 1) { return identity2({ inputs: { x: $inputs[0] }, backend: backend2 }); } - const shapes = $inputs.map((t) => t.shape); + const shapes = $inputs.map((t2) => t2.shape); backend_util_exports.assertParamsConsistent(shapes, $axis); if ($inputs[0].dtype === "complex64") { - const reals = $inputs.map((t) => real2({ inputs: { input: t }, backend: backend2 })); - const imags = $inputs.map((t) => imag2({ inputs: { input: t }, backend: backend2 })); + const reals = $inputs.map((t2) => real2({ inputs: { input: t2 }, backend: backend2 })); + const imags = $inputs.map((t2) => imag2({ inputs: { input: t2 }, backend: backend2 })); const realConcated = concat2({ inputs: reals, backend: backend2, attrs: { axis: $axis } }); const imagConcated = concat2({ inputs: imags, backend: backend2, attrs: { axis: $axis } }); const result = complex2({ inputs: { real: realConcated, imag: imagConcated }, backend: backend2 }); - reals.forEach((r) => backend2.disposeIntermediateTensorInfo(r)); - imags.forEach((i) => backend2.disposeIntermediateTensorInfo(i)); + reals.forEach((r2) => backend2.disposeIntermediateTensorInfo(r2)); + imags.forEach((i2) => backend2.disposeIntermediateTensorInfo(i2)); backend2.disposeIntermediateTensorInfo(realConcated); backend2.disposeIntermediateTensorInfo(imagConcated); return result; } - const inputs2D = $inputs.map((t) => { - const innerSize = util_exports.sizeFromShape(t.shape.slice($axis)); + const inputs2D = $inputs.map((t2) => { + const innerSize = util_exports.sizeFromShape(t2.shape.slice($axis)); const shape = [-1, innerSize]; - return reshape3({ inputs: { x: t }, backend: backend2, attrs: { shape } }); + return reshape3({ inputs: { x: t2 }, backend: backend2, attrs: { shape } }); }); - const inputsValShapes = inputs2D.map((t) => { - return { vals: backend2.data.get(t.dataId).values, shape: t.shape }; + const inputsValShapes = inputs2D.map((t2) => { + return { vals: backend2.data.get(t2.dataId).values, shape: t2.shape }; }); - outShape = backend_util_exports.computeOutShape(inputs2D.map((t) => t.shape), 1); + outShape = backend_util_exports.computeOutShape(inputs2D.map((t2) => t2.shape), 1); const simplyConcat = inputs2D[0].shape[0] === 1; const outVals = concatImpl(inputsValShapes, outShape, inputs[0].dtype, simplyConcat); - const finalOutShape = backend_util_exports.computeOutShape($inputs.map((t) => t.shape), $axis); + const finalOutShape = backend_util_exports.computeOutShape($inputs.map((t2) => t2.shape), $axis); const outInfo = backend2.makeTensorInfo(finalOutShape, inputs[0].dtype, outVals); - inputs2D.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + inputs2D.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return outInfo; } var concatConfig = { @@ -43964,14 +43964,14 @@ function cumprod2(args) { const vals = util_exports.makeOnesTypedArray(util_exports.sizeFromShape($x.shape), resultDtype); const aVals = backend2.data.get($x.dataId).values; const finalDim = $x.shape[$x.shape.length - 1]; - const indexAdjuster = reverse5 ? (i, j) => i + finalDim - j - 1 : (i, j) => i + j; - for (let i = 0; i < aVals.length; i += finalDim) { + const indexAdjuster = reverse5 ? (i2, j) => i2 + finalDim - j - 1 : (i2, j) => i2 + j; + for (let i2 = 0; i2 < aVals.length; i2 += finalDim) { for (let j = 0; j < finalDim; j++) { - const idx = indexAdjuster(i, j); + const idx = indexAdjuster(i2, j); if (j === 0) { vals[idx] = exclusive ? 1 : aVals[idx]; } else { - const prevIdx = indexAdjuster(i, j - 1); + const prevIdx = indexAdjuster(i2, j - 1); vals[idx] = exclusive ? aVals[prevIdx] * vals[prevIdx] : aVals[idx] * vals[prevIdx]; } } @@ -44009,14 +44009,14 @@ function cumsum2(args) { const vals = util_exports.makeZerosTypedArray(util_exports.sizeFromShape($x.shape), resultDtype); const aVals = backend2.data.get($x.dataId).values; const finalDim = $x.shape[$x.shape.length - 1]; - const indexAdjuster = reverse5 ? (i, j) => i + finalDim - j - 1 : (i, j) => i + j; - for (let i = 0; i < aVals.length; i += finalDim) { + const indexAdjuster = reverse5 ? (i2, j) => i2 + finalDim - j - 1 : (i2, j) => i2 + j; + for (let i2 = 0; i2 < aVals.length; i2 += finalDim) { for (let j = 0; j < finalDim; j++) { - const idx = indexAdjuster(i, j); + const idx = indexAdjuster(i2, j); if (j === 0) { vals[idx] = exclusive ? 0 : aVals[idx]; } else { - const prevIdx = indexAdjuster(i, j - 1); + const prevIdx = indexAdjuster(i2, j - 1); vals[idx] = exclusive ? aVals[prevIdx] + vals[prevIdx] : aVals[idx] + vals[prevIdx]; } } @@ -44270,8 +44270,8 @@ function diag2(args) { const xVals = backend2.data.get(x.dataId).values; const outBuf = buffer([xSize, xSize], x.dtype); const vals = outBuf.values; - for (let i = 0; i < xVals.length; i++) { - vals[i * xSize + i] = xVals[i]; + for (let i2 = 0; i2 < xVals.length; i2++) { + vals[i2 * xSize + i2] = xVals[i2]; } const outShape = [...x.shape, ...x.shape]; return backend2.makeTensorInfo(outShape, outBuf.dtype, outBuf.values); @@ -44450,13 +44450,13 @@ function sum3(args) { const reduceSize = util_exports.sizeFromShape(reduceShape); const vals = backend2.data.get(result.dataId).values; const aVals = backend2.data.get(permutedX.dataId).values; - for (let i = 0; i < vals.length; ++i) { - const offset = i * reduceSize; + for (let i2 = 0; i2 < vals.length; ++i2) { + const offset = i2 * reduceSize; let sum7 = 0; for (let j = 0; j < reduceSize; ++j) { sum7 += aVals[offset + j]; } - vals[i] = sum7; + vals[i2] = sum7; } if (keepDims) { const newShape = backend_util_exports.expandShapeToKeepDim(result.shape, axes); @@ -44486,8 +44486,8 @@ function einsum2(args) { let out = null; let numDimsRemaining = allDims.length; const tensorsToDispose = []; - for (let i = 0; i < nSteps; ++i) { - for (const idTerm of steps[i]) { + for (let i2 = 0; i2 < nSteps; ++i2) { + for (const idTerm of steps[i2]) { const { permutationIndices: perm, expandDims: dimsToExpand } = backend_util_exports.getEinsumPermutation(numDimsRemaining, idDims[idTerm]); let x; if (backend_util_exports.isIdentityPermutation(perm)) { @@ -44511,13 +44511,13 @@ function einsum2(args) { tensorsToDispose.push(out); } } - if (i < nSteps - 1) { - if (path[i] >= 0) { + if (i2 < nSteps - 1) { + if (path[i2] >= 0) { out = sum3({ inputs: { x: out }, backend: backend2, attrs: { - axis: path[i] - (allDims.length - numDimsRemaining), + axis: path[i2] - (allDims.length - numDimsRemaining), keepDims: false } }); @@ -44546,12 +44546,12 @@ function eluGrad(args) { const resultValues = new Float32Array(util_exports.sizeFromShape(y.shape)); const values = backend2.data.get(y.dataId).values; const dyValues = backend2.data.get(dy.dataId).values; - for (let i = 0; i < values.length; ++i) { - const v = values[i]; + for (let i2 = 0; i2 < values.length; ++i2) { + const v = values[i2]; if (v >= 1) { - resultValues[i] = dyValues[i]; + resultValues[i2] = dyValues[i2]; } else { - resultValues[i] = dyValues[i] * (v + 1); + resultValues[i2] = dyValues[i2] * (v + 1); } } return backend2.makeTensorInfo(y.shape, "float32", resultValues); @@ -44570,8 +44570,8 @@ var a5 = backend_util_exports.ERF_A5; var erf2 = unaryKernelFunc(Erf, (xi) => { const sign4 = Math.sign(xi); const v = Math.abs(xi); - const t = 1 / (1 + p * v); - return sign4 * (1 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-v * v)); + const t2 = 1 / (1 + p * v); + return sign4 * (1 - ((((a5 * t2 + a4) * t2 + a3) * t2 + a2) * t2 + a1) * t2 * Math.exp(-v * v)); }); var erfConfig = { kernelName: Erf, @@ -44616,17 +44616,17 @@ function fftBatch(input2, inverse, cpuBackend) { const resultReal = util_exports.getTypedArrayFromDType("float32", resultSize); const resultImag = util_exports.getTypedArrayFromDType("float32", resultSize); for (let b = 0; b < batch; b++) { - const r = slice2({ + const r2 = slice2({ inputs: { x: real2D }, backend: cpuBackend, attrs: { begin: [b, 0], size: [1, innerDim] } }); - const i = slice2({ + const i2 = slice2({ inputs: { x: imag2D }, backend: cpuBackend, attrs: { begin: [b, 0], size: [1, innerDim] } }); - const input3 = complex2({ inputs: { real: r, imag: i }, backend: cpuBackend }); + const input3 = complex2({ inputs: { real: r2, imag: i2 }, backend: cpuBackend }); const { real: real5, imag: imag5 } = fftImpl(input3, inverse, cpuBackend); const res = backend_util_exports.mergeRealAndImagArrays(real5, imag5); for (let d = 0; d < innerDim; d++) { @@ -44634,8 +44634,8 @@ function fftBatch(input2, inverse, cpuBackend) { resultReal[b * innerDim + d] = c.real; resultImag[b * innerDim + d] = c.imag; } - cpuBackend.disposeIntermediateTensorInfo(r); - cpuBackend.disposeIntermediateTensorInfo(i); + cpuBackend.disposeIntermediateTensorInfo(r2); + cpuBackend.disposeIntermediateTensorInfo(i2); cpuBackend.disposeIntermediateTensorInfo(input3); } const $realInfo = cpuBackend.makeTensorInfo(resultShape, "float32", resultReal); @@ -44717,10 +44717,10 @@ function fftRadix2(realVals, imagVals, size2, inverse, cpuBackend) { const $oddRealInfo = cpuBackend.makeTensorInfo($oddShape, "float32", $oddRealVals); const $oddImagInfo = cpuBackend.makeTensorInfo($oddShape, "float32", $oddImagVals); const $oddTensorInfo = complex2({ inputs: { real: $oddRealInfo, imag: $oddImagInfo }, backend: cpuBackend }); - const e = backend_util_exports.exponents(size2, inverse); - const eShape = [e.real.length]; - const eRealInfo = cpuBackend.makeTensorInfo(eShape, "float32", e.real); - const eImagInfo = cpuBackend.makeTensorInfo(eShape, "float32", e.imag); + const e2 = backend_util_exports.exponents(size2, inverse); + const eShape = [e2.real.length]; + const eRealInfo = cpuBackend.makeTensorInfo(eShape, "float32", e2.real); + const eImagInfo = cpuBackend.makeTensorInfo(eShape, "float32", e2.imag); const complexInfo = complex2({ inputs: { real: eRealInfo, imag: eImagInfo }, backend: cpuBackend }); const exponentInfo = multiply2({ inputs: { a: complexInfo, b: $oddTensorInfo }, backend: cpuBackend }); const addPart = add4({ @@ -44775,20 +44775,20 @@ function fftRadix2(realVals, imagVals, size2, inverse, cpuBackend) { } function fourierTransformByMatmul(data, size2, inverse) { const ret = new Float32Array(size2 * 2); - for (let r = 0; r < size2; r++) { + for (let r2 = 0; r2 < size2; r2++) { let real5 = 0; let imag5 = 0; for (let c = 0; c < size2; c++) { - const e = backend_util_exports.exponent(r * c, size2, inverse); + const e2 = backend_util_exports.exponent(r2 * c, size2, inverse); const term = backend_util_exports.getComplexWithIndex(data, c); - real5 += term.real * e.real - term.imag * e.imag; - imag5 += term.real * e.imag + term.imag * e.real; + real5 += term.real * e2.real - term.imag * e2.imag; + imag5 += term.real * e2.imag + term.imag * e2.real; } if (inverse) { real5 /= size2; imag5 /= size2; } - backend_util_exports.assignToTypedArray(ret, real5, imag5, r); + backend_util_exports.assignToTypedArray(ret, real5, imag5, r2); } return ret; } @@ -44970,8 +44970,8 @@ function gatherV2(args) { const parsedAxis = util_exports.parseAxisParam(axis, x.shape)[0]; const indicesVals = backend2.data.get(indices.dataId).values; const axisDim = x.shape[parsedAxis]; - for (let i = 0; i < indicesVals.length; ++i) { - const index2 = indicesVals[i]; + for (let i2 = 0; i2 < indicesVals.length; ++i2) { + const index2 = indicesVals[i2]; util_exports.assert(index2 <= axisDim - 1 && index2 >= 0, () => `GatherV2: the index value ${index2} is not in [0, ${axisDim - 1}]`); } let $batchDims = batchDims; @@ -45175,8 +45175,8 @@ function max3(args) { let xVals = cpuBackend.data.get(x.dataId).values; if (permutedAxes != null) { const newShape = new Array(xRank); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = xShape[permutedAxes[i]]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = xShape[permutedAxes[i2]]; } xVals = transposeImpl(xVals, xShape, x.dtype, permutedAxes, newShape); axes = backend_util_exports.getInnerMostAxes(axes.length, xRank); @@ -45409,7 +45409,7 @@ function mean2(args) { const res = div2({ inputs: { a: $x, b: reduceSizeScalar }, backend: backend2 }); toDispose.push(res); const result = sum3({ inputs: { x: res }, backend: backend2, attrs: { axis, keepDims } }); - toDispose.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + toDispose.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return result; } var meanConfig = { @@ -45435,8 +45435,8 @@ function min3(args) { const reduceSize = util_exports.sizeFromShape(reduceShape); const vals = util_exports.makeZerosTypedArray(util_exports.sizeFromShape(outShape), $x.dtype); const aVals = backend2.data.get($x.dataId).values; - for (let i = 0; i < vals.length; ++i) { - const offset = i * reduceSize; + for (let i2 = 0; i2 < vals.length; ++i2) { + const offset = i2 * reduceSize; let min7 = aVals[offset]; for (let j = 0; j < reduceSize; ++j) { const value = aVals[offset + j]; @@ -45444,7 +45444,7 @@ function min3(args) { min7 = value; } } - vals[i] = min7; + vals[i2] = min7; } if (permutedAxes != null) { backend2.disposeIntermediateTensorInfo($x); @@ -45468,9 +45468,9 @@ function mirrorPad2(args) { const { x } = inputs; const { paddings, mode } = attrs; assertNotComplex(x, "mirrorPad"); - const outShape = paddings.map((p2, i) => p2[0] + x.shape[i] + p2[1]); + const outShape = paddings.map((p2, i2) => p2[0] + x.shape[i2] + p2[1]); const start = paddings.map((p2) => p2[0]); - const end = paddings.map((p2, i) => p2[0] + x.shape[i]); + const end = paddings.map((p2, i2) => p2[0] + x.shape[i2]); const offset = mode === "reflect" ? 0 : 1; const xVals = backend2.data.get(x.dataId).values; const xRank = x.shape.length; @@ -45479,18 +45479,18 @@ function mirrorPad2(args) { const resultRank = outShape.length; const resultStrides = util_exports.computeStrides(outShape); const resVals = util_exports.getTypedArrayFromDType(x.dtype, resultSize); - for (let i = 0; i < resultSize; i++) { - let coords3 = util_exports.indexToLoc(i, resultRank, resultStrides); - for (let i2 = 0; i2 < resultRank; i2++) { - if (coords3[i2] < start[i2]) { - coords3[i2] = start[i2] * 2 - coords3[i2] - offset; - } else if (coords3[i2] >= end[i2]) { - coords3[i2] = (end[i2] - 1) * 2 - coords3[i2] + offset; + for (let i2 = 0; i2 < resultSize; i2++) { + let coords3 = util_exports.indexToLoc(i2, resultRank, resultStrides); + for (let i3 = 0; i3 < resultRank; i3++) { + if (coords3[i3] < start[i3]) { + coords3[i3] = start[i3] * 2 - coords3[i3] - offset; + } else if (coords3[i3] >= end[i3]) { + coords3[i3] = (end[i3] - 1) * 2 - coords3[i3] + offset; } } - coords3 = coords3.map((c, i2) => c - start[i2]); + coords3 = coords3.map((c, i3) => c - start[i3]); const inIndex = util_exports.locToIndex(coords3, xRank, xStrides); - resVals[i] = xVals[inIndex]; + resVals[i2] = xVals[inIndex]; } const outId = backend2.write(resVals, outShape, x.dtype); return { dataId: outId, shape: outShape, dtype: x.dtype }; @@ -45574,10 +45574,10 @@ function multinomial2(args) { const random = seedrandom4.alea(seed.toString()); const outOffset = b * numSamples; for (let sampleId = 0; sampleId < numSamples; ++sampleId) { - const r = random(); + const r2 = random(); resVals[outOffset + sampleId] = cdf.length; for (let event = 0; event < cdf.length; event++) { - if (r < cdf[event]) { + if (r2 < cdf[event]) { resVals[outOffset + sampleId] = event; break; } @@ -45680,14 +45680,14 @@ function zerosLike2(args) { throw new Error("zerosLike is not supported for string tensors"); } else if (x.dtype === "complex64") { const realPart = real2({ inputs: { input: x }, backend: backend2 }); - const r = zerosLike2({ inputs: { x: realPart }, backend: backend2 }); + const r2 = zerosLike2({ inputs: { x: realPart }, backend: backend2 }); const imagPart = imag2({ inputs: { input: x }, backend: backend2 }); - const i = zerosLike2({ inputs: { x: imagPart }, backend: backend2 }); - const result = complex2({ inputs: { real: r, imag: i }, backend: backend2 }); + const i2 = zerosLike2({ inputs: { x: imagPart }, backend: backend2 }); + const result = complex2({ inputs: { real: r2, imag: i2 }, backend: backend2 }); backend2.disposeIntermediateTensorInfo(realPart); - backend2.disposeIntermediateTensorInfo(r); + backend2.disposeIntermediateTensorInfo(r2); backend2.disposeIntermediateTensorInfo(imagPart); - backend2.disposeIntermediateTensorInfo(i); + backend2.disposeIntermediateTensorInfo(i2); return result; } else { return fill2({ backend: backend2, attrs: { shape: x.shape, value: 0, dtype: x.dtype } }); @@ -45705,14 +45705,14 @@ function onesLike2(args) { throw new Error("onesLike is not supported for string tensors"); } else if (x.dtype === "complex64") { const realPart = real2({ inputs: { input: x }, backend: backend2 }); - const r = onesLike2({ inputs: { x: realPart }, backend: backend2 }); + const r2 = onesLike2({ inputs: { x: realPart }, backend: backend2 }); const imagPart = imag2({ inputs: { input: x }, backend: backend2 }); - const i = zerosLike2({ inputs: { x: imagPart }, backend: backend2 }); - const result = complex2({ inputs: { real: r, imag: i }, backend: backend2 }); + const i2 = zerosLike2({ inputs: { x: imagPart }, backend: backend2 }); + const result = complex2({ inputs: { real: r2, imag: i2 }, backend: backend2 }); backend2.disposeIntermediateTensorInfo(realPart); - backend2.disposeIntermediateTensorInfo(r); + backend2.disposeIntermediateTensorInfo(r2); backend2.disposeIntermediateTensorInfo(imagPart); - backend2.disposeIntermediateTensorInfo(i); + backend2.disposeIntermediateTensorInfo(i2); return result; } else { return fill2({ backend: backend2, attrs: { shape: x.shape, value: 1, dtype: x.dtype } }); @@ -45731,18 +45731,18 @@ function pack(args) { } const shape = inputs[0].shape; const dtype = inputs[0].dtype; - inputs.forEach((t) => { - util_exports.assertShapesMatch(shape, t.shape, "All tensors passed to stack must have matching shapes"); - util_exports.assert(dtype === t.dtype, () => "All tensors passed to stack must have matching dtypes"); + inputs.forEach((t2) => { + util_exports.assertShapesMatch(shape, t2.shape, "All tensors passed to stack must have matching shapes"); + util_exports.assert(dtype === t2.dtype, () => "All tensors passed to stack must have matching dtypes"); }); const intermediateTensorInfos = []; - const expandedTensors = inputs.map((t) => { - const expandedT = expandDims3({ inputs: { input: t }, backend: backend2, attrs: { dim: axis } }); + const expandedTensors = inputs.map((t2) => { + const expandedT = expandDims3({ inputs: { input: t2 }, backend: backend2, attrs: { dim: axis } }); intermediateTensorInfos.push(expandedT); return expandedT; }); const result = concat2({ inputs: expandedTensors, backend: backend2, attrs: { axis } }); - intermediateTensorInfos.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediateTensorInfos.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return result; } var packConfig = { @@ -45755,7 +45755,7 @@ function padV2(args) { const { x } = inputs; const { paddings, constantValue } = attrs; assertNotComplex(x, "pad"); - const outShape = paddings.map((p2, i) => p2[0] + x.shape[i] + p2[1]); + const outShape = paddings.map((p2, i2) => p2[0] + x.shape[i2] + p2[1]); const start = paddings.map((p2) => p2[0]); const xVals = backend2.data.get(x.dataId).values; const xSize = util_exports.sizeFromShape(x.shape); @@ -45768,11 +45768,11 @@ function padV2(args) { if (constantValue !== 0) { resVals.fill(constantValue); } - for (let i = 0; i < xSize; i++) { - const coords3 = util_exports.indexToLoc(i, xRank, xStrides); - const outCoords = coords3.map((c, i2) => c + start[i2]); + for (let i2 = 0; i2 < xSize; i2++) { + const coords3 = util_exports.indexToLoc(i2, xRank, xStrides); + const outCoords = coords3.map((c, i3) => c + start[i3]); const outIndex = util_exports.locToIndex(outCoords, resultRank, resultStrides); - resVals[outIndex] = xVals[i]; + resVals[outIndex] = xVals[i2]; } const outId = backend2.write(resVals, outShape, x.dtype); return { dataId: outId, shape: outShape, dtype: x.dtype }; @@ -45828,12 +45828,12 @@ function resizeBilinear2(args) { const effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0]; const effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1]; for (let b = 0; b < batch; b++) { - for (let r = 0; r < newHeight; r++) { + for (let r2 = 0; r2 < newHeight; r2++) { let sourceFracRow; if (halfPixelCenters) { - sourceFracRow = effectiveRowSizeRatio * (r + 0.5) - 0.5; + sourceFracRow = effectiveRowSizeRatio * (r2 + 0.5) - 0.5; } else { - sourceFracRow = effectiveRowSizeRatio * r; + sourceFracRow = effectiveRowSizeRatio * r2; } const sourceRowFloor = Math.max(0, Math.floor(sourceFracRow)); const rowFrac = sourceFracRow - sourceRowFloor; @@ -45897,8 +45897,8 @@ function resizeBilinearGrad(args) { let offset = 0; for (let b = 0; b < batch; b++) { const bOffset = b * imagesStrides[0]; - for (let r = 0; r < yHeight; r++) { - const dxR = r * heightScale; + for (let r2 = 0; r2 < yHeight; r2++) { + const dxR = r2 * heightScale; const topDxRIndex = Math.floor(dxR); const bottomDxRIndex = Math.min(Math.ceil(dxR), xHeight - 1); const topDxROffset = bOffset + topDxRIndex * imagesStrides[1]; @@ -45959,8 +45959,8 @@ function resizeNearestNeighbor2(args) { let outputOffset = 0; for (let b = 0; b < batch; b++) { const batchOffset = b * imagesStrides[0]; - for (let r = 0; r < newHeight; r++) { - const sourceFracRow = halfPixelCenters ? effectiveRowSizeRatio * (r + 0.5) : effectiveRowSizeRatio * r; + for (let r2 = 0; r2 < newHeight; r2++) { + const sourceFracRow = halfPixelCenters ? effectiveRowSizeRatio * (r2 + 0.5) : effectiveRowSizeRatio * r2; let sourceNearestRow = Math.min(oldHeight - 1, alignCorners ? Math.round(sourceFracRow) : Math.floor(sourceFracRow)); if (halfPixelCenters) { sourceNearestRow = Math.max(0, sourceNearestRow); @@ -46014,9 +46014,9 @@ function resizeNearestNeighborGrad(args) { const winWidth = Math.ceil(invWidthScale) * 2 + 2; for (let b = 0; b < batch; b++) { const batchOffset = b * imagesStrides[0]; - for (let r = 0; r < xHeight; r++) { - const rowOffset = batchOffset + r * imagesStrides[1]; - const startRLerp = Math.floor(r * invHeightScale); + for (let r2 = 0; r2 < xHeight; r2++) { + const rowOffset = batchOffset + r2 * imagesStrides[1]; + const startRLerp = Math.floor(r2 * invHeightScale); const startDyR = Math.floor(startRLerp - winHeight / 2); for (let c = 0; c < xWidth; c++) { const colOffset = rowOffset + c * imagesStrides[2]; @@ -46032,7 +46032,7 @@ function resizeNearestNeighborGrad(args) { const dyROffset = batchOffset + dyR * dyStrides[1]; const sourceFracRow = dyR * heightScale; const sourceNearestRow = Math.min(xHeight - 1, alignCorners ? Math.round(sourceFracRow) : Math.floor(sourceFracRow)); - if (r !== sourceNearestRow) { + if (r2 !== sourceNearestRow) { continue; } for (let dyCIndex = 0; dyCIndex < winWidth; dyCIndex++) { @@ -46072,8 +46072,8 @@ function reverse2(args) { } const outBuf = new TensorBuffer(x.shape, x.dtype); const xBuf = backend2.bufferSync(x); - for (let i = 0; i < outBuf.size; i++) { - const outLoc = outBuf.indexToLoc(i); + for (let i2 = 0; i2 < outBuf.size; i2++) { + const outLoc = outBuf.indexToLoc(i2); const inLoc = outLoc.slice(); $dims.forEach((d) => inLoc[d] = x.shape[d] - 1 - inLoc[d]); outBuf.set(xBuf.get(...inLoc), ...outLoc); @@ -46205,8 +46205,8 @@ function searchSortedImpl(sortedInputs, values, batchSize, numInputs, numValues, for (let b = 0; b < batchSize; ++b) { const sortedInputsSlice = sortedInputs.slice(b * numInputs, (b + 1) * numInputs); const outputOffset = b * numValues; - for (let i = 0; i < numValues; ++i) { - output[outputOffset + i] = side === "left" ? lowerBound2(sortedInputsSlice, values[i + outputOffset]) : upperBound2(sortedInputsSlice, values[i + outputOffset]); + for (let i2 = 0; i2 < numValues; ++i2) { + output[outputOffset + i2] = side === "left" ? lowerBound2(sortedInputsSlice, values[i2 + outputOffset]) : upperBound2(sortedInputsSlice, values[i2 + outputOffset]); } } return output; @@ -46227,26 +46227,26 @@ var searchSortedConfig = { }; function select2(args) { const { inputs, backend: backend2 } = args; - const { condition, t, e } = inputs; - assertNotComplex([condition, t, e], "select"); + const { condition, t: t2, e: e2 } = inputs; + assertNotComplex([condition, t2, e2], "select"); const conditionRank = condition.shape.length; const values = backend2.data.get(condition.dataId).values; - const tValues = backend2.data.get(t.dataId).values; - const eValues = backend2.data.get(e.dataId).values; - const resultDtype = upcastType(t.dtype, e.dtype); - const newValues = util_exports.makeZerosTypedArray(util_exports.sizeFromShape(t.shape), resultDtype); + const tValues = backend2.data.get(t2.dataId).values; + const eValues = backend2.data.get(e2.dataId).values; + const resultDtype = upcastType(t2.dtype, e2.dtype); + const newValues = util_exports.makeZerosTypedArray(util_exports.sizeFromShape(t2.shape), resultDtype); let index2 = 0; - const offset = conditionRank === 0 || conditionRank > 1 || t.shape.length === 1 ? 1 : util_exports.sizeFromShape(t.shape.slice(1)); - for (let i = 0; i < values.length; i++) { + const offset = conditionRank === 0 || conditionRank > 1 || t2.shape.length === 1 ? 1 : util_exports.sizeFromShape(t2.shape.slice(1)); + for (let i2 = 0; i2 < values.length; i2++) { for (let j = 0; j < offset; j++) { - if (values[i] === 1) { - newValues[index2++] = tValues[i]; + if (values[i2] === 1) { + newValues[index2++] = tValues[i2]; } else { - newValues[index2++] = eValues[i]; + newValues[index2++] = eValues[i2]; } } } - return backend2.makeTensorInfo(t.shape, resultDtype, newValues); + return backend2.makeTensorInfo(t2.shape, resultDtype, newValues); } var selectConfig = { kernelName: Select, @@ -46322,7 +46322,7 @@ function spaceToBatchND2(args) { const prod6 = util_exports.sizeFromShape(blockShape); const completePaddings = [[0, 0]]; completePaddings.push(...paddings); - for (let i = 1 + blockShape.length; i < x.shape.length; ++i) { + for (let i2 = 1 + blockShape.length; i2 < x.shape.length; ++i2) { completePaddings.push([0, 0]); } const paddedX = padV2Config.kernelFunc({ @@ -46523,11 +46523,11 @@ function splitV(args) { const splitSizes = backend_util_exports.prepareSplitSize(x, numOrSizeSplits, $axis); const begin = new Array(x.shape.length).fill(0); const size2 = x.shape.slice(); - return splitSizes.map((s) => { + return splitSizes.map((s2) => { const sliceSize = [...size2]; - sliceSize[$axis] = s; + sliceSize[$axis] = s2; const sliceT = slice2({ inputs: { x }, backend: backend2, attrs: { begin, size: sliceSize } }); - begin[$axis] += s; + begin[$axis] += s2; return sliceT; }); } @@ -46545,9 +46545,9 @@ var squareConfig = { assertNotComplex(x, "square"); const values = cpuBackend.data.get(x.dataId).values; const newValues = new Float32Array(values.length); - for (let i = 0; i < values.length; ++i) { - const value = values[i]; - newValues[i] = value * value; + for (let i2 = 0; i2 < values.length; ++i2) { + const value = values[i2]; + newValues[i2] = value * value; } const dataId = cpuBackend.write(newValues, x.shape, x.dtype); return { dataId, shape: x.shape, dtype: x.dtype }; @@ -46866,19 +46866,19 @@ function unpack(args) { const num = value.shape[axis]; const outShape = new Array(valueRank - 1); let outIndex = 0; - for (let i = 0; i < valueRank; i++) { - if (i !== axis) { - outShape[outIndex++] = value.shape[i]; + for (let i2 = 0; i2 < valueRank; i2++) { + if (i2 !== axis) { + outShape[outIndex++] = value.shape[i2]; } } const begin = new Array(valueRank).fill(0); const size2 = value.shape.slice(); size2[axis] = 1; const res = new Array(num); - for (let i = 0; i < res.length; i++) { - begin[axis] = i; + for (let i2 = 0; i2 < res.length; i2++) { + begin[axis] = i2; const tempRes = slice2({ inputs: { x: value }, backend: backend2, attrs: { begin, size: size2 } }); - res[i] = reshape3({ inputs: { x: tempRes }, backend: backend2, attrs: { shape: outShape } }); + res[i2] = reshape3({ inputs: { x: tempRes }, backend: backend2, attrs: { shape: outShape } }); backend2.disposeIntermediateTensorInfo(tempRes); } return res; @@ -46899,13 +46899,13 @@ function unsortedSegmentSum2(args) { const intermediates = []; const numIters = xRank - segmentIdsRank; let $segmentIds = segmentIds; - for (let i = 0; i < numIters; ++i) { - const expanded = expandDims3({ inputs: { input: $segmentIds }, backend: backend2, attrs: { dim: i + 1 } }); + for (let i2 = 0; i2 < numIters; ++i2) { + const expanded = expandDims3({ inputs: { input: $segmentIds }, backend: backend2, attrs: { dim: i2 + 1 } }); $segmentIds = expanded; intermediates.push(expanded); } - for (let i = 0; i < numSegments; ++i) { - const scalarValue = util_exports.createScalarValue(i, "int32"); + for (let i2 = 0; i2 < numSegments; ++i2) { + const scalarValue = util_exports.createScalarValue(i2, "int32"); const segmentId = backend2.makeTensorInfo([], "int32", scalarValue); const mask2 = equal2({ inputs: { a: segmentId, b: $segmentIds }, backend: backend2 }); const maskCasted = cast3({ inputs: { x: mask2 }, backend: backend2, attrs: { dtype: "float32" } }); @@ -46919,7 +46919,7 @@ function unsortedSegmentSum2(args) { intermediates.push(sumTensorInfo); } const result = pack({ inputs: res, backend: backend2, attrs: { axis: 0 } }); - intermediates.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediates.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return result; } var unsortedSegmentSumConfig = { @@ -47374,8 +47374,8 @@ function logShaderSourceAndInfoLog(shaderSource, shaderInfoLog) { const pad3 = shaderLines.length.toString().length + 2; const linesWithLineNumbers = shaderLines.map((line, lineNumber2) => util_exports.rightPad((lineNumber2 + 1).toString(), pad3) + line); let maxLineLength = 0; - for (let i = 0; i < linesWithLineNumbers.length; i++) { - maxLineLength = Math.max(linesWithLineNumbers[i].length, maxLineLength); + for (let i2 = 0; i2 < linesWithLineNumbers.length; i2++) { + maxLineLength = Math.max(linesWithLineNumbers[i2].length, maxLineLength); } const beforeErrorLines = linesWithLineNumbers.slice(0, lineNumber - 1); const errorLine = linesWithLineNumbers.slice(lineNumber - 1, lineNumber); @@ -47543,7 +47543,7 @@ function getTextureShapeFromLogicalShape(logShape, isPacked = false) { let maxTexSize = env().getNumber("WEBGL_MAX_TEXTURE_SIZE"); if (isPacked) { maxTexSize = maxTexSize * 2; - logShape = logShape.map((d, i) => i >= logShape.length - 2 ? util_exports.nearestLargerEven(logShape[i]) : logShape[i]); + logShape = logShape.map((d, i2) => i2 >= logShape.length - 2 ? util_exports.nearestLargerEven(logShape[i2]) : logShape[i2]); if (logShape.length === 1) { logShape = [2, logShape[0]]; } @@ -47578,8 +47578,8 @@ function getTextureShapeFromLogicalShape(logShape, isPacked = false) { return util_exports.sizeToSquarishShape(size2); } } -function isEven(n) { - return n % 2 === 0; +function isEven(n2) { + return n2 % 2 === 0; } function isReshapeFree(shape1, shape2) { shape1 = shape1.slice(-2); @@ -47652,8 +47652,8 @@ function isWebGLVersionEnabled(webGLVersion) { if (gl != null) { return true; } - } catch (e) { - console.log("Error when getting WebGL context: ", e); + } catch (e2) { + console.log("Error when getting WebGL context: ", e2); return false; } return false; @@ -47747,9 +47747,9 @@ function assertNotComplex2(tensor2, opName) { if (!Array.isArray(tensor2)) { tensor2 = [tensor2]; } - tensor2.forEach((t) => { - if (t != null) { - util_exports.assert(t.dtype !== "complex64", () => `${opName} does not support complex64 tensors in the WebGL backend.`); + tensor2.forEach((t2) => { + if (t2 != null) { + util_exports.assert(t2.dtype !== "complex64", () => `${opName} does not support complex64 tensors in the WebGL backend.`); } }); } @@ -47817,7 +47817,7 @@ ENV5.registerFlag("WEBGL_USE_SHAPES_UNIFORMS", () => false); ENV5.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD", () => 1e5); ENV5.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD", () => 128); function getGlslDifferences() { - let version10; + let version9; let attribute; let varyingVs; let varyingFs; @@ -47828,7 +47828,7 @@ function getGlslDifferences() { let defineSpecialInf; let defineRound; if (env().getNumber("WEBGL_VERSION") === 2) { - version10 = "#version 300 es"; + version9 = "#version 300 es"; attribute = "in"; varyingVs = "out"; varyingFs = "in"; @@ -47860,7 +47860,7 @@ function getGlslDifferences() { } `; } else { - version10 = ""; + version9 = ""; attribute = "attribute"; varyingVs = "varying"; varyingFs = "varying"; @@ -47897,7 +47897,7 @@ function getGlslDifferences() { `; } return { - version: version10, + version: version9, attribute, varyingVs, varyingFs, @@ -47911,17 +47911,17 @@ function getGlslDifferences() { } function getLogicalCoordinatesFromFlatIndex(coords3, shape, index2 = "index") { const strides2 = util_exports.computeStrides(shape); - return strides2.map((stride, i) => { - const line1 = `int ${coords3[i]} = ${index2} / ${stride}`; - const line2 = i === strides2.length - 1 ? `int ${coords3[i + 1]} = ${index2} - ${coords3[i]} * ${stride}` : `index -= ${coords3[i]} * ${stride}`; + return strides2.map((stride, i2) => { + const line1 = `int ${coords3[i2]} = ${index2} / ${stride}`; + const line2 = i2 === strides2.length - 1 ? `int ${coords3[i2 + 1]} = ${index2} - ${coords3[i2]} * ${stride}` : `index -= ${coords3[i2]} * ${stride}`; return `${line1}; ${line2};`; }).join(""); } function getOutputLogicalCoordinatesFromFlatIndexByUniform(coords3, shape, index2 = "index") { const strides2 = util_exports.computeStrides(shape); - return strides2.map((_, i) => { - const line1 = `int ${coords3[i]} = ${index2} / outShapeStrides[${i}]`; - const line2 = i === strides2.length - 1 ? `int ${coords3[i + 1]} = ${index2} - ${coords3[i]} * outShapeStrides[${i}]` : `index -= ${coords3[i]} * outShapeStrides[${i}]`; + return strides2.map((_, i2) => { + const line1 = `int ${coords3[i2]} = ${index2} / outShapeStrides[${i2}]`; + const line2 = i2 === strides2.length - 1 ? `int ${coords3[i2 + 1]} = ${index2} - ${coords3[i2]} * outShapeStrides[${i2}]` : `index -= ${coords3[i2]} * outShapeStrides[${i2}]`; return `${line1}; ${line2};`; }).join(""); } @@ -47930,17 +47930,17 @@ function symbolicallyComputeStrides(indicesArr, variableName) { const shape = indicesArr.map((d) => `${variableName}[${d}]`); const strides2 = new Array(numCoords - 1); strides2[numCoords - 2] = shape[numCoords - 1]; - for (let i = numCoords - 3; i >= 0; --i) { - strides2[i] = `(${strides2[i + 1]} * ${shape[i + 1]})`; + for (let i2 = numCoords - 3; i2 >= 0; --i2) { + strides2[i2] = `(${strides2[i2 + 1]} * ${shape[i2 + 1]})`; } return strides2; } function getLogicalCoordinatesFromFlatIndexByUniform(coords3, variableName, index2 = "index") { - const indicesArray = coords3.map((_, i) => i); + const indicesArray = coords3.map((_, i2) => i2); const strides2 = symbolicallyComputeStrides(indicesArray, variableName); - return strides2.map((_, i) => { - const line1 = `int ${coords3[i]} = ${index2} / ${strides2[i]}`; - const line2 = i === strides2.length - 1 ? `int ${coords3[i + 1]} = ${index2} - ${coords3[i]} * ${strides2[i]}` : `index -= ${coords3[i]} * ${strides2[i]}`; + return strides2.map((_, i2) => { + const line1 = `int ${coords3[i2]} = ${index2} / ${strides2[i2]}`; + const line2 = i2 === strides2.length - 1 ? `int ${coords3[i2 + 1]} = ${index2} - ${coords3[i2]} * ${strides2[i2]}` : `index -= ${coords3[i2]} * ${strides2[i2]}`; return `${line1}; ${line2};`; }).join(""); } @@ -49469,7 +49469,7 @@ function getPackedSamplerAtOutputCoords(inputInfo, outShapeInfo) { if (outRank < 2 && inRank > 0) { unpackedCoordsSnippet = "coords"; } else { - unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape.map((s, i) => `coords.${fields[i + rankDiff]}`).join(", "); + unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape.map((s2, i2) => `coords.${fields[i2 + rankDiff]}`).join(", "); } let output = `return outputValue;`; const inSize = util_exports.sizeFromShape(inputInfo.shapeInfo.logicalShape); @@ -49541,7 +49541,7 @@ function getSamplerAtOutputCoords(inputInfo, outShapeInfo) { if (outRank < 2 && inRank > 0) { unpackedCoordsSnippet = "coords"; } else { - unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape.map((s, i) => `coords.${fields[i + rankDiff]}`).join(", "); + unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape.map((s2, i2) => `coords.${fields[i2 + rankDiff]}`).join(", "); } return ` float ${funcName}() { @@ -49586,7 +49586,7 @@ function getSqueezedParams(params, keptDims) { return keptDims.map((d) => params[d]).join(", "); } function compileProgram(gpgpu, program, inputs, output) { - const inputInfos = inputs.map((input2, i) => { + const inputInfos = inputs.map((input2, i2) => { const shapeInfo = { logicalShape: input2.shape, texShape: input2.isUniform ? null : input2.texData.texShape, @@ -49597,7 +49597,7 @@ function compileProgram(gpgpu, program, inputs, output) { if (input2.texData != null && input2.texData.slice != null && input2.texData.slice.flatOffset > 0) { shapeInfo.flatOffset = input2.texData.slice.flatOffset; } - return { name: program.variableNames[i], shapeInfo }; + return { name: program.variableNames[i2], shapeInfo }; }); const inShapeInfos = inputInfos.map((x) => x.shapeInfo); const outShapeInfo = { @@ -49654,8 +49654,8 @@ function getUniformLocations(gpgpu, program, webGLProgram) { infLoc = gpgpu.getUniformLocation(webGLProgram, "INFINITY", false); } const shouldThrow = false; - for (let i = 0; i < program.variableNames.length; i++) { - const varName = program.variableNames[i]; + for (let i2 = 0; i2 < program.variableNames.length; i2++) { + const varName = program.variableNames[i2]; uniformLocations[varName] = gpgpu.getUniformLocation(webGLProgram, varName, shouldThrow); uniformLocations[`offset${varName}`] = gpgpu.getUniformLocation(webGLProgram, `offset${varName}`, shouldThrow); if (program.enableShapeUniforms) { @@ -49669,8 +49669,8 @@ function getUniformLocations(gpgpu, program, webGLProgram) { outTexShapeLocation = gpgpu.getUniformLocation(webGLProgram, "outTexShape", shouldThrow); } if (program.customUniforms) { - program.customUniforms.forEach((d, i) => { - customUniformLocations[i] = gpgpu.getUniformLocation(webGLProgram, d.name, shouldThrow); + program.customUniforms.forEach((d, i2) => { + customUniformLocations[i2] = gpgpu.getUniformLocation(webGLProgram, d.name, shouldThrow); }); } return { @@ -49689,17 +49689,17 @@ function validateBinaryAndProgram(shapeInfos, inputs) { if (shapeInfos.length !== inputs.length) { throw Error(`Binary was compiled with ${shapeInfos.length} inputs, but was executed with ${inputs.length} inputs`); } - shapeInfos.forEach((s, i) => { - const shapeA = s.logicalShape; - const input2 = inputs[i]; + shapeInfos.forEach((s2, i2) => { + const shapeA = s2.logicalShape; + const input2 = inputs[i2]; const shapeB = input2.shape; if (!util_exports.arraysEqual(shapeA, shapeB)) { throw Error(`Binary was compiled with different shapes than the current args. Shapes ${shapeA} and ${shapeB} must match`); } - if (s.isUniform && input2.isUniform) { + if (s2.isUniform && input2.isUniform) { return; } - const texShapeA = s.texShape; + const texShapeA = s2.texShape; const texShapeB = input2.isUniform ? null : input2.texData.texShape; if (!util_exports.arraysEqual(texShapeA, texShapeB)) { throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${texShapeA} and ${texShapeB} must match`); @@ -49727,8 +49727,8 @@ function runProgram(gpgpu, binary, inputs, output, customUniformValues) { if (binary.nanLoc !== null) { gpgpu.gl.uniform1f(binary.nanLoc, NaN); } - inputs.forEach((input2, i) => { - const varName = binary.program.variableNames[i]; + inputs.forEach((input2, i2) => { + const varName = binary.program.variableNames[i2]; const varLoc = binary.uniformLocations[varName]; const varOffsetLoc = binary.uniformLocations[`offset${varName}`]; const varShapeLoc = binary.inShapesLocations[`${varName}Shape`]; @@ -49773,7 +49773,7 @@ function runProgram(gpgpu, binary, inputs, output, customUniformValues) { if (input2.texData.slice != null && varOffsetLoc != null) { gpgpu.gl.uniform1i(varOffsetLoc, input2.texData.slice.flatOffset); } - gpgpu.setInputMatrixTexture(input2.texData.texture.texture, varLoc, i); + gpgpu.setInputMatrixTexture(input2.texData.texture.texture, varLoc, i2); }); const outShapeLoc = binary.outShapeLocation; if (outShapeLoc) { @@ -49814,9 +49814,9 @@ function runProgram(gpgpu, binary, inputs, output, customUniformValues) { gpgpu.gl.uniform2i(binary.outTexShapeLocation, output.texData.texShape[0], output.texData.texShape[1]); } if (binary.program.customUniforms && customUniformValues) { - binary.program.customUniforms.forEach((d, i) => { - const customLoc = binary.customUniformLocations[i]; - const customValue = customUniformValues[i]; + binary.program.customUniforms.forEach((d, i2) => { + const customLoc = binary.customUniformLocations[i2]; + const customValue = customUniformValues[i2]; if (d.type === "float") { gpgpu.gl.uniform1fv(customLoc, customValue); } else if (d.type === "vec2") { @@ -50590,8 +50590,8 @@ var GPGPUContext = class { } pollItems() { const index2 = linearSearchLastTrue(this.itemsToPoll.map((x) => x.isDoneFn)); - for (let i = 0; i <= index2; ++i) { - const { resolveFn } = this.itemsToPoll[i]; + for (let i2 = 0; i2 <= index2; ++i2) { + const { resolveFn } = this.itemsToPoll[i2]; resolveFn(); } this.itemsToPoll = this.itemsToPoll.slice(index2 + 1); @@ -50656,14 +50656,14 @@ var GPGPUContext = class { } }; function linearSearchLastTrue(arr) { - let i = 0; - for (; i < arr.length; ++i) { - const isDone = arr[i](); + let i2 = 0; + for (; i2 < arr.length; ++i2) { + const isDone = arr[i2](); if (!isDone) { break; } } - return i - 1; + return i2 - 1; } var { addImpl: addImplCPU, bincountImpl: bincountImplCPU, bincountReduceImpl: bincountReduceImplCPU, ceilImpl: ceilImplCPU, concatImpl: concatImplCPU, equalImpl: equalImplCPU, expImpl: expImplCPU, expm1Impl: expm1ImplCPU, floorImpl: floorImplCPU, gatherNdImpl: gatherNdImplCPU, gatherV2Impl: gatherV2ImplCPU, greaterImpl: greaterImplCPU, greaterEqualImpl: greaterEqualImplCPU, lessImpl: lessImplCPU, lessEqualImpl: lessEqualImplCPU, linSpaceImpl: linSpaceImplCPU, logImpl: logImplCPU, maxImpl: maxImplCPU, maximumImpl: maximumImplCPU, minimumImpl: minimumImplCPU, multiplyImpl: multiplyImplCPU, negImpl: negImplCPU, notEqualImpl: notEqualImplCPU, prodImpl: prodImplCPU, rangeImpl: rangeImplCPU, rsqrtImpl: rsqrtImplCPU, scatterImpl: scatterImplCPU, sigmoidImpl: sigmoidImplCPU, simpleAbsImpl: simpleAbsImplCPU, sliceImpl: sliceImplCPU, sparseFillEmptyRowsImpl: sparseFillEmptyRowsImplCPU, sparseReshapeImpl: sparseReshapeImplCPU, sparseSegmentReductionImpl: sparseSegmentReductionImplCPU, sqrtImpl: sqrtImplCPU, stridedSliceImpl: stridedSliceImplCPU, stringNGramsImpl: stringNGramsImplCPU, stringSplitImpl: stringSplitImplCPU, stringToHashBucketFastImpl: stringToHashBucketFastImplCPU, subImpl: subImplCPU, tileImpl: tileImplCPU, topKImpl: topKImplCPU, transposeImpl: transposeImplCPU, uniqueImpl: uniqueImplCPU } = shared_exports; function getVecChannels(name, rank) { @@ -50680,9 +50680,9 @@ function getSourceCoords(rank, dims) { return "rc"; } let coords3 = ""; - for (let i = 0; i < rank; i++) { - coords3 += dims[i]; - if (i < rank - 1) { + for (let i2 = 0; i2 < rank; i2++) { + coords3 += dims[i2]; + if (i2 < rank - 1) { coords3 += ","; } } @@ -50741,9 +50741,9 @@ var PackProgram = class { return `rc > ${this.enableShapeUniforms ? "outShape" : this.outputShape[0]}`; } let cond = ""; - for (let i = this.rank - 2; i < this.rank; i++) { - cond += `${dims[i]} >= ${this.enableShapeUniforms ? `outShape[${i}]` : this.outputShape[i]}`; - if (i < this.rank - 1) { + for (let i2 = this.rank - 2; i2 < this.rank; i2++) { + cond += `${dims[i2]} >= ${this.enableShapeUniforms ? `outShape[${i2}]` : this.outputShape[i2]}`; + if (i2 < this.rank - 1) { cond += "||"; } } @@ -50787,25 +50787,25 @@ var ReshapePackedProgram = class { this.outputShape = outputShape; this.enableShapeUniforms = useShapeUniforms(this.outputShape.length); let mainLoop = ``; - for (let i = 0; i < 4; i++) { + for (let i2 = 0; i2 < 4; i2++) { let thisRC = `thisRC = rc;`; - if (i % 2 === 1) { + if (i2 % 2 === 1) { thisRC += `thisRC.z += 1;`; } - if (i > 1) { + if (i2 > 1) { thisRC += `thisRC.y += 1;`; } mainLoop += ` ${thisRC} - ${i > 0 ? `if(thisRC.y < rows && thisRC.z < cols){` : ""} + ${i2 > 0 ? `if(thisRC.y < rows && thisRC.z < cols){` : ""} int flatIndex = getFlatIndex(thisRC); ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex); vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z)); - result[${i}] = + result[${i2}] = getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims); - ${i > 0 ? "}" : ""} + ${i2 > 0 ? "}" : ""} `; } this.userCode = ` @@ -51382,24 +51382,24 @@ var MathBackendWebGL = class extends KernelBackend { const tmpData = this.texData.get(tmpTarget.dataId); return Object.assign({ tensorRef }, tmpData.texture); } - bufferSync(t) { - const data = this.readSync(t.dataId); - if (t.dtype === "string") { + bufferSync(t2) { + const data = this.readSync(t2.dataId); + if (t2.dtype === "string") { try { const strings = data.map((d) => util_exports.decodeString(d)); - return buffer(t.shape, t.dtype, strings); + return buffer(t2.shape, t2.dtype, strings); } catch (_a) { throw new Error("Failed to decode encoded string bytes into utf-8"); } } - return buffer(t.shape, t.dtype, data); + return buffer(t2.shape, t2.dtype, data); } checkNumericalProblems(values) { if (values == null) { return; } - for (let i = 0; i < values.length; i++) { - const num = values[i]; + for (let i2 = 0; i2 < values.length; i2++) { + const num = values[i2]; if (!canBeRepresented(num)) { if (env().getBool("WEBGL_RENDER_FLOAT32_CAPABLE")) { throw Error(`The value ${num} cannot be represented with your current settings. Consider enabling float32 rendering: 'tf.env().set('WEBGL_RENDER_FLOAT32_ENABLED', true);'`); @@ -51458,7 +51458,7 @@ var MathBackendWebGL = class extends KernelBackend { if (env().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE") > 0) { const kernelMs = await Promise.all(flattenedActiveTimerQueries); res["kernelMs"] = util_exports.sum(kernelMs); - res["getExtraProfileInfo"] = () => kernelMs.map((d, i) => ({ name: flattenedActiveTimerNames[i], ms: d })).map((d) => `${d.name}: ${d.ms}`).join(", "); + res["getExtraProfileInfo"] = () => kernelMs.map((d, i2) => ({ name: flattenedActiveTimerNames[i2], ms: d })).map((d) => `${d.name}: ${d.ms}`).join(", "); } else { res["kernelMs"] = { error: "WebGL query timers are not supported in this environment." @@ -51938,8 +51938,8 @@ function float32ToTypedArray(a, dtype) { return a; } else if (dtype === "int32" || dtype === "bool") { const result = dtype === "int32" ? new Int32Array(a.length) : new Uint8Array(a.length); - for (let i = 0; i < result.length; ++i) { - result[i] = Math.round(a[i]); + for (let i2 = 0; i2 < result.length; ++i2) { + result[i2] = Math.round(a[i2]); } return result; } else { @@ -52680,12 +52680,12 @@ function getReductionStages(inShape) { function reduce(x, dtype, reductionType, backend2) { const reductionStages = getReductionStages(x.shape); let result = x; - for (let i = 0; i < reductionStages.length; i++) { - const { inSize, windowSize, outSize } = reductionStages[i]; + for (let i2 = 0; i2 < reductionStages.length; i2++) { + const { inSize, windowSize, outSize } = reductionStages[i2]; let program; let previousResult; if (reductionType === "mean") { - program = i === 0 ? new MeanProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }, inSize) : new MeanProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }); + program = i2 === 0 ? new MeanProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }, inSize) : new MeanProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }); } else { program = new ReduceProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }, reductionType); } @@ -52701,8 +52701,8 @@ var TransposeProgram = class { constructor(aShape, newDim) { this.variableNames = ["A"]; const outputShape = new Array(aShape.length); - for (let i = 0; i < outputShape.length; i++) { - outputShape[i] = aShape[newDim[i]]; + for (let i2 = 0; i2 < outputShape.length; i2++) { + outputShape[i2] = aShape[newDim[i2]]; } this.outputShape = outputShape; this.rank = outputShape.length; @@ -52723,8 +52723,8 @@ function getSwitchedCoords(newDim) { } const originalOrder = ["resRC.x", "resRC.y", "resRC.z", "resRC.w", "resRC.u", "resRC.v"]; const switchedCoords = new Array(rank); - for (let i = 0; i < newDim.length; i++) { - switchedCoords[newDim[i]] = originalOrder[i]; + for (let i2 = 0; i2 < newDim.length; i2++) { + switchedCoords[newDim[i2]] = originalOrder[i2]; } return switchedCoords.join(); } @@ -52734,8 +52734,8 @@ var TransposePackedProgram = class { this.packedInputs = true; this.packedOutput = true; const outputShape = new Array(aShape.length); - for (let i = 0; i < outputShape.length; i++) { - outputShape[i] = aShape[newDim[i]]; + for (let i2 = 0; i2 < outputShape.length; i2++) { + outputShape[i2] = aShape[newDim[i2]]; } this.outputShape = outputShape; this.rank = outputShape.length; @@ -52745,8 +52745,8 @@ var TransposePackedProgram = class { const dtype = getCoordsDataType(this.rank); const outputOrder = getVecChannels("rc", this.rank); const switchedOrder = new Array(this.rank); - for (let i = 0; i < newDim.length; i++) { - switchedOrder[newDim[i]] = outputOrder[i]; + for (let i2 = 0; i2 < newDim.length; i2++) { + switchedOrder[newDim[i2]] = outputOrder[i2]; } const innerDims = `vec2(${switchedOrder.slice(-2).join()})`; const nextColumn = `++${outputOrder[this.rank - 1]} < ${outputShape[this.rank - 1]}`; @@ -52825,8 +52825,8 @@ function transpose3(args) { const webglBackend = backend2; const xRank = x.shape.length; const newShape = new Array(xRank); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = x.shape[perm[i]]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = x.shape[perm[i2]]; } let out; if (webglBackend.shouldExecuteOnCPU([x])) { @@ -52928,8 +52928,8 @@ function batchMatMulImpl({ a, b, transposeA, transposeB, backend: backend2, bias } const outReshaped = reshape4({ inputs: { x: out }, backend: backend2, attrs: { shape: outShape } }); intermediates.push(out); - for (const i of intermediates) { - backend2.disposeIntermediateTensorInfo(i); + for (const i2 of intermediates) { + backend2.disposeIntermediateTensorInfo(i2); } return outReshaped; } @@ -53013,7 +53013,7 @@ var AddNProgram = class { constructor(outputShape, shapes) { this.outputShape = []; this.outputShape = outputShape; - this.variableNames = shapes.map((_, i) => `T${i}`); + this.variableNames = shapes.map((_, i2) => `T${i2}`); const snippets = []; this.variableNames.forEach((variable2) => { snippets.push(`float v${variable2} = get${variable2}AtOutCoords();`); @@ -53037,7 +53037,7 @@ var AddNPackedProgram = class { this.packedInputs = true; this.packedOutput = true; this.outputShape = outputShape; - this.variableNames = shapes.map((_, i) => `T${i}`); + this.variableNames = shapes.map((_, i2) => `T${i2}`); const snippets = []; this.variableNames.forEach((variable2) => { snippets.push(`vec4 v${variable2} = get${variable2}AtOutCoords();`); @@ -53067,8 +53067,8 @@ function addN3(args) { const rightSide = addN3({ inputs: tensors.slice(midIndex), backend: backend2 }); return addN3({ inputs: [leftSide, rightSide], backend: backend2 }); } - const dtype = tensors.map((t) => t.dtype).reduce((d1, d2) => upcastType(d1, d2)); - const shapes = tensors.map((t) => t.shape); + const dtype = tensors.map((t2) => t2.dtype).reduce((d1, d2) => upcastType(d1, d2)); + const shapes = tensors.map((t2) => t2.shape); const usePackedOp = env().getBool("WEBGL_PACK"); const program = usePackedOp ? new AddNPackedProgram(tensors[0].shape, shapes) : new AddNProgram(tensors[0].shape, shapes); return backend2.runWebGLProgram(program, tensors, dtype); @@ -53345,7 +53345,7 @@ function argMinMaxReduce(backend2, x, axis, reduceType) { const reduced = argReduce(backend2, a2D, reduceType); intermediateTensorInfos.push(reduced); const reshaped = reshape4({ inputs: { x: reduced }, backend: backend2, attrs: { shape: outShape } }); - intermediateTensorInfos.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediateTensorInfos.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return reshaped; } return argReducePacked(backend2, x, reduceType); @@ -53365,7 +53365,7 @@ function argMax3(args) { } backend_util_exports.assertAxesAreInnerMostDims("argMax", [axes[0]], $x.shape.length); const out = argMinMaxReduce(backend2, $x, axes[0], "max"); - intermediateTensorInfos.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediateTensorInfos.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return out; } var argMaxConfig2 = { @@ -53388,7 +53388,7 @@ function argMin3(args) { } backend_util_exports.assertAxesAreInnerMostDims("argMin", [axes[0]], $x.shape.length); const out = argMinMaxReduce(backend2, $x, axes[0], "min"); - intermediateTensorInfos.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediateTensorInfos.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return out; } var argMinConfig2 = { @@ -54151,8 +54151,8 @@ var SliceProgram = class { this.customUniforms = [{ name: "start", arrayIndex: this.rank, type: "int" }]; const sourceCoords = getCoords(this.rank); let body4; - const coordSum = destSize.map((_, i) => { - return `sourceLoc.${coords[i]} = start[${i}] + coords.${coords[i]};`; + const coordSum = destSize.map((_, i2) => { + return `sourceLoc.${coords[i2]} = start[${i2}] + coords.${coords[i2]};`; }); body4 = ` ${dtype} sourceLoc; @@ -54210,7 +54210,7 @@ var SlicePackedProgram = class { } `; const sourceLocSetup = this.rank <= 4 ? `sourceLoc = coords + - ${dtype}(${destSize.map((_, i) => `start[${i}]`).join()});` : destSize.map((_, i) => `${sourceLoc[i]} = ${coords3[i]} + start[${i}];`).join("\n"); + ${dtype}(${destSize.map((_, i2) => `start[${i2}]`).join()});` : destSize.map((_, i2) => `${sourceLoc[i2]} = ${coords3[i2]} + start[${i2}];`).join("\n"); this.userCode = ` void main() { ${dtype} coords = getOutputCoords(); @@ -54226,8 +54226,8 @@ var SlicePackedProgram = class { }; function shallowSlice(x, begin, size2, backend2) { const xTexData = backend2.texData.get(x.dataId); - const t = backend2.makeTensorInfo(size2, x.dtype); - const newTexData = backend2.texData.get(t.dataId); + const t2 = backend2.makeTensorInfo(size2, x.dtype); + const newTexData = backend2.texData.get(t2.dataId); Object.assign(newTexData, xTexData); newTexData.refCount = 1; newTexData.shape = size2; @@ -54242,7 +54242,7 @@ function shallowSlice(x, begin, size2, backend2) { }; const refCount = backend2.dataRefCount.get(newTexData.slice.origDataId) || 1; backend2.dataRefCount.set(newTexData.slice.origDataId, refCount + 1); - return t; + return t2; } function slice3(args) { const { inputs, backend: backend2, attrs } = args; @@ -54300,7 +54300,7 @@ var batchToSpaceND3 = (args) => { toDispose.push(reshapedIntermediate); toDispose.push(transposedIntermediate); toDispose.push(reshapedIntermediate2); - toDispose.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + toDispose.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return sliced; }; var batchToSpaceNDConfig2 = { @@ -54519,16 +54519,16 @@ var ConcatProgram = class { constructor(shapes) { this.outputShape = []; this.outputShape = backend_util_exports.computeOutShape(shapes, 1); - this.variableNames = shapes.map((_, i) => `T${i}`); + this.variableNames = shapes.map((_, i2) => `T${i2}`); const offsets = new Array(shapes.length - 1); offsets[0] = shapes[0][1]; - for (let i = 1; i < offsets.length; i++) { - offsets[i] = offsets[i - 1] + shapes[i][1]; + for (let i2 = 1; i2 < offsets.length; i2++) { + offsets[i2] = offsets[i2 - 1] + shapes[i2][1]; } const snippets = [`if (yC < ${offsets[0]}) setOutput(getT0(yR, yC));`]; - for (let i = 1; i < offsets.length; i++) { - const shift = offsets[i - 1]; - snippets.push(`else if (yC < ${offsets[i]}) setOutput(getT${i}(yR, yC-${shift}));`); + for (let i2 = 1; i2 < offsets.length; i2++) { + const shift = offsets[i2 - 1]; + snippets.push(`else if (yC < ${offsets[i2]}) setOutput(getT${i2}(yR, yC-${shift}));`); } const lastIndex = offsets.length; const lastShift = offsets[offsets.length - 1]; @@ -54555,11 +54555,11 @@ var ConcatPackedProgram = class { const dtype = getCoordsDataType(rank); const coords3 = getChannels("coords", rank); const channels = ["x", "y", "z", "w", "u", "v"].slice(0, rank); - this.variableNames = shapes.map((_, i) => `T${i}`); + this.variableNames = shapes.map((_, i2) => `T${i2}`); const offsets = new Array(shapes.length - 1); offsets[0] = shapes[0][axis]; - for (let i = 1; i < offsets.length; i++) { - offsets[i] = offsets[i - 1] + shapes[i][axis]; + for (let i2 = 1; i2 < offsets.length; i2++) { + offsets[i2] = offsets[i2 - 1] + shapes[i2][axis]; } const channel = channels[axis]; const lastChannels = channels.slice(-2); @@ -54568,12 +54568,12 @@ var ConcatPackedProgram = class { return getChannel( getT0(${allChannels}), vec2(${lastChannels.join()})); }`; - for (let i = 1; i < offsets.length; i++) { - const shift2 = offsets[i - 1]; + for (let i2 = 1; i2 < offsets.length; i2++) { + const shift2 = offsets[i2 - 1]; getValueSnippet += ` - if (${channel} < ${offsets[i]} && ${channel} >= ${offsets[i - 1]}) { + if (${channel} < ${offsets[i2]} && ${channel} >= ${offsets[i2 - 1]}) { return getChannel( - getT${i}(${shiftedChannels(channels, channel, shift2)}), + getT${i2}(${shiftedChannels(channels, channel, shift2)}), vec2(${shiftedChannels(lastChannels, channel, shift2)})); }`; } @@ -54637,13 +54637,13 @@ var imagConfig2 = { function concatImpl2(inputs, axis, backend2) { const dtype = inputs[0].dtype; if (dtype === "complex64") { - const reals = inputs.map((t) => real3({ inputs: { input: t }, backend: backend2 })); - const imags = inputs.map((t) => imag3({ inputs: { input: t }, backend: backend2 })); + const reals = inputs.map((t2) => real3({ inputs: { input: t2 }, backend: backend2 })); + const imags = inputs.map((t2) => imag3({ inputs: { input: t2 }, backend: backend2 })); const realConcated = concatImpl2(reals, axis, backend2); const imagConcated = concatImpl2(imags, axis, backend2); const result2 = complex3({ inputs: { real: realConcated, imag: imagConcated }, backend: backend2 }); - reals.forEach((r) => backend2.disposeIntermediateTensorInfo(r)); - imags.forEach((i) => backend2.disposeIntermediateTensorInfo(i)); + reals.forEach((r2) => backend2.disposeIntermediateTensorInfo(r2)); + imags.forEach((i2) => backend2.disposeIntermediateTensorInfo(i2)); backend2.disposeIntermediateTensorInfo(realConcated); backend2.disposeIntermediateTensorInfo(imagConcated); return result2; @@ -54653,49 +54653,49 @@ function concatImpl2(inputs, axis, backend2) { runOnCpu = true; } if (runOnCpu) { - const tensors2D2 = inputs.map((t) => { - const innerSize = util_exports.sizeFromShape(t.shape.slice(axis)); + const tensors2D2 = inputs.map((t2) => { + const innerSize = util_exports.sizeFromShape(t2.shape.slice(axis)); const shape = [-1, innerSize]; - return reshape4({ inputs: { x: t }, backend: backend2, attrs: { shape } }); + return reshape4({ inputs: { x: t2 }, backend: backend2, attrs: { shape } }); }); - const inputsValShapes = tensors2D2.map((t) => { - return { vals: backend2.readSync(t.dataId), shape: t.shape }; + const inputsValShapes = tensors2D2.map((t2) => { + return { vals: backend2.readSync(t2.dataId), shape: t2.shape }; }); - const outShape2 = backend_util_exports.computeOutShape(tensors2D2.map((t) => t.shape), 1); + const outShape2 = backend_util_exports.computeOutShape(tensors2D2.map((t2) => t2.shape), 1); const simplyConcat = tensors2D2[0].shape[0] === 1; const outVals = concatImplCPU(inputsValShapes, outShape2, dtype, simplyConcat); - const finalOutShape = backend_util_exports.computeOutShape(inputs.map((t) => t.shape), axis); + const finalOutShape = backend_util_exports.computeOutShape(inputs.map((t2) => t2.shape), axis); const outInfo = backend2.makeTensorInfo(finalOutShape, dtype, outVals); - tensors2D2.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + tensors2D2.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return outInfo; } const maxTexturesInShader = env().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER"); if (inputs.length > maxTexturesInShader) { const reducedInputs = []; - for (let i = 0; i < inputs.length; i += maxTexturesInShader) { - const subArray = inputs.slice(i, i + maxTexturesInShader); + for (let i2 = 0; i2 < inputs.length; i2 += maxTexturesInShader) { + const subArray = inputs.slice(i2, i2 + maxTexturesInShader); reducedInputs.push(concatImpl2(subArray, axis, backend2)); } const result2 = concatImpl2(reducedInputs, axis, backend2); - for (const i of reducedInputs) { - backend2.disposeIntermediateTensorInfo(i); + for (const i2 of reducedInputs) { + backend2.disposeIntermediateTensorInfo(i2); } return result2; } if (env().getBool("WEBGL_PACK_ARRAY_OPERATIONS") && inputs[0].shape.length > 1) { - const program2 = new ConcatPackedProgram(inputs.map((t) => t.shape), axis); + const program2 = new ConcatPackedProgram(inputs.map((t2) => t2.shape), axis); return backend2.runWebGLProgram(program2, inputs, dtype); } const { tensors2D, outShape } = computeTensors2D(inputs, axis, backend2); - const program = new ConcatProgram(tensors2D.map((t) => t.shape)); + const program = new ConcatProgram(tensors2D.map((t2) => t2.shape)); const result = backend2.runWebGLProgram(program, tensors2D, dtype); - tensors2D.forEach((r) => backend2.disposeIntermediateTensorInfo(r)); + tensors2D.forEach((r2) => backend2.disposeIntermediateTensorInfo(r2)); const reshapedResult = reshape4({ inputs: { x: result }, attrs: { shape: outShape }, backend: backend2 }); backend2.disposeIntermediateTensorInfo(result); return reshapedResult; } function computeTensors2D(inputs, axis, backend2) { - const outShape = backend_util_exports.computeOutShape(inputs.map((t) => t.shape), axis); + const outShape = backend_util_exports.computeOutShape(inputs.map((t2) => t2.shape), axis); const tensors2D = inputs.map((x) => reshape4({ inputs: { x }, attrs: { shape: [-1, util_exports.sizeFromShape(x.shape.slice(axis))] }, @@ -54707,15 +54707,15 @@ function concat3(args) { const { inputs, backend: backend2, attrs } = args; const { axis } = attrs; const $axis = util_exports.parseAxisParam(axis, inputs[0].shape)[0]; - const outShape = backend_util_exports.computeOutShape(inputs.map((t) => t.shape), $axis); + const outShape = backend_util_exports.computeOutShape(inputs.map((t2) => t2.shape), $axis); if (util_exports.sizeFromShape(outShape) === 0) { return backend2.makeTensorInfo(outShape, inputs[0].dtype, []); } - const $inputs = inputs.filter((t) => util_exports.sizeFromShape(t.shape) > 0); + const $inputs = inputs.filter((t2) => util_exports.sizeFromShape(t2.shape) > 0); if ($inputs.length === 1) { return identity3({ inputs: { x: $inputs[0] }, backend: backend2 }); } - const shapes = $inputs.map((t) => t.shape); + const shapes = $inputs.map((t2) => t2.shape); backend_util_exports.assertParamsConsistent(shapes, $axis); return concatImpl2($inputs, $axis, backend2); } @@ -55201,8 +55201,8 @@ function conv2dByMatMul({ x, filter, convInfo, backend: backend2, bias = null, p intermediates.push(filterReshaped); intermediates.push(result); } - for (const i of intermediates) { - backend2.disposeIntermediateTensorInfo(i); + for (const i2 of intermediates) { + backend2.disposeIntermediateTensorInfo(i2); } return out; } @@ -55273,8 +55273,8 @@ function conv2dWithIm2Row({ x, filter, convInfo, backend: backend2, bias = null, const product = backend2.runWebGLProgram(matmulProgram, inputs, "float32"); const out = reshape4({ inputs: { x: product }, backend: backend2, attrs: { shape: convInfo.outShape } }); intermediates.push(product); - for (const i of intermediates) { - backend2.disposeIntermediateTensorInfo(i); + for (const i2 of intermediates) { + backend2.disposeIntermediateTensorInfo(i2); } return out; } @@ -55823,9 +55823,9 @@ function cumImpl(op2, x, backend2, axis, exclusive, reverse5) { } const size2 = permutedX.shape[permutedAxis]; let result = identity3({ inputs: { x: permutedX }, backend: backend2 }); - for (let i = 0; i <= Math.ceil(Math.log2(size2)) - 1; i++) { + for (let i2 = 0; i2 <= Math.ceil(Math.log2(size2)) - 1; i2++) { const program = new CumProgram(op2, permutedX.shape, false, reverse5); - const customValues = [[i]]; + const customValues = [[i2]]; const prevResult = result; result = backend2.runWebGLProgram(program, [result], result.dtype, customValues); backend2.disposeIntermediateTensorInfo(prevResult); @@ -56627,8 +56627,8 @@ function einsum3(args) { let out = null; let numDimsRemaining = allDims.length; const tensorsToDispose = []; - for (let i = 0; i < nSteps; ++i) { - for (const idTerm of steps[i]) { + for (let i2 = 0; i2 < nSteps; ++i2) { + for (const idTerm of steps[i2]) { const { permutationIndices: perm, expandDims: dimsToExpand } = backend_util_exports.getEinsumPermutation(numDimsRemaining, idDims[idTerm]); let x; if (backend_util_exports.isIdentityPermutation(perm)) { @@ -56652,13 +56652,13 @@ function einsum3(args) { tensorsToDispose.push(out); } } - if (i < nSteps - 1) { - if (path[i] >= 0) { + if (i2 < nSteps - 1) { + if (path[i2] >= 0) { out = sum4({ inputs: { x: out }, backend: backend2, attrs: { - axis: path[i] - (allDims.length - numDimsRemaining), + axis: path[i2] - (allDims.length - numDimsRemaining), keepDims: false } }); @@ -57181,7 +57181,7 @@ function fusedConv2d(args) { } const outReshaped = reshape4({ inputs: { x: out }, backend: backend2, attrs: { shape: convInfo.outShape } }); intermediates.push(out); - intermediates.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediates.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return outReshaped; } var fusedConv2DConfig2 = { @@ -57230,7 +57230,7 @@ function fusedDepthwiseConv2D2(args) { [convInfo.inHeight, convInfo.inWidth] ]; const result = backend2.runWebGLProgram(program, programInputs, "float32", customValues); - intermediates.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediates.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return result; } var fusedDepthwiseConv2DConfig2 = { @@ -57320,11 +57320,11 @@ var GatherProgram = class { function getSourceCoords2(aShape, axis) { const currentCoords = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"]; const sourceCoords = []; - for (let i = 0; i < aShape.length; i++) { - if (i === 2) { + for (let i2 = 0; i2 < aShape.length; i2++) { + if (i2 === 2) { sourceCoords.push("index"); } else { - sourceCoords.push(`${currentCoords[i]}`); + sourceCoords.push(`${currentCoords[i2]}`); } } return sourceCoords.join(); @@ -57337,8 +57337,8 @@ function gatherV22(args) { if (env().get("DEBUG")) { const indicesVals = backend2.readSync(indices.dataId); const axisDim = x.shape[parsedAxis]; - for (let i = 0; i < indicesVals.length; ++i) { - const index2 = indicesVals[i]; + for (let i2 = 0; i2 < indicesVals.length; ++i2) { + const index2 = indicesVals[i2]; util_exports.assert(index2 <= axisDim - 1 && index2 >= 0, () => `GatherV2: the index value ${index2} is not in [0, ${axisDim - 1}]`); } } @@ -57374,14 +57374,14 @@ function gatherV22(args) { const indicesBuf = backend2.bufferSync(flattenIndex); const xBuf = backend2.bufferSync(flattenX); const outBuf = gatherV2ImplCPU(xBuf, indicesBuf, flattenOutputShape); - toDispose.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + toDispose.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return backend2.makeTensorInfo(shapeInfo.outputShape, outBuf.dtype, outBuf.values); } const program = new GatherProgram(flattenX.shape, flattenOutputShape); const res = backend2.runWebGLProgram(program, [flattenX, flattenIndex], flattenX.dtype); toDispose.push(res); const reshaped = reshape4({ inputs: { x: res }, backend: backend2, attrs: { shape: shapeInfo.outputShape } }); - toDispose.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + toDispose.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return reshaped; } var gatherV2Config2 = { @@ -57794,8 +57794,8 @@ function max4(args) { const xTexData = backend2.texData.get(maxInput.dataId); const values = xTexData.values; const newShape = new Array(xRank); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = x.shape[permutedAxes[i]]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = x.shape[permutedAxes[i2]]; } const maxInputValues = transposeImplCPU(values, x.shape, x.dtype, permutedAxes, newShape); maxInput = backend2.makeTensorInfo(newShape, x.dtype); @@ -58122,8 +58122,8 @@ var meanConfig2 = { const xTexData = webglBackend.texData.get(meanInput.dataId); const values = xTexData.values; const newShape = new Array(xRank); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = x.shape[permutedAxes[i]]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = x.shape[permutedAxes[i2]]; } const meanInputValues = transposeImplCPU(values, x.shape, x.dtype, permutedAxes, newShape); meanInput = webglBackend.makeTensorInfo(newShape, x.dtype); @@ -58142,8 +58142,8 @@ var meanConfig2 = { outShape = backend_util_exports.expandShapeToKeepDim(meanOutShape, origAxes); } const out = meanImpl(meanInput, reduceShape, outShape, webglBackend); - for (const i of intermediates) { - webglBackend.disposeIntermediateTensorInfo(i); + for (const i2 of intermediates) { + webglBackend.disposeIntermediateTensorInfo(i2); } return out; } @@ -58207,11 +58207,11 @@ var minimumConfig2 = { var MirrorPadProgram = class { constructor(xShape, paddings, mode) { this.variableNames = ["x"]; - this.outputShape = paddings.map((p2, i) => p2[0] + xShape[i] + p2[1]); + this.outputShape = paddings.map((p2, i2) => p2[0] + xShape[i2] + p2[1]); const rank = xShape.length; const dtype = getCoordsDataType(rank); const start = paddings.map((p2) => p2[0]).join(","); - const end = paddings.map((p2, i) => p2[0] + xShape[i]).join(","); + const end = paddings.map((p2, i2) => p2[0] + xShape[i2]).join(","); const unpackedCoords = ["coords[0]", "coords[1]", "coords[2]", "coords[3]"].slice(0, rank); const offset = mode === "reflect" ? 0 : 1; if (rank === 1) { @@ -58255,11 +58255,11 @@ var MirrorPadPackedProgram = class { this.variableNames = ["x"]; this.packedInputs = true; this.packedOutput = true; - this.outputShape = paddings.map((p2, i) => p2[0] + xShape[i] + p2[1]); + this.outputShape = paddings.map((p2, i2) => p2[0] + xShape[i2] + p2[1]); const rank = xShape.length; const dtype = getCoordsDataType(rank); const start = paddings.map((p2) => p2[0]).join(","); - const end = paddings.map((p2, i) => p2[0] + xShape[i]).join(","); + const end = paddings.map((p2, i2) => p2[0] + xShape[i2]).join(","); const coords3 = getChannels("rc", rank); const source = getChannels("source", rank); const cLimit = `${coords3[rank - 1]} < ${this.outputShape[rank - 1]}`; @@ -58612,14 +58612,14 @@ function zerosLike3(args) { const { x } = inputs; if (x.dtype === "complex64") { const realPart = real3({ inputs: { input: x }, backend: backend2 }); - const r = zerosLike3({ inputs: { x: realPart }, backend: backend2 }); + const r2 = zerosLike3({ inputs: { x: realPart }, backend: backend2 }); const imagPart = imag3({ inputs: { input: x }, backend: backend2 }); - const i = zerosLike3({ inputs: { x: imagPart }, backend: backend2 }); - const result = complex3({ inputs: { real: r, imag: i }, backend: backend2 }); + const i2 = zerosLike3({ inputs: { x: imagPart }, backend: backend2 }); + const result = complex3({ inputs: { real: r2, imag: i2 }, backend: backend2 }); backend2.disposeIntermediateTensorInfo(realPart); - backend2.disposeIntermediateTensorInfo(r); + backend2.disposeIntermediateTensorInfo(r2); backend2.disposeIntermediateTensorInfo(imagPart); - backend2.disposeIntermediateTensorInfo(i); + backend2.disposeIntermediateTensorInfo(i2); return result; } else { return fill3({ @@ -58644,14 +58644,14 @@ function onesLike3(args) { throw new Error("onesLike is not supported under string dtype"); } else if (x.dtype === "complex64") { const realPart = real3({ inputs: { input: x }, backend: backend2 }); - const r = onesLike3({ inputs: { x: realPart }, backend: backend2 }); + const r2 = onesLike3({ inputs: { x: realPart }, backend: backend2 }); const imagPart = imag3({ inputs: { input: x }, backend: backend2 }); - const i = zerosLike3({ inputs: { x: imagPart }, backend: backend2 }); - const result = complex3({ inputs: { real: r, imag: i }, backend: backend2 }); + const i2 = zerosLike3({ inputs: { x: imagPart }, backend: backend2 }); + const result = complex3({ inputs: { real: r2, imag: i2 }, backend: backend2 }); backend2.disposeIntermediateTensorInfo(realPart); - backend2.disposeIntermediateTensorInfo(r); + backend2.disposeIntermediateTensorInfo(r2); backend2.disposeIntermediateTensorInfo(imagPart); - backend2.disposeIntermediateTensorInfo(i); + backend2.disposeIntermediateTensorInfo(i2); return result; } else { return fill3({ attrs: { shape: x.shape, dtype: x.dtype, value: 1 }, backend: backend2 }); @@ -58670,18 +58670,18 @@ function pack2(args) { } const shape = inputs[0].shape; const dtype = inputs[0].dtype; - inputs.forEach((t) => { - util_exports.assertShapesMatch(shape, t.shape, "All tensors passed to stack must have matching shapes"); - util_exports.assert(dtype === t.dtype, () => "All tensors passed to stack must have matching dtypes"); + inputs.forEach((t2) => { + util_exports.assertShapesMatch(shape, t2.shape, "All tensors passed to stack must have matching shapes"); + util_exports.assert(dtype === t2.dtype, () => "All tensors passed to stack must have matching dtypes"); }); const intermediateTensorInfos = []; - const expandedTensors = inputs.map((t) => { - const expandedT = expandDims4({ inputs: { input: t }, backend: backend2, attrs: { dim: axis } }); + const expandedTensors = inputs.map((t2) => { + const expandedT = expandDims4({ inputs: { input: t2 }, backend: backend2, attrs: { dim: axis } }); intermediateTensorInfos.push(expandedT); return expandedT; }); const result = concat3({ inputs: expandedTensors, backend: backend2, attrs: { axis } }); - intermediateTensorInfos.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + intermediateTensorInfos.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return result; } var packConfig2 = { @@ -58693,11 +58693,11 @@ var PadProgram = class { constructor(xShape, paddings, constantValue) { this.variableNames = ["x"]; this.customUniforms = [{ name: "value", type: "float" }]; - this.outputShape = paddings.map((p2, i) => p2[0] + xShape[i] + p2[1]); + this.outputShape = paddings.map((p2, i2) => p2[0] + xShape[i2] + p2[1]); const rank = xShape.length; const type = getCoordsDataType(rank); const start = paddings.map((p2) => p2[0]).join(","); - const end = paddings.map((p2, i) => p2[0] + xShape[i]).join(","); + const end = paddings.map((p2, i2) => p2[0] + xShape[i2]).join(","); const unpackedCoords = ["coords[0]", "coords[1]", "coords[2]", "coords[3]"].slice(0, rank); if (rank === 1) { this.userCode = ` @@ -58737,11 +58737,11 @@ var PadPackedProgram = class { this.packedInputs = true; this.packedOutput = true; this.customUniforms = [{ name: "value", type: "float" }]; - this.outputShape = paddings.map((p2, i) => p2[0] + xShape[i] + p2[1]); + this.outputShape = paddings.map((p2, i2) => p2[0] + xShape[i2] + p2[1]); const rank = xShape.length; const dtype = getCoordsDataType(rank); const start = paddings.map((p2) => p2[0]).join(","); - const end = paddings.map((p2, i) => p2[0] + xShape[i]).join(","); + const end = paddings.map((p2, i2) => p2[0] + xShape[i2]).join(","); const coords3 = getChannels("rc", rank); const source = getChannels("source", rank); const cLimit = `${coords3[rank - 1]} < ${this.outputShape[rank - 1]}`; @@ -58760,14 +58760,14 @@ var PadPackedProgram = class { ]; const paddingArea = rank === 1 ? "rc < start || rc >= end" : "any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))"; let mainLoop = ""; - for (let i = 0, j = rank === 1 ? 2 : 4; i < j; i++) { + for (let i2 = 0, j = rank === 1 ? 2 : 4; i2 < j; i2++) { mainLoop += ` - ${componentSetup[i]} + ${componentSetup[i2]} if (${paddingArea}) { - result[${i}] = float(value); + result[${i2}] = float(value); } else { ${dtype} source = rc - start; - result[${i}] = getChannel(getX(${source.join()}), ${innerDims}); + result[${i2}] = getChannel(getX(${source.join()}), ${innerDims}); } `; } @@ -58790,7 +58790,7 @@ var padV22 = (args) => { const { x } = inputs; const { paddings, constantValue } = attrs; if (util_exports.sizeFromShape(x.shape) === 0) { - const outputShape = paddings.map((p2, i) => p2[0] + x.shape[i] + p2[1]); + const outputShape = paddings.map((p2, i2) => p2[0] + x.shape[i2] + p2[1]); return fill3({ backend: backend2, attrs: { shape: outputShape, value: constantValue, dtype: x.dtype } @@ -58874,7 +58874,7 @@ function prod3(args) { const newShape = backend_util_exports.expandShapeToKeepDim(res.shape, origAxes); res = reshape4({ inputs: { x: res }, backend: backend2, attrs: { shape: newShape } }); } - toDispose.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + toDispose.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return res; } var prodConfig2 = { @@ -59477,13 +59477,13 @@ var ReverseProgram = class { `; return; } - const getInCoord = (i) => { - if (axis.indexOf(i) !== -1 && xShape[i] !== 1) { - return `${xShape[i]} - coords[${i}] - 1`; + const getInCoord = (i2) => { + if (axis.indexOf(i2) !== -1 && xShape[i2] !== 1) { + return `${xShape[i2]} - coords[${i2}] - 1`; } - return `coords[${i}]`; + return `coords[${i2}]`; }; - const inCoords = xShape.map((_, i) => getInCoord(i)).join(","); + const inCoords = xShape.map((_, i2) => getInCoord(i2)).join(","); const type = getCoordsDataType(rank); this.userCode = ` void main() { @@ -59557,16 +59557,16 @@ var ReversePackedProgram = class { return getChannel(channels2); } function getChannel(channels2) { - const inCoordsArray = xShape.map((_, i) => getInCoord(i, channels2)); + const inCoordsArray = xShape.map((_, i2) => getInCoord(i2, channels2)); const inCoords = inCoordsArray.join(","); const innerDims = inCoordsArray.slice(-2).join(","); return `getChannel(getX(${inCoords}), vec2(${innerDims}))`; } - function getInCoord(i, channels1) { - if (axis.indexOf(i) !== -1 && xShape[i] !== 1) { - return `${xShape[i]} - ${channels1[i]} - 1`; + function getInCoord(i2, channels1) { + if (axis.indexOf(i2) !== -1 && xShape[i2] !== 1) { + return `${xShape[i2]} - ${channels1[i2]} - 1`; } else { - return `${channels1[i]}`; + return `${channels1[i2]}`; } } } @@ -59803,10 +59803,10 @@ var SelectProgram = class { const currentCoords = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"]; const cCoordVars = []; const abCoordVars = []; - for (let i = 0; i < shape.length; i++) { - abCoordVars.push(`${currentCoords[i]}`); - if (i < cRank) { - cCoordVars.push(`${currentCoords[i]}`); + for (let i2 = 0; i2 < shape.length; i2++) { + abCoordVars.push(`${currentCoords[i2]}`); + if (i2 < cRank) { + cCoordVars.push(`${currentCoords[i2]}`); } } cCoords = cCoordVars.join(); @@ -59828,9 +59828,9 @@ var SelectProgram = class { }; function select3(args) { const { inputs, backend: backend2 } = args; - const { condition, t, e } = inputs; - const program = new SelectProgram(condition.shape.length, t.shape, t.shape.length); - return backend2.runWebGLProgram(program, [condition, t, e], upcastType(t.dtype, e.dtype)); + const { condition, t: t2, e: e2 } = inputs; + const program = new SelectProgram(condition.shape.length, t2.shape, t2.shape.length); + return backend2.runWebGLProgram(program, [condition, t2, e2], upcastType(t2.dtype, e2.dtype)); } var selectConfig2 = { kernelName: Select, @@ -59938,7 +59938,7 @@ var spaceToBatchND3 = (args) => { const prod6 = blockShape.reduce((a, b) => a * b); const completePaddings = [[0, 0]]; completePaddings.push(...paddings); - for (let i = 1 + blockShape.length; i < x.shape.length; ++i) { + for (let i2 = 1 + blockShape.length; i2 < x.shape.length; ++i2) { completePaddings.push([0, 0]); } const toDispose = []; @@ -59960,7 +59960,7 @@ var spaceToBatchND3 = (args) => { toDispose.push(paddedX); toDispose.push(reshapedPaddedX); toDispose.push(paddedXT); - toDispose.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + toDispose.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return result; }; var spaceToBatchNDConfig2 = { @@ -60113,11 +60113,11 @@ function splitV2(args) { const xRank = x.shape.length; const begin = new Array(xRank).fill(0); const size2 = x.shape.slice(); - return splitSizes.map((s) => { + return splitSizes.map((s2) => { const sliceSize = [...size2]; - sliceSize[$axis] = s; + sliceSize[$axis] = s2; const sliceT = slice3({ inputs: { x }, backend: backend2, attrs: { begin, size: sliceSize } }); - begin[$axis] += s; + begin[$axis] += s2; return sliceT; }); } @@ -60172,9 +60172,9 @@ var StridedSliceProgram = class { newCoords = "coords * strides + begin"; } else { let outputAxis = 0; - newCoords = size2.map((_, i) => { + newCoords = size2.map((_, i2) => { outputAxis++; - return size2.length === 1 ? `coords * strides[${i}] + begin[${i}]` : `coords[${outputAxis - 1}] * strides[${i}] + begin[${i}]`; + return size2.length === 1 ? `coords * strides[${i2}] + begin[${i2}]` : `coords[${outputAxis - 1}] * strides[${i2}] + begin[${i2}]`; }).join(","); } this.userCode = ` @@ -60308,8 +60308,8 @@ var TileProgram = class { constructor(aShape, reps) { this.variableNames = ["A"]; const outputShape = new Array(aShape.length); - for (let i = 0; i < outputShape.length; i++) { - outputShape[i] = aShape[i] * reps[i]; + for (let i2 = 0; i2 < outputShape.length; i2++) { + outputShape[i2] = aShape[i2] * reps[i2]; } this.outputShape = outputShape; this.rank = outputShape.length; @@ -60333,8 +60333,8 @@ function getSourceCoords3(aShape) { } const currentCoords = ["resRC.x", "resRC.y", "resRC.z", "resRC.w", "resRC.u"]; const sourceCoords = []; - for (let i = 0; i < aShape.length; i++) { - sourceCoords.push(`imod(${currentCoords[i]}, ${aShape[i]})`); + for (let i2 = 0; i2 < aShape.length; i2++) { + sourceCoords.push(`imod(${currentCoords[i2]}, ${aShape[i2]})`); } return sourceCoords.join(); } @@ -60749,9 +60749,9 @@ function unpack2(args) { const num = value.shape[axis]; const outShape = new Array(xRank - 1); let outIndex = 0; - for (let i = 0; i < xRank; i++) { - if (i !== axis) { - outShape[outIndex++] = x.shape[i]; + for (let i2 = 0; i2 < xRank; i2++) { + if (i2 !== axis) { + outShape[outIndex++] = x.shape[i2]; } } const toDispose = []; @@ -60759,14 +60759,14 @@ function unpack2(args) { const size2 = x.shape.slice(); size2[axis] = 1; const res = new Array(num); - for (let i = 0; i < res.length; i++) { - begin[axis] = i; + for (let i2 = 0; i2 < res.length; i2++) { + begin[axis] = i2; const sliced = slice3({ inputs: { x }, backend: backend2, attrs: { begin, size: size2 } }); const reshaped = reshape4({ inputs: { x: sliced }, backend: backend2, attrs: { shape: outShape } }); - res[i] = reshaped; + res[i2] = reshaped; toDispose.push(sliced); } - toDispose.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + toDispose.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return res; } var unpackConfig2 = { @@ -60957,7 +60957,7 @@ function unsortedSegmentSum3(args) { const perm = backend_util_exports.getUndoAxesPermutation(permutation); result = transpose3({ inputs: { x: result }, backend: backend2, attrs: { perm } }); } - toDispose.forEach((t) => backend2.disposeIntermediateTensorInfo(t)); + toDispose.forEach((t2) => backend2.disposeIntermediateTensorInfo(t2)); return result; } var unsortedSegmentSumConfig2 = { @@ -61323,8 +61323,8 @@ function transpose4(args) { const { inputs, backend: backend2, attrs } = args; const [reducedShape, perm] = removeOneSizeDims(inputs.x.shape, attrs.perm); let permIsNoOp = true; - for (let i = 0; i < perm.length; i++) { - if (perm[i] !== i) { + for (let i2 = 0; i2 < perm.length; i2++) { + if (perm[i2] !== i2) { permIsNoOp = false; } } @@ -61349,30 +61349,30 @@ function transpose4(args) { } function computeOutShape4(inShape, perm) { const outShape = new Array(inShape.length); - for (let i = 0; i < outShape.length; i++) { - outShape[i] = inShape[perm[i]]; + for (let i2 = 0; i2 < outShape.length; i2++) { + outShape[i2] = inShape[perm[i2]]; } return outShape; } function removeOneSizeDims(shape, perm) { const newShape = []; const newPerm = []; - for (let i = 0; i < shape.length; ++i) { - if (shape[i] !== 1) { - newShape.push(shape[i]); + for (let i2 = 0; i2 < shape.length; ++i2) { + if (shape[i2] !== 1) { + newShape.push(shape[i2]); } - if (shape[perm[i]] !== 1) { - newPerm.push(perm[i]); + if (shape[perm[i2]] !== 1) { + newPerm.push(perm[i2]); } } - for (let i = 0; i < newPerm.length; ++i) { + for (let i2 = 0; i2 < newPerm.length; ++i2) { let minValIdx = -1; for (let j = 0; j < newPerm.length; ++j) { - if (newPerm[j] >= i && (minValIdx === -1 || newPerm[minValIdx] > newPerm[j])) { + if (newPerm[j] >= i2 && (minValIdx === -1 || newPerm[minValIdx] > newPerm[j])) { minValIdx = j; } } - newPerm[minValIdx] = i; + newPerm[minValIdx] = i2; } return [newShape, newPerm]; } @@ -61392,8 +61392,8 @@ function permuteAxesAndTranspose(x, axis, backend2) { let inputWasTransposed = false; if (permutedAxes != null) { const newShape = new Array(xRank); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = xShape[permutedAxes[i]]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = xShape[permutedAxes[i2]]; } axes = backend_util_exports.getInnerMostAxes(axes.length, xRank); xTransposed = transpose4({ inputs: { x }, attrs: { perm: permutedAxes }, backend: backend2 }); @@ -61696,8 +61696,8 @@ function slice2d2(xVals, xStride, outVals, begin, size2) { const beginI = begin[0]; const beginJ = begin[1]; const endI = beginI + size2[0]; - for (let i = beginI; i < endI; i++) { - const xOffset = i * xStride + beginJ; + for (let i2 = beginI; i2 < endI; i2++) { + const xOffset = i2 * xStride + beginJ; outVals.set(xVals.subarray(xOffset, xOffset + size2[1]), outOffset); outOffset += size2[1]; } @@ -61709,9 +61709,9 @@ function slice3d2(xVals, xStride1, xStride2, outVals, begin, size2) { const beginK = begin[2]; const endI = beginI + size2[0]; const endJ = beginJ + size2[1]; - for (let i = beginI; i < endI; i++) { + for (let i2 = beginI; i2 < endI; i2++) { for (let j = beginJ; j < endJ; j++) { - const xOffset = i * xStride1 + j * xStride2 + beginK; + const xOffset = i2 * xStride1 + j * xStride2 + beginK; outVals.set(xVals.subarray(xOffset, xOffset + size2[2]), outOffset); outOffset += size2[2]; } @@ -61726,10 +61726,10 @@ function slice4d2(xVals, xStride1, xStride2, xStride3, outVals, begin, size2) { const endJ = beginJ + size2[1]; const endK = beginK + size2[2]; const beginL = begin[3]; - for (let i = beginI; i < endI; i++) { + for (let i2 = beginI; i2 < endI; i2++) { for (let j = beginJ; j < endJ; j++) { for (let k = beginK; k < endK; k++) { - const xOffset = i * xStride1 + j * xStride2 + k * xStride3 + beginL; + const xOffset = i2 * xStride1 + j * xStride2 + k * xStride3 + beginL; outVals.set(xVals.subarray(xOffset, xOffset + size2[3]), outOffset); outOffset += size2[3]; } @@ -61811,8 +61811,8 @@ var clipByValueConfig3 = { function concat4(args) { const { inputs, backend: backend2 } = args; const axis = util_exports.parseAxisParam(args.attrs.axis, inputs[0].shape)[0]; - let outShape = backend_util_exports.computeOutShape(inputs.map((t) => t.shape), axis); - const $inputs = inputs.filter((t) => util_exports.sizeFromShape(t.shape) > 0); + let outShape = backend_util_exports.computeOutShape(inputs.map((t2) => t2.shape), axis); + const $inputs = inputs.filter((t2) => util_exports.sizeFromShape(t2.shape) > 0); if ($inputs.length === 1) { return identity4({ inputs: { x: $inputs[0] }, backend: backend2 }); } @@ -61820,25 +61820,25 @@ function concat4(args) { if (util_exports.sizeFromShape(outShape) === 0) { return out; } - const shapes = $inputs.map((t) => t.shape); + const shapes = $inputs.map((t2) => t2.shape); backend_util_exports.assertParamsConsistent(shapes, axis); if ($inputs[0].dtype === "string") { - const inputs2D = $inputs.map((t) => { - const innerSize = util_exports.sizeFromShape(t.shape.slice(axis)); + const inputs2D = $inputs.map((t2) => { + const innerSize = util_exports.sizeFromShape(t2.shape.slice(axis)); const shape = [-1, innerSize]; - return reshape5({ inputs: { x: t }, backend: backend2, attrs: { shape } }); + return reshape5({ inputs: { x: t2 }, backend: backend2, attrs: { shape } }); }); - const inputsValShapes = inputs2D.map((t) => { - return { vals: backend2.readSync(t.dataId), shape: t.shape }; + const inputsValShapes = inputs2D.map((t2) => { + return { vals: backend2.readSync(t2.dataId), shape: t2.shape }; }); - outShape = backend_util_exports.computeOutShape(inputs2D.map((t) => t.shape), 1); + outShape = backend_util_exports.computeOutShape(inputs2D.map((t2) => t2.shape), 1); const simplyConcat = inputs2D[0].shape[0] === 1; const outVals2 = concatImpl(inputsValShapes, outShape, inputs[0].dtype, simplyConcat); - const finalOutShape = backend_util_exports.computeOutShape($inputs.map((t) => t.shape), axis); + const finalOutShape = backend_util_exports.computeOutShape($inputs.map((t2) => t2.shape), axis); out.shape = finalOutShape; const outData = backend2.dataIdMap.get(out.dataId); outData.stringBytes = backend_util_exports.fromStringArrayToUint8(outVals2); - inputs2D.forEach((t) => backend2.disposeData(t.dataId)); + inputs2D.forEach((t2) => backend2.disposeData(t2.dataId)); return out; } const batchDim = util_exports.sizeFromShape($inputs[0].shape.slice(0, axis)); @@ -61852,10 +61852,10 @@ function concat4(args) { const outVals = backend2.typedArrayFromHeap(out); for (let b = 0; b < batchDim; b++) { let outOffset = b * sumInnerDims; - for (let i = 0; i < inVals.length; i++) { - const innerDim = innerDims[i]; + for (let i2 = 0; i2 < inVals.length; i2++) { + const innerDim = innerDims[i2]; const inOffset = b * innerDim; - const vals = inVals[i].subarray(inOffset, inOffset + innerDim); + const vals = inVals[i2].subarray(inOffset, inOffset + innerDim); outVals.set(vals, outOffset); outOffset += innerDim; } @@ -62548,8 +62548,8 @@ function gatherV23(args) { const parsedAxis = util_exports.parseAxisParam(axis, x.shape)[0]; const indicesVals = backend2.readSync(indices.dataId); const axisDim = x.shape[parsedAxis]; - for (let i = 0; i < indicesVals.length; ++i) { - const index2 = indicesVals[i]; + for (let i2 = 0; i2 < indicesVals.length; ++i2) { + const index2 = indicesVals[i2]; util_exports.assert(index2 <= axisDim - 1 && index2 >= 0, () => `GatherV2: the index value ${index2} is not in [0, ${axisDim - 1}]`); } const shapeInfo = backend_util_exports.segment_util.collectGatherOpShapeInfo(x, indices, parsedAxis, batchDims); @@ -62867,7 +62867,7 @@ function setup26(backend2) { } function mirrorPad3(args) { const { inputs: { x }, backend: backend2, attrs: { paddings, mode } } = args; - const outShape = paddings.map((p2, i) => p2[0] + x.shape[i] + p2[1]); + const outShape = paddings.map((p2, i2) => p2[0] + x.shape[i2] + p2[1]); const xId = backend2.dataIdMap.get(x.dataId).id; const out = backend2.makeOutput(outShape, x.dtype); const outId = backend2.dataIdMap.get(out.dataId).id; @@ -63047,18 +63047,18 @@ function pack3(args) { } const shape = inputs[0].shape; const dtype = inputs[0].dtype; - inputs.forEach((t) => { - util_exports.assertShapesMatch(shape, t.shape, "All tensors passed to stack must have matching shapes"); - util_exports.assert(dtype === t.dtype, () => "All tensors passed to stack must have matching dtypes"); + inputs.forEach((t2) => { + util_exports.assertShapesMatch(shape, t2.shape, "All tensors passed to stack must have matching shapes"); + util_exports.assert(dtype === t2.dtype, () => "All tensors passed to stack must have matching dtypes"); }); const intermediateTensorInfos = []; - const expandedTensors = inputs.map((t) => { - const expandedT = expandDims5({ inputs: { input: t }, backend: backend2, attrs: { dim: axis } }); + const expandedTensors = inputs.map((t2) => { + const expandedT = expandDims5({ inputs: { input: t2 }, backend: backend2, attrs: { dim: axis } }); intermediateTensorInfos.push(expandedT); return expandedT; }); const result = concat4({ inputs: expandedTensors, backend: backend2, attrs: { axis } }); - intermediateTensorInfos.forEach((t) => backend2.disposeData(t.dataId)); + intermediateTensorInfos.forEach((t2) => backend2.disposeData(t2.dataId)); return result; } var packConfig3 = { @@ -63081,7 +63081,7 @@ function setup31(backend2) { } function pad2(args) { const { inputs: { x }, backend: backend2, attrs: { paddings, constantValue } } = args; - const outShape = paddings.map((p2, i) => p2[0] + x.shape[i] + p2[1]); + const outShape = paddings.map((p2, i2) => p2[0] + x.shape[i2] + p2[1]); if (util_exports.sizeFromShape(x.shape) === 0) { return fill4({ backend: backend2, @@ -63430,15 +63430,15 @@ function setup39(backend2) { } function select4(args) { const { inputs, backend: backend2 } = args; - const { condition, t, e } = inputs; + const { condition, t: t2, e: e2 } = inputs; const conditionId = backend2.dataIdMap.get(condition.dataId).id; - const tId = backend2.dataIdMap.get(t.dataId).id; - const eId = backend2.dataIdMap.get(e.dataId).id; - const out = backend2.makeOutput(t.shape, t.dtype); + const tId = backend2.dataIdMap.get(t2.dataId).id; + const eId = backend2.dataIdMap.get(e2.dataId).id; + const out = backend2.makeOutput(t2.shape, t2.dtype); const outId = backend2.dataIdMap.get(out.dataId).id; const cRank = condition.shape.length; - const tRank = t.shape.length; - const offset = cRank === 0 || cRank > 1 || tRank === 1 ? 1 : util_exports.sizeFromShape(t.shape.slice(1)); + const tRank = t2.shape.length; + const offset = cRank === 0 || cRank > 1 || tRank === 1 ? 1 : util_exports.sizeFromShape(t2.shape.slice(1)); wasmSelect(conditionId, tId, eId, offset, outId); return out; } @@ -63505,7 +63505,7 @@ function spaceToBatchND4(args) { const prod6 = util_exports.sizeFromShape(blockShape); const completePaddings = [[0, 0]]; completePaddings.push(...paddings); - for (let i = 1 + blockShape.length; i < x.shape.length; ++i) { + for (let i2 = 1 + blockShape.length; i2 < x.shape.length; ++i2) { completePaddings.push([0, 0]); } const paddedX = padV2Config3.kernelFunc({ @@ -63788,11 +63788,11 @@ function splitV3(args) { const splitSizes = backend_util_exports.prepareSplitSize(x, numOrSizeSplits, $axis); const begin = new Array(x.shape.length).fill(0); const size2 = x.shape.slice(); - return splitSizes.map((s) => { + return splitSizes.map((s2) => { const xSliceSize = [...size2]; - xSliceSize[$axis] = s; + xSliceSize[$axis] = s2; const xSlice = slice4({ inputs: { x }, attrs: { begin, size: xSliceSize }, backend: backend2 }); - begin[$axis] += s; + begin[$axis] += s2; return xSlice; }); } @@ -64011,8 +64011,8 @@ function tile5(args) { const xId = backend2.dataIdMap.get(x.dataId).id; const { reps } = attrs; const newShape = new Array(x.shape.length); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = x.shape[i] * reps[i]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = x.shape[i2] * reps[i2]; } const xShapeBytes = new Uint8Array(new Int32Array(x.shape).buffer); const newShapeBytes = new Uint8Array(new Int32Array(newShape).buffer); @@ -64138,18 +64138,18 @@ function unpack3(args) { const rank = value.shape.length; const outShape = new Array(rank - 1); let outIndex = 0; - for (let i = 0; i < rank; i++) { - if (i !== axis) { - outShape[outIndex++] = value.shape[i]; + for (let i2 = 0; i2 < rank; i2++) { + if (i2 !== axis) { + outShape[outIndex++] = value.shape[i2]; } } const outs = new Array(numOutputs); const begin = new Array(rank).fill(0); const size2 = value.shape.slice(); size2[axis] = 1; - for (let i = 0; i < outs.length; i++) { - begin[axis] = i; - outs[i] = slice4({ inputs: { x: value }, attrs: { begin, size: size2 }, backend: backend2 }); + for (let i2 = 0; i2 < outs.length; i2++) { + begin[axis] = i2; + outs[i2] = slice4({ inputs: { x: value }, attrs: { begin, size: size2 }, backend: backend2 }); } return outs.map(({ dataId, dtype }) => ({ dataId, dtype, shape: outShape })); } @@ -64363,7 +64363,7 @@ ENV6.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT", async () => { 26, 11 ])); - } catch (e) { + } catch (e2) { return false; } }); @@ -65051,8 +65051,8 @@ function symbolicallyComputeStrides2(indicesArr, variableName) { const shape = indicesArr.map((d) => `${variableName}[${d}]`); const strides2 = new Array(numCoords - 1); strides2[numCoords - 2] = shape[numCoords - 1]; - for (let i = numCoords - 3; i >= 0; --i) { - strides2[i] = `(${strides2[i + 1]} * ${shape[i + 1]})`; + for (let i2 = numCoords - 3; i2 >= 0; --i2) { + strides2[i2] = `(${strides2[i2 + 1]} * ${shape[i2 + 1]})`; } return strides2; } @@ -65169,8 +65169,8 @@ function makeShader2(inputInfo, outputData, program) { let preMemberIsStruct = false; let currentMemberIsStruct = false; let uniformDeclaration = "struct Uniforms { NAN : f32, "; - program.variableNames.forEach((x, i) => { - const perDataType = getCoordsDataType2(inputInfo[i].shape.length); + program.variableNames.forEach((x, i2) => { + const perDataType = getCoordsDataType2(inputInfo[i2].shape.length); if (perDataType === "vec5" || perDataType === "vec6") { currentMemberIsStruct = true; } @@ -65220,9 +65220,9 @@ function makeShader2(inputInfo, outputData, program) { @group(0) @binding(0) var result: array<${mapToWgslTypes(outputData.dtype, program.isVec4)}>; `); } - program.variableNames.forEach((x, i) => { + program.variableNames.forEach((x, i2) => { prefixSnippets.push(` - @group(0) @binding(${1 + i}) var ${x}: array<${program.variableTypes ? program.variableTypes[i] : mapToWgslTypes(inputInfo[i].dtype, program.isVec4)}>; + @group(0) @binding(${1 + i2}) var ${x}: array<${program.variableTypes ? program.variableTypes[i2] : mapToWgslTypes(inputInfo[i2].dtype, program.isVec4)}>; `); }); if (uniformDeclaration !== "") { @@ -65241,7 +65241,7 @@ function makeShader2(inputInfo, outputData, program) { if (!program.atomic) { sources.push(setOutputSnippet(outputData.shape, outputData.dtype, program.isVec4)); } - const inputSnippet = inputInfo.map((x, i) => getInputSnippet(x, outputData.shape, program.variableTypes ? program.variableTypes[i] === "vec4" : program.isVec4, program.dispatchLayout.x.length === outputData.shape.length)).join("\n"); + const inputSnippet = inputInfo.map((x, i2) => getInputSnippet(x, outputData.shape, program.variableTypes ? program.variableTypes[i2] === "vec4" : program.isVec4, program.dispatchLayout.x.length === outputData.shape.length)).join("\n"); sources.push(inputSnippet); sources.push(program.getUserCode()); const source = sources.join("\n"); @@ -65327,8 +65327,8 @@ function getCoordsFromIndexSnippet(shape) { const strides2 = util_exports.computeStrides(shape); const dtype = getCoordsDataType2(rank); const coords3 = []; - for (let i = 0; i < rank; i++) { - coords3.push(`d${i}`); + for (let i2 = 0; i2 < rank; i2++) { + coords3.push(`d${i2}`); } if (strides2.length === 1) { return ` fn getCoordsFromIndex(index : i32) -> vec2 { @@ -65337,9 +65337,9 @@ function getCoordsFromIndexSnippet(shape) { }`; } let snippet; - snippet = "var index2 = index;" + strides2.map((_, i) => { - const line1 = `let ${coords3[i]} = index2 / uniforms.outShapeStrides.${getCoordsXYZ(i)}`; - const line2 = i === strides2.length - 1 ? `let ${coords3[i + 1]} = index2 - ${coords3[i]} * uniforms.outShapeStrides.${getCoordsXYZ(i)}` : `index2 = index2 - ${coords3[i]} * uniforms.outShapeStrides.${getCoordsXYZ(i)}`; + snippet = "var index2 = index;" + strides2.map((_, i2) => { + const line1 = `let ${coords3[i2]} = index2 / uniforms.outShapeStrides.${getCoordsXYZ(i2)}`; + const line2 = i2 === strides2.length - 1 ? `let ${coords3[i2 + 1]} = index2 - ${coords3[i2]} * uniforms.outShapeStrides.${getCoordsXYZ(i2)}` : `index2 = index2 - ${coords3[i2]} * uniforms.outShapeStrides.${getCoordsXYZ(i2)}`; return `${line1}; ${line2};`; }).join(""); return ` @@ -65457,7 +65457,7 @@ function getInputByOutputSnippet(inputInfo, outShape, isVec4, isFlatDispatchLayo } else { if (outRank > 1) { const coordsType = getCoordsDataType2(inRank); - const coordsValues = inputInfo.shape.map((s, i) => `coords.${getCoordsXYZ(i + rankDiff)}`).join(", "); + const coordsValues = inputInfo.shape.map((s2, i2) => `coords.${getCoordsXYZ(i2 + rankDiff)}`).join(", "); unpackedCoordsSnippet = `${coordsType}(${coordsValues})`; } else { unpackedCoordsSnippet = "coords"; @@ -65517,30 +65517,30 @@ function getOutputCoordsSnippet(outShape, dispatchLayout) { let gatherDimensionsStr = ""; const dims = [x, y, z]; let rank = 0; - for (let i = 0; i < dims.length; i++) { - const arr = dims[i]; + for (let i2 = 0; i2 < dims.length; i2++) { + const arr = dims[i2]; if (arr.length === 0) { continue; } rank += arr.length; if (arr.length === 1) { - gatherDimensionsStr += `let d${arr[0]} = i32(globalId[${i}]);`; + gatherDimensionsStr += `let d${arr[0]} = i32(globalId[${i2}]);`; } else { const strides2 = symbolicallyComputeStrides2(arr, "uniforms.outShape"); - gatherDimensionsStr += `var index${i} = i32(globalId[${i}]);`; + gatherDimensionsStr += `var index${i2} = i32(globalId[${i2}]);`; for (let j = 0; j < strides2.length; j++) { - gatherDimensionsStr += `let d${arr[j]} = index${i} / ${strides2[j]};`; + gatherDimensionsStr += `let d${arr[j]} = index${i2} / ${strides2[j]};`; if (j === strides2.length - 1) { - gatherDimensionsStr += `let d${arr[j + 1]} = index${i} - d${arr[j]} * ${strides2[j]};`; + gatherDimensionsStr += `let d${arr[j + 1]} = index${i2} - d${arr[j]} * ${strides2[j]};`; } else { - gatherDimensionsStr += `index${i} = index${i} - d${arr[j]} * ${strides2[j]};`; + gatherDimensionsStr += `index${i2} = index${i2} - d${arr[j]} * ${strides2[j]};`; } } } } const dimensions = []; - for (let i = 0; i < rank; i++) { - dimensions.push(`d${i}`); + for (let i2 = 0; i2 < rank; i2++) { + dimensions.push(`d${i2}`); } const dtype = getCoordsDataType2(rank); let snippet = `fn getOutputCoords() -> ${dtype} { @@ -65691,8 +65691,8 @@ __export2(webgpu_util_exports, { }); var arrayProduct = (arr) => { let product = 1; - for (let i = 0; i < arr.length; i++) { - product *= arr[i]; + for (let i2 = 0; i2 < arr.length; i2++) { + product *= arr[i2]; } return product; }; @@ -65747,7 +65747,7 @@ function computeWorkPerThreadForConv2d(layout, outputShape, isVec4 = false) { return [2, 2, 1]; } function flatDispatchLayout(shape) { - return { x: shape.map((d, i) => i) }; + return { x: shape.map((d, i2) => i2) }; } function GPUBytesPerElement(dtype) { if (dtype === "float32" || dtype === "int32" || dtype === "bool" || dtype === "string") { @@ -66681,8 +66681,8 @@ function batchMatMulImpl2({ a, b, transposeA, transposeB, backend: backend2, bia intermediates.push(out); const outReshaped2 = reshape6({ inputs: { x: outActivated }, backend: backend2, attrs: { shape: outShape } }); intermediates.push(outActivated); - for (const i of intermediates) { - backend2.disposeData(i.dataId); + for (const i2 of intermediates) { + backend2.disposeData(i2.dataId); } return outReshaped2; } @@ -66710,8 +66710,8 @@ function batchMatMulImpl2({ a, b, transposeA, transposeB, backend: backend2, bia out = backend2.runWebGPUProgram(program, inputs, a.dtype, dimensions, out); const outReshaped = reshape6({ inputs: { x: out }, backend: backend2, attrs: { shape: outShape } }); intermediates.push(out); - for (const i of intermediates) { - backend2.disposeData(i.dataId); + for (const i2 of intermediates) { + backend2.disposeData(i2.dataId); } return outReshaped; } @@ -67016,7 +67016,7 @@ var AddNPackedProgram2 = class { this.workGroupSize = [64, 1, 1]; this.size = true; this.outputShape = shapes[0]; - this.variableNames = shapes.map((_, i) => `T${i}`); + this.variableNames = shapes.map((_, i2) => `T${i2}`); this.dispatchLayout = flatDispatchLayout(this.outputShape); this.dispatch = computeDispatch(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]); this.shaderKey = "addN"; @@ -67050,8 +67050,8 @@ function addN4(args) { if (tensors.length === 1) { return identity5({ inputs: { x: tensors[0] }, backend: backend2 }); } - const dtype = tensors.map((t) => t.dtype).reduce((d1, d2) => upcastType(d1, d2)); - const shapes = tensors.map((t) => t.shape); + const dtype = tensors.map((t2) => t2.dtype).reduce((d1, d2) => upcastType(d1, d2)); + const shapes = tensors.map((t2) => t2.shape); const program = new AddNPackedProgram2(shapes); return backend2.runWebGPUProgram(program, tensors, dtype); } @@ -67095,8 +67095,8 @@ var ArgMinMaxProgram2 = class { snippet += "outputCoords,"; } } else { - for (let i = 0; i < this.outputShape.length; i++) { - snippet += `outputCoords.${getCoordsXYZ(i)},`; + for (let i2 = 0; i2 < this.outputShape.length; i2++) { + snippet += `outputCoords.${getCoordsXYZ(i2)},`; } } return snippet; @@ -67156,8 +67156,8 @@ var TransposeSharedProgram = class { this.variableNames = ["A"]; this.workGroupSize = [16, 16, 1]; const outputShape = new Array(aShape.length); - for (let i = 0; i < outputShape.length; i++) { - outputShape[i] = aShape[newDim[i]]; + for (let i2 = 0; i2 < outputShape.length; i2++) { + outputShape[i2] = aShape[newDim[i2]]; } this.outputShape = outputShape; this.dispatchLayout = { x: [0], y: [1] }; @@ -67198,8 +67198,8 @@ var TransposeProgram2 = class { this.workGroupSize = [64, 1, 1]; this.size = true; const outputShape = new Array(aShape.length); - for (let i = 0; i < outputShape.length; i++) { - outputShape[i] = aShape[newDim[i]]; + for (let i2 = 0; i2 < outputShape.length; i2++) { + outputShape[i2] = aShape[newDim[i2]]; } this.outputShape = outputShape; this.dispatchLayout = flatDispatchLayout(this.outputShape); @@ -67232,8 +67232,8 @@ function getSwitchedCoords2(newDim) { throw Error(`Transpose for rank ${rank} is not yet supported`); } const switchedCoords = new Array(rank); - for (let i = 0; i < newDim.length; i++) { - switchedCoords[newDim[i]] = `resRC.${getCoordsXYZ(i)}`; + for (let i2 = 0; i2 < newDim.length; i2++) { + switchedCoords[newDim[i2]] = `resRC.${getCoordsXYZ(i2)}`; } return switchedCoords.join(); } @@ -67244,8 +67244,8 @@ function transpose5(args) { const webgpuBackend = backend2; const xRank = x.shape.length; const newShape = new Array(xRank); - for (let i = 0; i < newShape.length; i++) { - newShape[i] = x.shape[perm[i]]; + for (let i2 = 0; i2 < newShape.length; i2++) { + newShape[i2] = x.shape[perm[i2]]; } if (backend2.shouldExecuteOnCPU([x])) { const xData = webgpuBackend.tensorMap.get(x.dataId); @@ -67282,7 +67282,7 @@ function argMax4(args) { const program = new ArgMinMaxProgram2($x.shape, axes[0], "max"); const uniformData = [{ type: "float32", data: [Number.NEGATIVE_INFINITY] }]; const out = backend2.runWebGPUProgram(program, [$x], "int32", uniformData); - intermediateTensorInfos.forEach((t) => backend2.disposeData(t.dataId)); + intermediateTensorInfos.forEach((t2) => backend2.disposeData(t2.dataId)); return out; } var argMaxConfig4 = { @@ -67307,7 +67307,7 @@ function argMin4(args) { const program = new ArgMinMaxProgram2($x.shape, axes[0], "min"); const uniformData = [{ type: "float32", data: [Number.POSITIVE_INFINITY] }]; const out = backend2.runWebGPUProgram(program, [$x], "int32", uniformData); - intermediateTensorInfos.forEach((t) => backend2.disposeData(t.dataId)); + intermediateTensorInfos.forEach((t2) => backend2.disposeData(t2.dataId)); return out; } var argMinConfig3 = { @@ -67464,12 +67464,12 @@ var SliceProgram2 = class { const sourceCoords = getCoords3(this.rank); let coordSum; if (this.start.length === 1) { - coordSum = this.outputShape.map((_, i) => { + coordSum = this.outputShape.map((_, i2) => { return `sourceLoc = uniforms.start + coords;`; }); } else { - coordSum = this.outputShape.map((_, i) => { - return `sourceLoc.${coords2[i]} = uniforms.start[${i}] + coords.${coords2[i]};`; + coordSum = this.outputShape.map((_, i2) => { + return `sourceLoc.${coords2[i2]} = uniforms.start[${i2}] + coords.${coords2[i2]};`; }); } const userCode = ` @@ -67545,7 +67545,7 @@ var batchToSpaceND5 = (args) => { toDispose.push(reshapedIntermediate); toDispose.push(transposedIntermediate); toDispose.push(reshapedIntermediate2); - toDispose.forEach((t) => backend2.disposeData(t.dataId)); + toDispose.forEach((t2) => backend2.disposeData(t2.dataId)); return sliced; }; var batchToSpaceNDConfig4 = { @@ -67716,12 +67716,12 @@ var ConcatProgram2 = class { this.workGroupSize = [64, 1, 1]; this.size = true; this.outputShape = backend_util_exports.computeOutShape(shapes, 1); - this.variableNames = shapes.map((_, i) => `T${i}`); + this.variableNames = shapes.map((_, i2) => `T${i2}`); this.dispatchLayout = flatDispatchLayout(this.outputShape); this.dispatch = computeDispatch(this.dispatchLayout, this.outputShape, this.workGroupSize, [this.workPerThread, 1, 1]); this.offsetLength = shapes.length - 1; - for (let i = 0; i < this.offsetLength; i++) { - this.uniforms += `offset${i} : i32,`; + for (let i2 = 0; i2 < this.offsetLength; i2++) { + this.uniforms += `offset${i2} : i32,`; } this.shaderKey = "concat"; } @@ -67729,8 +67729,8 @@ var ConcatProgram2 = class { const snippets = []; if (this.offsetLength > 0) { snippets.push(`if (yC < uniforms.offset0){ setOutputAtCoords(coords.x, coords.y, getT0(yR, yC)); }`); - for (let i = 1; i < this.offsetLength; i++) { - snippets.push(`else if (yC < uniforms.offset${[i]}){ setOutputAtCoords(coords.x, coords.y, getT${i}(yR, yC - uniforms.offset${i - 1})); }`); + for (let i2 = 1; i2 < this.offsetLength; i2++) { + snippets.push(`else if (yC < uniforms.offset${[i2]}){ setOutputAtCoords(coords.x, coords.y, getT${i2}(yR, yC - uniforms.offset${i2 - 1})); }`); } const lastIndex = this.offsetLength; const lastShiftIndex = this.offsetLength - 1; @@ -67769,13 +67769,13 @@ var imagConfig3 = { function concatImpl3(inputs, axis, backend2) { const dtype = inputs[0].dtype; if (dtype === "complex64") { - const reals = inputs.map((t) => real4({ inputs: { input: t }, backend: backend2 })); - const imags = inputs.map((t) => imag4({ inputs: { input: t }, backend: backend2 })); + const reals = inputs.map((t2) => real4({ inputs: { input: t2 }, backend: backend2 })); + const imags = inputs.map((t2) => imag4({ inputs: { input: t2 }, backend: backend2 })); const realConcated = concatImpl3(reals, axis, backend2); const imagConcated = concatImpl3(imags, axis, backend2); const result = complex4({ inputs: { real: realConcated, imag: imagConcated }, backend: backend2 }); - reals.forEach((r) => backend2.disposeData(r.dataId)); - imags.forEach((i) => backend2.disposeData(i.dataId)); + reals.forEach((r2) => backend2.disposeData(r2.dataId)); + imags.forEach((i2) => backend2.disposeData(i2.dataId)); backend2.disposeData(realConcated.dataId); backend2.disposeData(imagConcated.dataId); return result; @@ -67785,63 +67785,63 @@ function concatImpl3(inputs, axis, backend2) { runOnCpu = true; } if (runOnCpu) { - const tensors2D2 = inputs.map((t) => { - const innerSize = util_exports.sizeFromShape(t.shape.slice(axis)); + const tensors2D2 = inputs.map((t2) => { + const innerSize = util_exports.sizeFromShape(t2.shape.slice(axis)); const shape = [-1, innerSize]; - return reshape6({ inputs: { x: t }, backend: backend2, attrs: { shape } }); + return reshape6({ inputs: { x: t2 }, backend: backend2, attrs: { shape } }); }); - const inputsValShapes = tensors2D2.map((t) => { - return { vals: backend2.readSync(t.dataId), shape: t.shape }; + const inputsValShapes = tensors2D2.map((t2) => { + return { vals: backend2.readSync(t2.dataId), shape: t2.shape }; }); - const outShape2 = backend_util_exports.computeOutShape(tensors2D2.map((t) => t.shape), 1); + const outShape2 = backend_util_exports.computeOutShape(tensors2D2.map((t2) => t2.shape), 1); const simplyConcat = tensors2D2[0].shape[0] === 1; const outVals = concatImplCPU2(inputsValShapes, outShape2, dtype, simplyConcat); - const finalOutShape = backend_util_exports.computeOutShape(inputs.map((t) => t.shape), axis); + const finalOutShape = backend_util_exports.computeOutShape(inputs.map((t2) => t2.shape), axis); const outInfo = backend2.makeTensorInfo(finalOutShape, dtype, outVals); - tensors2D2.forEach((t) => backend2.disposeData(t.dataId)); + tensors2D2.forEach((t2) => backend2.disposeData(t2.dataId)); return outInfo; } const maxInputNum = backend2.device.limits.maxStorageBuffersPerShaderStage - 1; if (inputs.length > maxInputNum) { const reducedInputs = []; - for (let i = 0; i < inputs.length; i += maxInputNum) { - const subArray = inputs.slice(i, i + maxInputNum); + for (let i2 = 0; i2 < inputs.length; i2 += maxInputNum) { + const subArray = inputs.slice(i2, i2 + maxInputNum); reducedInputs.push(concatImpl3(subArray, axis, backend2)); } const result = concatImpl3(reducedInputs, axis, backend2); - for (const i of reducedInputs) { - backend2.disposeData(i.dataId); + for (const i2 of reducedInputs) { + backend2.disposeData(i2.dataId); } return result; } const { tensors2D, outShape } = computeTensors2D2(inputs, axis, backend2); - const shapes = tensors2D.map((t) => t.shape); + const shapes = tensors2D.map((t2) => t2.shape); const program = new ConcatProgram2(shapes); const uniformData = []; const offsets = new Array(shapes.length - 1); if (offsets.length > 0) { offsets[0] = shapes[0][1]; uniformData.push({ type: "int32", data: [offsets[0]] }); - for (let i = 1; i < offsets.length; i++) { - offsets[i] = offsets[i - 1] + shapes[i][1]; - uniformData.push({ type: "int32", data: [offsets[i]] }); + for (let i2 = 1; i2 < offsets.length; i2++) { + offsets[i2] = offsets[i2 - 1] + shapes[i2][1]; + uniformData.push({ type: "int32", data: [offsets[i2]] }); } } const res = backend2.runWebGPUProgram(program, tensors2D, tensors2D[0].dtype, uniformData); - tensors2D.forEach((r) => backend2.disposeData(r.dataId)); + tensors2D.forEach((r2) => backend2.disposeData(r2.dataId)); const reshapedResult = reshape6({ inputs: { x: res }, backend: backend2, attrs: { shape: outShape } }); backend2.disposeData(res.dataId); return reshapedResult; } function computeTensors2D2(inputs, axis, backend2) { - const outShape = backend_util_exports.computeOutShape(inputs.map((t) => t.shape), axis); - const tensors2D = inputs.map((t) => reshape6({ - inputs: { x: t }, + const outShape = backend_util_exports.computeOutShape(inputs.map((t2) => t2.shape), axis); + const tensors2D = inputs.map((t2) => reshape6({ + inputs: { x: t2 }, backend: backend2, attrs: { shape: [ - util_exports.sizeFromShape(t.shape.slice(0, axis)), - util_exports.sizeFromShape(t.shape.slice(axis)) + util_exports.sizeFromShape(t2.shape.slice(0, axis)), + util_exports.sizeFromShape(t2.shape.slice(axis)) ] } })); @@ -67851,15 +67851,15 @@ function concat5(args) { const { inputs, backend: backend2, attrs } = args; const { axis } = attrs; const $axis = util_exports.parseAxisParam(axis, inputs[0].shape)[0]; - const outShape = backend_util_exports.computeOutShape(inputs.map((t) => t.shape), $axis); + const outShape = backend_util_exports.computeOutShape(inputs.map((t2) => t2.shape), $axis); if (util_exports.sizeFromShape(outShape) === 0) { return backend2.makeTensorInfo(outShape, inputs[0].dtype, []); } - const $inputs = inputs.filter((t) => util_exports.sizeFromShape(t.shape) > 0); + const $inputs = inputs.filter((t2) => util_exports.sizeFromShape(t2.shape) > 0); if ($inputs.length === 1) { return identity5({ inputs: { x: $inputs[0] }, backend: backend2 }); } - const shapes = $inputs.map((t) => t.shape); + const shapes = $inputs.map((t2) => t2.shape); backend_util_exports.assertParamsConsistent(shapes, $axis); return concatImpl3($inputs, $axis, backend2); } @@ -68125,8 +68125,8 @@ function conv2dByMatMul2({ x, filter, convInfo, backend: backend2, bias = null, }); const out = reshape6({ inputs: { x: result }, backend: backend2, attrs: { shape: convInfo.outShape } }); intermediates.push(result); - for (const i of intermediates) { - backend2.disposeData(i.dataId); + for (const i2 of intermediates) { + backend2.disposeData(i2.dataId); } return out; } @@ -68186,8 +68186,8 @@ function conv2DImpl({ x, filter, convInfo, backend: backend2, bias = null, prelu program.uniforms += " alpha : f32,"; } const out = backend2.runWebGPUProgram(program, inputVar, x.dtype, dimensions); - for (const i of intermediates) { - backend2.disposeData(i.dataId); + for (const i2 of intermediates) { + backend2.disposeData(i2.dataId); } return out; } @@ -68637,10 +68637,10 @@ function cumImpl2(op2, x, backend2, axis, exclusive, reverse5) { } const size2 = permutedX.shape[permutedAxis]; let result = identity5({ inputs: { x: permutedX }, backend: backend2 }); - for (let i = 0; i <= Math.ceil(Math.log2(size2)) - 1; i++) { + for (let i2 = 0; i2 <= Math.ceil(Math.log2(size2)) - 1; i2++) { const program = new CumProgram2(op2, permutedX.shape, false, reverse5); const prevResult = result; - const uniformData = [{ type: "float32", data: [i] }]; + const uniformData = [{ type: "float32", data: [i2] }]; result = backend2.runWebGPUProgram(program, [result], result.dtype, uniformData); backend2.disposeData(prevResult.dataId); } @@ -69222,7 +69222,7 @@ function reduce2(x, axis, keepDims, reduceType, backend2) { toDispose.push(reduced); res = reshape6({ inputs: { x: reduced }, attrs: { shape: resOutShape }, backend: backend2 }); } - toDispose.forEach((t) => backend2.disposeData(t.dataId)); + toDispose.forEach((t2) => backend2.disposeData(t2.dataId)); return res; } function sum6(args) { @@ -69247,8 +69247,8 @@ function einsum4(args) { let out = null; let numDimsRemaining = allDims.length; const tensorsToDispose = []; - for (let i = 0; i < nSteps; ++i) { - for (const idTerm of steps[i]) { + for (let i2 = 0; i2 < nSteps; ++i2) { + for (const idTerm of steps[i2]) { const { permutationIndices: perm, expandDims: dimsToExpand } = backend_util_exports.getEinsumPermutation(numDimsRemaining, idDims[idTerm]); let x; if (backend_util_exports.isIdentityPermutation(perm)) { @@ -69272,13 +69272,13 @@ function einsum4(args) { tensorsToDispose.push(out); } } - if (i < nSteps - 1) { - if (path[i] >= 0) { + if (i2 < nSteps - 1) { + if (path[i2] >= 0) { out = sum6({ inputs: { x: out }, backend: backend2, attrs: { - axis: path[i] - (allDims.length - numDimsRemaining), + axis: path[i2] - (allDims.length - numDimsRemaining), keepDims: false } }); @@ -69502,9 +69502,9 @@ function fromPixels3(args) { pixelArray = new Uint8Array(pixels.width * pixels.height * numChannels); const dataLength = imageData.length; let j = 0; - for (let i = 0; i < dataLength; i++) { - if (i % 4 < numChannels) { - pixelArray[j++] = imageData[i]; + for (let i2 = 0; i2 < dataLength; i2++) { + if (i2 % 4 < numChannels) { + pixelArray[j++] = imageData[i2]; } } } @@ -69751,11 +69751,11 @@ var GatherProgram2 = class { function getSourceCoords4(aShape) { const currentCoords = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"]; const sourceCoords = []; - for (let i = 0; i < aShape.length; i++) { - if (i === 2) { + for (let i2 = 0; i2 < aShape.length; i2++) { + if (i2 === 2) { sourceCoords.push("indexZ"); } else { - sourceCoords.push(`${currentCoords[i]}`); + sourceCoords.push(`${currentCoords[i2]}`); } } return sourceCoords.join(); @@ -69801,14 +69801,14 @@ function gatherV24(args) { const xValues = xBufferInfo.values; const xBuf = buffer(flattenX.shape, flattenX.dtype, xValues); const outBuf = gatherV2ImplCPU2(xBuf, indicesBuf, flattenOutputShape); - toDispose.forEach((t) => backend2.disposeData(t.dataId)); + toDispose.forEach((t2) => backend2.disposeData(t2.dataId)); return backend2.makeTensorInfo(shapeInfo.outputShape, outBuf.dtype, outBuf.values); } const program = new GatherProgram2(flattenX.shape, flattenOutputShape); const res = backend2.runWebGPUProgram(program, [flattenX, flattenIndex], flattenX.dtype); toDispose.push(res); const reshaped = reshape6({ inputs: { x: res }, backend: backend2, attrs: { shape: shapeInfo.outputShape } }); - toDispose.forEach((t) => backend2.disposeData(t.dataId)); + toDispose.forEach((t2) => backend2.disposeData(t2.dataId)); return reshaped; } var gatherV2Config4 = { @@ -69972,20 +69972,20 @@ var MirrorPadProgram2 = class { this.variableNames = ["x"]; this.workGroupSize = [64, 1, 1]; this.size = true; - this.outputShape = paddings.map((p2, i) => p2[0] + xShape[i] + p2[1]); + this.outputShape = paddings.map((p2, i2) => p2[0] + xShape[i2] + p2[1]); this.dispatchLayout = flatDispatchLayout(this.outputShape); this.dispatch = computeDispatch(this.dispatchLayout, this.outputShape, this.workGroupSize); this.xShape = xShape; - paddings.map((_, i) => { - this.uniforms += ` pad${i} : vec2,`; + paddings.map((_, i2) => { + this.uniforms += ` pad${i2} : vec2,`; }); this.offset = mode === "reflect" ? 0 : 1; this.shaderKey = `mirrorPad_${mode}`; } getUserCode() { const rank = this.xShape.length; - const start = this.xShape.map((_, i) => `uniforms.pad${i}[0]`).join(","); - const end = this.xShape.map((_, i) => `uniforms.pad${i}[0] + uniforms.xShape${rank > 1 ? `[${i}]` : ""}`).join(","); + const start = this.xShape.map((_, i2) => `uniforms.pad${i2}[0]`).join(","); + const end = this.xShape.map((_, i2) => `uniforms.pad${i2}[0] + uniforms.xShape${rank > 1 ? `[${i2}]` : ""}`).join(","); const shaderStart = rank === 1 ? "start" : "start[i]"; const shaderEnd = rank === 1 ? "end" : "end[i]"; const shaderOutC = rank === 1 ? "outC" : "outC[i]"; @@ -70084,14 +70084,14 @@ function zerosLike5(args) { const { x } = inputs; if (x.dtype === "complex64") { const realPart = real4({ inputs: { input: x }, backend: backend2 }); - const r = zerosLike5({ inputs: { x: realPart }, backend: backend2 }); + const r2 = zerosLike5({ inputs: { x: realPart }, backend: backend2 }); const imagPart = imag4({ inputs: { input: x }, backend: backend2 }); - const i = zerosLike5({ inputs: { x: imagPart }, backend: backend2 }); - const result = complex4({ inputs: { real: r, imag: i }, backend: backend2 }); + const i2 = zerosLike5({ inputs: { x: imagPart }, backend: backend2 }); + const result = complex4({ inputs: { real: r2, imag: i2 }, backend: backend2 }); backend2.disposeData(realPart.dataId); - backend2.disposeData(r.dataId); + backend2.disposeData(r2.dataId); backend2.disposeData(imagPart.dataId); - backend2.disposeData(i.dataId); + backend2.disposeData(i2.dataId); return result; } else { return fill5({ @@ -70116,14 +70116,14 @@ function onesLike5(args) { throw new Error("onesLike is not supported under string dtype"); } else if (x.dtype === "complex64") { const realPart = real4({ inputs: { input: x }, backend: backend2 }); - const r = onesLike5({ inputs: { x: realPart }, backend: backend2 }); + const r2 = onesLike5({ inputs: { x: realPart }, backend: backend2 }); const imagPart = imag4({ inputs: { input: x }, backend: backend2 }); - const i = zerosLike5({ inputs: { x: imagPart }, backend: backend2 }); - const result = complex4({ inputs: { real: r, imag: i }, backend: backend2 }); + const i2 = zerosLike5({ inputs: { x: imagPart }, backend: backend2 }); + const result = complex4({ inputs: { real: r2, imag: i2 }, backend: backend2 }); backend2.disposeData(realPart.dataId); - backend2.disposeData(r.dataId); + backend2.disposeData(r2.dataId); backend2.disposeData(imagPart.dataId); - backend2.disposeData(i.dataId); + backend2.disposeData(i2.dataId); return result; } else { return fill5({ attrs: { shape: x.shape, dtype: x.dtype, value: 1 }, backend: backend2 }); @@ -70142,18 +70142,18 @@ function pack4(args) { } const shape = inputs[0].shape; const dtype = inputs[0].dtype; - inputs.forEach((t) => { - util_exports.assertShapesMatch(shape, t.shape, "All tensors passed to stack must have matching shapes"); - util_exports.assert(dtype === t.dtype, () => "All tensors passed to stack must have matching dtypes"); + inputs.forEach((t2) => { + util_exports.assertShapesMatch(shape, t2.shape, "All tensors passed to stack must have matching shapes"); + util_exports.assert(dtype === t2.dtype, () => "All tensors passed to stack must have matching dtypes"); }); const intermediateTensorInfos = []; - const expandedTensors = inputs.map((t) => { - const expandedT = expandDims6({ inputs: { input: t }, backend: backend2, attrs: { dim: axis } }); + const expandedTensors = inputs.map((t2) => { + const expandedT = expandDims6({ inputs: { input: t2 }, backend: backend2, attrs: { dim: axis } }); intermediateTensorInfos.push(expandedT); return expandedT; }); const result = concat5({ inputs: expandedTensors, backend: backend2, attrs: { axis } }); - intermediateTensorInfos.forEach((t) => backend2.disposeData(t.dataId)); + intermediateTensorInfos.forEach((t2) => backend2.disposeData(t2.dataId)); return result; } var packConfig4 = { @@ -70167,11 +70167,11 @@ var PadProgram2 = class { this.uniforms = "constantValue : f32,"; this.workGroupSize = [64, 1, 1]; this.size = true; - this.outputShape = paddings.map((p2, i) => p2[0] + xShape[i] + p2[1]); + this.outputShape = paddings.map((p2, i2) => p2[0] + xShape[i2] + p2[1]); this.dispatchLayout = flatDispatchLayout(this.outputShape); this.dispatch = computeDispatch(this.dispatchLayout, this.outputShape, this.workGroupSize); - paddings.map((_, i) => { - this.uniforms += ` pad${i} : vec2,`; + paddings.map((_, i2) => { + this.uniforms += ` pad${i2} : vec2,`; }); this.xShape = xShape; this.shaderKey = "pad"; @@ -70179,8 +70179,8 @@ var PadProgram2 = class { getUserCode() { const rank = this.xShape.length; const type = getCoordsDataType2(rank); - const start = this.xShape.map((_, i) => `uniforms.pad${i}[0]`).join(","); - const end = this.xShape.map((_, i) => `uniforms.pad${i}[0] + uniforms.xShape${rank > 1 ? `[${i}]` : ""}`).join(","); + const start = this.xShape.map((_, i2) => `uniforms.pad${i2}[0]`).join(","); + const end = this.xShape.map((_, i2) => `uniforms.pad${i2}[0] + uniforms.xShape${rank > 1 ? `[${i2}]` : ""}`).join(","); const startValue = rank > 1 ? `${type}(${start})` : `${start}`; const endValue = rank > 1 ? `${type}(${end})` : `${end}`; const leftPadCondition = rank > 1 ? `any(outC < start)` : `outC < start`; @@ -70213,7 +70213,7 @@ var padV23 = (args) => { return identity5({ inputs: { x }, backend: backend2 }); } if (util_exports.sizeFromShape(x.shape) === 0) { - const outputShape = paddings.map((p2, i) => p2[0] + x.shape[i] + p2[1]); + const outputShape = paddings.map((p2, i2) => p2[0] + x.shape[i2] + p2[1]); return fill5({ backend: backend2, attrs: { shape: outputShape, value: constantValue, dtype: x.dtype } @@ -70674,10 +70674,10 @@ var SelectProgram2 = class { const currentCoords = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"]; const cCoordVars = []; const abCoordVars = []; - for (let i = 0; i < this.outputShape.length; i++) { - abCoordVars.push(`${currentCoords[i]}`); - if (i < this.cRank) { - cCoordVars.push(`${currentCoords[i]}`); + for (let i2 = 0; i2 < this.outputShape.length; i2++) { + abCoordVars.push(`${currentCoords[i2]}`); + if (i2 < this.cRank) { + cCoordVars.push(`${currentCoords[i2]}`); } } cCoords = cCoordVars.join(); @@ -70701,9 +70701,9 @@ var SelectProgram2 = class { }; function select5(args) { const { inputs, backend: backend2 } = args; - const { condition, t, e } = inputs; - const program = new SelectProgram2(condition.shape.length, t.shape, t.shape.length); - return backend2.runWebGPUProgram(program, [condition, t, e], upcastType(t.dtype, e.dtype)); + const { condition, t: t2, e: e2 } = inputs; + const program = new SelectProgram2(condition.shape.length, t2.shape, t2.shape.length); + return backend2.runWebGPUProgram(program, [condition, t2, e2], upcastType(t2.dtype, e2.dtype)); } var selectConfig4 = { kernelName: Select, @@ -70772,7 +70772,7 @@ var spaceToBatchND5 = (args) => { const prod6 = blockShape.reduce((a, b) => a * b); const completePaddings = [[0, 0]]; completePaddings.push(...paddings); - for (let i = 1 + blockShape.length; i < x.shape.length; ++i) { + for (let i2 = 1 + blockShape.length; i2 < x.shape.length; ++i2) { completePaddings.push([0, 0]); } const toDispose = []; @@ -70794,7 +70794,7 @@ var spaceToBatchND5 = (args) => { toDispose.push(paddedX); toDispose.push(reshapedPaddedX); toDispose.push(paddedXT); - toDispose.forEach((t) => backend2.disposeData(t.dataId)); + toDispose.forEach((t2) => backend2.disposeData(t2.dataId)); return result; }; var spaceToBatchNDConfig4 = { @@ -70808,8 +70808,8 @@ var TileProgram2 = class { this.workGroupSize = [64, 1, 1]; this.size = true; const outputShape = new Array(aShape.length); - for (let i = 0; i < outputShape.length; i++) { - outputShape[i] = aShape[i] * reps[i]; + for (let i2 = 0; i2 < outputShape.length; i2++) { + outputShape[i2] = aShape[i2] * reps[i2]; } this.outputShape = outputShape; this.dispatchLayout = flatDispatchLayout(this.outputShape); @@ -70839,8 +70839,8 @@ function getSourceCoords5(rank, uniformPrefix = "") { } const currentCoords = ["resRC.x", "resRC.y", "resRC.z", "resRC.w"]; const sourceCoords = []; - for (let i = 0; i < rank; i++) { - sourceCoords.push(`(${currentCoords[i]} % ${uniformPrefix}aShape[${i}])`); + for (let i2 = 0; i2 < rank; i2++) { + sourceCoords.push(`(${currentCoords[i2]} % ${uniformPrefix}aShape[${i2}])`); } return sourceCoords.join(); } @@ -70943,11 +70943,11 @@ function splitV4(args) { const xRank = x.shape.length; const begin = new Array(xRank).fill(0); const size2 = x.shape.slice(); - return splitSizes.map((s) => { + return splitSizes.map((s2) => { const sliceSize = [...size2]; - sliceSize[$axis] = s; + sliceSize[$axis] = s2; const sliceT = slice5({ inputs: { x }, backend: backend2, attrs: { begin, size: sliceSize } }); - begin[$axis] += s; + begin[$axis] += s2; return sliceT; }); } @@ -71000,9 +71000,9 @@ var StridedSliceProgram2 = class { newCoords = "coords * uniforms.strides + uniforms.begin"; } else { let outputAxis = 0; - newCoords = this.outputShape.map((_, i) => { + newCoords = this.outputShape.map((_, i2) => { outputAxis++; - return this.outputShape.length === 1 ? `coords * uniforms.strides[${i}] + uniforms.begin[${i}]` : `coords[${outputAxis - 1}] * uniforms.strides[${i}] + uniforms.begin[${i}]`; + return this.outputShape.length === 1 ? `coords * uniforms.strides[${i2}] + uniforms.begin[${i2}]` : `coords[${outputAxis - 1}] * uniforms.strides[${i2}] + uniforms.begin[${i2}]`; }).join(","); } const userCode = ` @@ -71527,9 +71527,9 @@ function unpack4(args) { const num = value.shape[axis]; const outShape = new Array(xRank - 1); let outIndex = 0; - for (let i = 0; i < xRank; i++) { - if (i !== axis) { - outShape[outIndex++] = x.shape[i]; + for (let i2 = 0; i2 < xRank; i2++) { + if (i2 !== axis) { + outShape[outIndex++] = x.shape[i2]; } } const toDispose = []; @@ -71537,14 +71537,14 @@ function unpack4(args) { const size2 = x.shape.slice(); size2[axis] = 1; const res = new Array(num); - for (let i = 0; i < res.length; i++) { - begin[axis] = i; + for (let i2 = 0; i2 < res.length; i2++) { + begin[axis] = i2; const sliced = slice5({ inputs: { x }, backend: backend2, attrs: { begin, size: size2 } }); const reshaped = reshape6({ inputs: { x: sliced }, backend: backend2, attrs: { shape: outShape } }); - res[i] = reshaped; + res[i2] = reshaped; toDispose.push(sliced); } - toDispose.forEach((t) => backend2.disposeData(t.dataId)); + toDispose.forEach((t2) => backend2.disposeData(t2.dataId)); return res; } var unpackConfig4 = { @@ -72103,17 +72103,17 @@ var WebGPUBackend = class extends KernelBackend { tensorData.resourceInfo = { size: size2, usage: this.defaultGpuBufferUsage(), buffer: buffer2 }; return { tensorRef, buffer: buffer2, bufSize: size2 }; } - bufferSync(t) { - const data = this.readSync(t.dataId); - if (t.dtype === "string") { + bufferSync(t2) { + const data = this.readSync(t2.dataId); + if (t2.dtype === "string") { try { const strings = data.map((d) => util_exports.decodeString(d)); - return buffer(t.shape, t.dtype, strings); + return buffer(t2.shape, t2.dtype, strings); } catch (_a) { throw new Error("Failed to decode encoded string bytes into utf-8"); } } - return buffer(t.shape, t.dtype, data); + return buffer(t2.shape, t2.dtype, data); } async time(f) { const oldActiveTimers = this.activeTimers; @@ -72141,7 +72141,7 @@ var WebGPUBackend = class extends KernelBackend { }; const kernelMs = await Promise.all(flattenedActiveTimerQueries); res["kernelMs"] = util_exports.sum(kernelMs); - res["getExtraProfileInfo"] = () => kernelMs.map((d, i) => ({ name: flattenedActiveTimerNames[i], ms: d })).map((d) => `${d.name}: ${d.ms}`).join(", "); + res["getExtraProfileInfo"] = () => kernelMs.map((d, i2) => ({ name: flattenedActiveTimerNames[i2], ms: d })).map((d) => `${d.name}: ${d.ms}`).join(", "); this.uploadWaitMs = 0; this.downloadWaitMs = 0; return res; @@ -72244,8 +72244,8 @@ var WebGPUBackend = class extends KernelBackend { currentOffset += d.data.length * 4; }); const arrayBuffer = new ArrayBuffer(currentOffset); - programUniform.forEach((d, i) => { - const offset = offsets[i]; + programUniform.forEach((d, i2) => { + const offset = offsets[i2]; if (d.type === "int32") { new Int32Array(arrayBuffer, offset, d.data.length).set(d.data); } else if (d.type === "uint32") { @@ -72290,7 +72290,7 @@ var WebGPUBackend = class extends KernelBackend { programUniform.push({ type: uniformsType, data: [program.isVec4 ? size2 / 4 : size2] }); } } - const inputsData = inputs.map((input2, i) => { + const inputsData = inputs.map((input2, i2) => { if (input2.dtype === "complex64") { throw new Error(`GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.`); } @@ -72298,7 +72298,7 @@ var WebGPUBackend = class extends KernelBackend { return { dtype: this.tensorMap.get(input2.dataId).dtype, shape: input2.shape, - name: program.variableNames[i] + name: program.variableNames[i2] }; }); const key = makeShaderKey2(program, bufferShapes, inputsData, output); @@ -72314,12 +72314,12 @@ var WebGPUBackend = class extends KernelBackend { } const bindings = [ this.tensorToBinding(output), - ...inputs.map((t) => this.tensorToBinding(t)), + ...inputs.map((t2) => this.tensorToBinding(t2)), this.makeUniforms(programUniform) ]; const bindGroup = this.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), - entries: bindings.map((b, i) => ({ binding: i, resource: b })) + entries: bindings.map((b, i2) => ({ binding: i2, resource: b })) }); this.ensureCommandEncoderReady(); const pass = this.getComputePass(); @@ -72414,22 +72414,14 @@ if (isWebGPUSupported()) { return new WebGPUBackend(device, supportTimeQuery); }, 3); } -var version9 = "3.19.0"; -var version22 = "3.19.0"; -var version32 = "3.19.0"; -var version42 = "3.19.0"; -var version52 = "3.19.0"; -var version62 = "3.19.0"; -var version72 = "3.19.0"; -var version82 = { - tfjs: version9, - "tfjs-core": version22, - "tfjs-data": version32, - "tfjs-layers": version42, - "tfjs-converter": version52, - "tfjs-backend-webgl": version62, - "tfjs-backend-wasm": version72 -}; +var e = "3.19.0"; +var s = "3.19.0"; +var t = "3.19.0"; +var i = "3.19.0"; +var n = "3.19.0"; +var r = "3.19.0"; +var l = "3.19.0"; +var V = { tfjs: e, "tfjs-core": s, "tfjs-data": t, "tfjs-layers": i, "tfjs-converter": n, "tfjs-backend-webgl": r, "tfjs-backend-wasm": l }; // src/image/imagefxshaders.ts var vertexIdentity = ` @@ -72533,8 +72525,8 @@ var convolution = ` // src/image/imagefx.ts var collect = (source, prefix, collection) => { - const r = new RegExp("\\b" + prefix + " \\w+ (\\w+)", "ig"); - source.replace(r, (match3, name) => { + const r2 = new RegExp("\\b" + prefix + " \\w+ (\\w+)", "ig"); + source.replace(r2, (match3, name) => { collection[name] = 0; return match3; }); @@ -73067,17 +73059,17 @@ function GLImageFilter() { ]); }, emboss: (size2) => { - const s = size2 || 1; + const s2 = size2 || 1; filter.convolution.call(this, [ - -2 * s, - -1 * s, + -2 * s2, + -1 * s2, 0, - -1 * s, + -1 * s2, 1, - 1 * s, + 1 * s2, 0, - 1 * s, - 2 * s + 1 * s2, + 2 * s2 ]); }, blur: (size2) => { @@ -73123,9 +73115,9 @@ function GLImageFilter() { 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, image2); - for (let i = 0; i < filterChain.length; i++) { - lastInChain = i === filterChain.length - 1; - const f = filterChain[i]; + for (let i2 = 0; i2 < filterChain.length; i2++) { + lastInChain = i2 === filterChain.length - 1; + const f = filterChain[i2]; f.func.apply(this, f.args || []); } return fxcanvas; @@ -73389,20 +73381,20 @@ async function skip(config3, input2) { dispose(last.inputTensor); last.inputTensor = clone(input2); } else { - const t = {}; - t.diff = sub(input2, last.inputTensor); - t.squared = mul(t.diff, t.diff); - t.sum = sum2(t.squared); - const diffSum = await t.sum.data(); + const t2 = {}; + t2.diff = sub(input2, last.inputTensor); + t2.squared = mul(t2.diff, t2.diff); + t2.sum = sum2(t2.squared); + const diffSum = await t2.sum.data(); const diffRelative = diffSum[0] / (input2.shape[1] || 1) / (input2.shape[2] || 1) / 255 / 3; - dispose([last.inputTensor, t.diff, t.squared, t.sum]); + dispose([last.inputTensor, t2.diff, t2.squared, t2.sum]); last.inputTensor = clone(input2); skipFrame = diffRelative <= (config3.cacheSensitivity || 0); } return skipFrame; } async function compare(config3, input1, input2) { - const t = {}; + const t2 = {}; if (!input1 || !input2 || input1.shape.length !== 4 || input1.shape.length !== input2.shape.length) { if (!config3.debug) log("invalid input tensor or tensor shapes do not match:", input1.shape, input2.shape); @@ -73413,14 +73405,14 @@ async function compare(config3, input1, input2) { log("input tensors must be of shape [1, height, width, 3]:", input1.shape, input2.shape); return 0; } - t.input1 = clone(input1); - t.input2 = input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2] ? image.resizeBilinear(input2, [input1.shape[1], input1.shape[2]]) : clone(input2); - t.diff = sub(t.input1, t.input2); - t.squared = mul(t.diff, t.diff); - t.sum = sum2(t.squared); - const diffSum = await t.sum.data(); + t2.input1 = clone(input1); + t2.input2 = input1.shape[1] !== input2.shape[1] || input1.shape[2] !== input2.shape[2] ? image.resizeBilinear(input2, [input1.shape[1], input1.shape[2]]) : clone(input2); + t2.diff = sub(t2.input1, t2.input2); + t2.squared = mul(t2.diff, t2.diff); + t2.sum = sum2(t2.squared); + const diffSum = await t2.sum.data(); const diffRelative = diffSum[0] / (input1.shape[1] || 1) / (input1.shape[2] || 1) / 255 / 3; - dispose([t.input1, t.input2, t.diff, t.squared, t.sum]); + dispose([t2.input1, t2.input2, t2.diff, t2.squared, t2.sum]); return diffRelative; } @@ -73465,7 +73457,7 @@ var Env = class { __publicField(this, "ImageData"); this.browser = typeof navigator !== "undefined"; this.node = typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"; - this.tfjs = { version: version82["tfjs-core"] }; + this.tfjs = { version: V["tfjs-core"] }; this.offscreen = typeof OffscreenCanvas !== "undefined"; this.initial = true; this.worker = this.browser && this.offscreen ? typeof WorkerGlobalScope !== "undefined" : void 0; @@ -73508,12 +73500,12 @@ var Env = class { try { if (this.webgpu.supported) this.webgpu.adapter = (await navigator["gpu"].requestAdapter()).name; - } catch (e) { + } catch (e2) { this.webgpu.supported = false; } try { this.kernels = getKernelsForBackend(getBackend()).map((kernel) => kernel.kernelName.toLowerCase()); - } catch (e) { + } catch (e2) { } } updateCPU() { @@ -73706,28 +73698,28 @@ async function predict(image2, config3, idx, count3) { var _a2, _b2; if (!(model2 == null ? void 0 : model2.inputs[0].shape)) return; - const t = {}; + const t2 = {}; const box = [[0, 0.1, 0.9, 0.9]]; - t.resize = image.cropAndResize(image2, box, [0], [model2.inputs[0].shape[2], model2.inputs[0].shape[1]]); + t2.resize = image.cropAndResize(image2, box, [0], [model2.inputs[0].shape[2], model2.inputs[0].shape[1]]); const obj = { age: 0, gender: "unknown", genderScore: 0, race: [] }; if ((_a2 = config3.face["gear"]) == null ? void 0 : _a2.enabled) - [t.age, t.gender, t.race] = model2.execute(t.resize, ["age_output", "gender_output", "race_output"]); - const gender2 = await t.gender.data(); + [t2.age, t2.gender, t2.race] = model2.execute(t2.resize, ["age_output", "gender_output", "race_output"]); + const gender2 = await t2.gender.data(); obj.gender = gender2[0] > gender2[1] ? "male" : "female"; obj.genderScore = Math.round(100 * (gender2[0] > gender2[1] ? gender2[0] : gender2[1])) / 100; - const race = await t.race.data(); - for (let i = 0; i < race.length; i++) { - if (race[i] > (((_b2 = config3.face["gear"]) == null ? void 0 : _b2.minConfidence) || 0.2)) - obj.race.push({ score: Math.round(100 * race[i]) / 100, race: raceNames[i] }); + const race = await t2.race.data(); + for (let i2 = 0; i2 < race.length; i2++) { + if (race[i2] > (((_b2 = config3.face["gear"]) == null ? void 0 : _b2.minConfidence) || 0.2)) + obj.race.push({ score: Math.round(100 * race[i2]) / 100, race: raceNames[i2] }); } obj.race.sort((a, b) => b.score - a.score); - const ageDistribution = Array.from(await t.age.data()); - const ageSorted = ageDistribution.map((a, i) => [ageWeights[i], a]).sort((a, b) => b[1] - a[1]); + const ageDistribution = Array.from(await t2.age.data()); + const ageSorted = ageDistribution.map((a, i2) => [ageWeights[i2], a]).sort((a, b) => b[1] - a[1]); let age2 = ageSorted[0][0]; - for (let i = 1; i < ageSorted.length; i++) - age2 += ageSorted[i][1] * (ageSorted[i][0] - age2); + for (let i2 = 1; i2 < ageSorted.length; i2++) + age2 += ageSorted[i2][1] * (ageSorted[i2][0] - age2); obj.age = Math.round(10 * age2) / 10; - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); last2[idx] = obj; lastCount = count3; lastTime = now(); @@ -73782,17 +73774,17 @@ async function predict2(image2, config3, idx, count3) { return new Promise(async (resolve) => { if (!(model3 == null ? void 0 : model3.inputs) || !model3.inputs[0] || !model3.inputs[0].shape) return; - const t = {}; - t.resize = image.resizeBilinear(image2, [model3.inputs[0].shape[2], model3.inputs[0].shape[1]], false); - t.enhance = mul(t.resize, constants.tf255); + const t2 = {}; + t2.resize = image.resizeBilinear(image2, [model3.inputs[0].shape[2], model3.inputs[0].shape[1]], false); + t2.enhance = mul(t2.resize, constants.tf255); const obj = { age: 0 }; if (config3.face["ssrnet"].enabled) - t.age = model3.execute(t.enhance); - if (t.age) { - const data = await t.age.data(); + t2.age = model3.execute(t2.enhance); + if (t2.age) { + const data = await t2.age.data(); obj.age = Math.trunc(10 * data[0]) / 10; } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); last3[idx] = obj; lastCount2 = count3; lastTime2 = now(); @@ -73830,10 +73822,10 @@ async function predict3(image2, config3, idx, count3) { return new Promise(async (resolve) => { if (!(model4 == null ? void 0 : model4.inputs[0].shape)) return; - const t = {}; - t.resize = image.resizeBilinear(image2, [model4.inputs[0].shape[2], model4.inputs[0].shape[1]], false); - t.enhance = tidy(() => { - const [red, green, blue] = split(t.resize, 3, 3); + const t2 = {}; + t2.resize = image.resizeBilinear(image2, [model4.inputs[0].shape[2], model4.inputs[0].shape[1]], false); + t2.enhance = tidy(() => { + const [red, green, blue] = split(t2.resize, 3, 3); const redNorm = mul(red, rgb[0]); const greenNorm = mul(green, rgb[1]); const blueNorm = mul(blue, rgb[2]); @@ -73843,11 +73835,11 @@ async function predict3(image2, config3, idx, count3) { }); const obj = { gender: "unknown", genderScore: 0 }; if (config3.face["ssrnet"].enabled) - t.gender = model4.execute(t.enhance); - const data = await t.gender.data(); + t2.gender = model4.execute(t2.enhance); + const data = await t2.gender.data(); obj.gender = data[0] > data[1] ? "female" : "male"; obj.genderScore = data[0] > data[1] ? Math.trunc(100 * data[0]) / 100 : Math.trunc(100 * data[1]) / 100; - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); last4[idx] = obj; lastCount3 = count3; lastTime3 = now(); @@ -77336,14 +77328,14 @@ var computeRotation = (point1, point2) => normalizeRadians(Math.PI / 2 - Math.at var buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]]; var dot4 = (v1, v2) => { let product = 0; - for (let i = 0; i < v1.length; i++) - product += v1[i] * v2[i]; + for (let i2 = 0; i2 < v1.length; i2++) + product += v1[i2] * v2[i2]; return product; }; var getColumnFrom2DArr = (arr, columnIndex) => { const column = []; - for (let i = 0; i < arr.length; i++) - column.push(arr[i][columnIndex]); + for (let i2 = 0; i2 < arr.length; i2++) + column.push(arr[i2][columnIndex]); return column; }; var multiplyTransformMatrices = (mat1, mat2) => { @@ -77375,16 +77367,16 @@ var rotatePoint = (homogeneousCoordinate, rotationMatrix) => [dot4(homogeneousCo function generateAnchors(inputSize10) { const spec = inputSize10 === 192 ? { strides: [4], anchors: [1] } : { strides: [inputSize10 / 16, inputSize10 / 8], anchors: [2, 6] }; const anchors3 = []; - for (let i = 0; i < spec.strides.length; i++) { - const stride = spec.strides[i]; + for (let i2 = 0; i2 < spec.strides.length; i2++) { + const stride = spec.strides[i2]; const gridRows = Math.floor((inputSize10 + stride - 1) / stride); const gridCols = Math.floor((inputSize10 + stride - 1) / stride); - const anchorsNum = spec.anchors[i]; + const anchorsNum = spec.anchors[i2]; 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++) + for (let n2 = 0; n2 < anchorsNum; n2++) anchors3.push([anchorX, anchorY]); } } @@ -77470,56 +77462,56 @@ async function load5(config3) { return model6; } function decodeBoxes(boxOutputs) { - const t = {}; - t.boxStarts = slice(boxOutputs, [0, 1], [-1, 2]); - t.centers = add2(t.boxStarts, anchors); - t.boxSizes = slice(boxOutputs, [0, 3], [-1, 2]); - t.boxSizesNormalized = div(t.boxSizes, inputSizeT); - t.centersNormalized = div(t.centers, inputSizeT); - t.halfBoxSize = div(t.boxSizesNormalized, constants.tf2); - t.starts = sub(t.centersNormalized, t.halfBoxSize); - t.ends = add2(t.centersNormalized, t.halfBoxSize); - t.startNormalized = mul(t.starts, inputSizeT); - t.endNormalized = mul(t.ends, inputSizeT); - const boxes = concat2d([t.startNormalized, t.endNormalized], 1); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + const t2 = {}; + t2.boxStarts = slice(boxOutputs, [0, 1], [-1, 2]); + t2.centers = add2(t2.boxStarts, anchors); + t2.boxSizes = slice(boxOutputs, [0, 3], [-1, 2]); + t2.boxSizesNormalized = div(t2.boxSizes, inputSizeT); + t2.centersNormalized = div(t2.centers, inputSizeT); + t2.halfBoxSize = div(t2.boxSizesNormalized, constants.tf2); + t2.starts = sub(t2.centersNormalized, t2.halfBoxSize); + t2.ends = add2(t2.centersNormalized, t2.halfBoxSize); + t2.startNormalized = mul(t2.starts, inputSizeT); + t2.endNormalized = mul(t2.ends, inputSizeT); + const boxes = concat2d([t2.startNormalized, t2.endNormalized], 1); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return boxes; } async function getBoxes(inputImage, config3) { var _a, _b, _c, _d; if (!inputImage || inputImage["isDisposedInternal"] || inputImage.shape.length !== 4 || inputImage.shape[1] < 1 || inputImage.shape[2] < 1) return []; - const t = {}; - t.resized = image.resizeBilinear(inputImage, [inputSize, inputSize]); - t.div = div(t.resized, constants.tf127); - t.normalized = sub(t.div, constants.tf05); - const res = model6 == null ? void 0 : model6.execute(t.normalized); + const t2 = {}; + t2.resized = image.resizeBilinear(inputImage, [inputSize, inputSize]); + t2.div = div(t2.resized, constants.tf127); + t2.normalized = sub(t2.div, constants.tf05); + const res = model6 == null ? void 0 : model6.execute(t2.normalized); if (Array.isArray(res) && res.length > 2) { const sorted = res.sort((a, b) => a.size - b.size); - t.concat384 = concat([sorted[0], sorted[2]], 2); - t.concat512 = concat([sorted[1], sorted[3]], 2); - t.concat = concat([t.concat512, t.concat384], 1); - t.batch = squeeze(t.concat, 0); + t2.concat384 = concat([sorted[0], sorted[2]], 2); + t2.concat512 = concat([sorted[1], sorted[3]], 2); + t2.concat = concat([t2.concat512, t2.concat384], 1); + t2.batch = squeeze(t2.concat, 0); } else if (Array.isArray(res)) { - t.batch = squeeze(res[0]); + t2.batch = squeeze(res[0]); } else { - t.batch = squeeze(res); + t2.batch = squeeze(res); } dispose(res); - t.boxes = decodeBoxes(t.batch); - t.logits = slice(t.batch, [0, 0], [-1, 1]); - t.sigmoid = sigmoid(t.logits); - t.scores = squeeze(t.sigmoid); - t.nms = image.nonMaxSuppression(t.boxes, t.scores, ((_a = config3.face.detector) == null ? void 0 : _a.maxDetected) || 0, ((_b = config3.face.detector) == null ? void 0 : _b.iouThreshold) || 0, ((_c = config3.face.detector) == null ? void 0 : _c.minConfidence) || 0); - const nms = await t.nms.array(); + t2.boxes = decodeBoxes(t2.batch); + t2.logits = slice(t2.batch, [0, 0], [-1, 1]); + t2.sigmoid = sigmoid(t2.logits); + t2.scores = squeeze(t2.sigmoid); + t2.nms = image.nonMaxSuppression(t2.boxes, t2.scores, ((_a = config3.face.detector) == null ? void 0 : _a.maxDetected) || 0, ((_b = config3.face.detector) == null ? void 0 : _b.iouThreshold) || 0, ((_c = config3.face.detector) == null ? void 0 : _c.minConfidence) || 0); + const nms = await t2.nms.array(); const boxes = []; - const scores = await t.scores.data(); - for (let i = 0; i < nms.length; i++) { - const confidence = scores[nms[i]]; + const scores = await t2.scores.data(); + for (let i2 = 0; i2 < nms.length; i2++) { + const confidence = scores[nms[i2]]; if (confidence > (((_d = config3.face.detector) == null ? void 0 : _d.minConfidence) || 0)) { const b = {}; - b.bbox = slice(t.boxes, [nms[i], 0], [1, -1]); - b.slice = slice(t.batch, [nms[i], keypointsCount - 1], [1, -1]); + b.bbox = slice(t2.boxes, [nms[i2], 0], [1, -1]); + b.slice = slice(t2.batch, [nms[i2], keypointsCount - 1], [1, -1]); b.squeeze = squeeze(b.slice); b.landmarks = reshape(b.squeeze, [keypointsCount, -1]); const points = await b.bbox.data(); @@ -77536,7 +77528,7 @@ async function getBoxes(inputImage, config3) { Object.keys(b).forEach((tensor2) => dispose(b[tensor2])); } } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return boxes; } @@ -77715,12 +77707,12 @@ async function loadPose(config3) { return models.landmarks; } async function prepareImage(input2, size2) { - const t = {}; + const t2 = {}; if (!input2.shape || !input2.shape[1] || !input2.shape[2]) return input2; let final; if (cropBox) { - t.cropped = image.cropAndResize(input2, [cropBox], [0], [input2.shape[1], input2.shape[2]]); + t2.cropped = image.cropAndResize(input2, [cropBox], [0], [input2.shape[1], input2.shape[2]]); } if (input2.shape[1] !== input2.shape[2]) { const height = [ @@ -77737,16 +77729,16 @@ async function prepareImage(input2, size2) { width, [0, 0] ]; - t.pad = pad(t.cropped || input2, padding); - t.resize = image.resizeBilinear(t.pad, [size2, size2]); - final = div(t.resize, constants.tf255); + t2.pad = pad(t2.cropped || input2, padding); + t2.resize = image.resizeBilinear(t2.pad, [size2, size2]); + final = div(t2.resize, constants.tf255); } else if (input2.shape[1] !== size2) { - t.resize = image.resizeBilinear(t.cropped || input2, [size2, size2]); - final = div(t.resize, constants.tf255); + t2.resize = image.resizeBilinear(t2.cropped || input2, [size2, size2]); + final = div(t2.resize, constants.tf255); } else { - final = div(t.cropped || input2, constants.tf255); + final = div(t2.cropped || input2, constants.tf255); } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return final; } function rescaleKeypoints(keypoints, outputSize2) { @@ -77786,22 +77778,22 @@ async function fixKeypoints(keypoints) { } async function detectLandmarks(input2, config3, outputSize2) { var _a; - const t = {}; - [t.ld, t.segmentation, t.heatmap, t.world, t.poseflag] = (_a = models.landmarks) == null ? void 0 : _a.execute(input2, outputNodes.landmarks); - const poseScore = (await t.poseflag.data())[0]; - const points = await t.ld.data(); - const distances = await t.world.data(); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + const t2 = {}; + [t2.ld, t2.segmentation, t2.heatmap, t2.world, t2.poseflag] = (_a = models.landmarks) == null ? void 0 : _a.execute(input2, outputNodes.landmarks); + const poseScore = (await t2.poseflag.data())[0]; + const points = await t2.ld.data(); + const distances = await t2.world.data(); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); const keypointsRelative = []; const depth = 5; - for (let i = 0; i < points.length / depth; i++) { - const score = sigmoid6(points[depth * i + 3]); - const presence = sigmoid6(points[depth * i + 4]); + for (let i2 = 0; i2 < points.length / depth; i2++) { + const score = sigmoid6(points[depth * i2 + 3]); + const presence = sigmoid6(points[depth * i2 + 4]); const adjScore = Math.trunc(100 * score * presence * poseScore) / 100; - const positionRaw = [points[depth * i + 0] / inputSize3.landmarks[0], points[depth * i + 1] / inputSize3.landmarks[1], points[depth * i + 2] + 0]; + const positionRaw = [points[depth * i2 + 0] / inputSize3.landmarks[0], points[depth * i2 + 1] / inputSize3.landmarks[1], points[depth * i2 + 2] + 0]; const position = [Math.trunc(outputSize2[0] * positionRaw[0]), Math.trunc(outputSize2[1] * positionRaw[1]), positionRaw[2]]; - const distance2 = [distances[depth * i + 0], distances[depth * i + 1], distances[depth * i + 2] + 0]; - keypointsRelative.push({ part: kpt[i], positionRaw, position, distance: distance2, score: adjScore }); + const distance2 = [distances[depth * i2 + 0], distances[depth * i2 + 1], distances[depth * i2 + 2] + 0]; + keypointsRelative.push({ part: kpt[i2], positionRaw, position, distance: distance2, score: adjScore }); } if (poseScore < (config3.body.minConfidence || 0)) return null; @@ -77812,9 +77804,9 @@ async function detectLandmarks(input2, config3, outputSize2) { const annotations2 = {}; for (const [name, indexes] of Object.entries(connected)) { const pt = []; - for (let i = 0; i < indexes.length - 1; i++) { - const pt0 = keypoints.find((kpt4) => kpt4.part === indexes[i]); - const pt1 = keypoints.find((kpt4) => kpt4.part === indexes[i + 1]); + for (let i2 = 0; i2 < indexes.length - 1; i2++) { + const pt0 = keypoints.find((kpt4) => kpt4.part === indexes[i2]); + const pt1 = keypoints.find((kpt4) => kpt4.part === indexes[i2 + 1]); if (pt0 && pt1) pt.push([pt0.position, pt1.position]); } @@ -77830,10 +77822,10 @@ async function predict5(input2, config3) { if (config3.skipAllowed && skipTime && skipFrame && cache !== null) { skipped5++; } else { - const t = {}; - t.landmarks = await prepareImage(input2, 256); - cache = await detectLandmarks(t.landmarks, config3, outputSize2); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + const t2 = {}; + t2.landmarks = await prepareImage(input2, 256); + cache = await detectLandmarks(t2.landmarks, config3, outputSize2); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); lastTime5 = now(); skipped5 = 0; } @@ -77944,19 +77936,19 @@ async function load6(config3) { async function process3(res, outputShape, config3) { if (!res) return []; - const t = {}; + const t2 = {}; const results = []; const detections = await res.array(); - t.squeeze = squeeze(res); - const arr = split(t.squeeze, 6, 1); - t.stack = stack([arr[1], arr[0], arr[3], arr[2]], 1); - t.boxes = squeeze(t.stack); - t.scores = squeeze(arr[4]); - t.classes = squeeze(arr[5]); + t2.squeeze = squeeze(res); + const arr = split(t2.squeeze, 6, 1); + t2.stack = stack([arr[1], arr[0], arr[3], arr[2]], 1); + t2.boxes = squeeze(t2.stack); + t2.scores = squeeze(arr[4]); + t2.classes = squeeze(arr[5]); dispose([res, ...arr]); - t.nms = image.nonMaxSuppression(t.boxes, t.scores, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence || 0); - const nms = await t.nms.data(); - let i = 0; + t2.nms = image.nonMaxSuppression(t2.boxes, t2.scores, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence || 0); + const nms = await t2.nms.data(); + let i2 = 0; for (const id of Array.from(nms)) { const score = Math.trunc(100 * detections[0][id][4]) / 100; const classVal = detections[0][id][5]; @@ -77977,9 +77969,9 @@ async function process3(res, outputShape, config3) { Math.trunc(boxRaw[2] * outputShape[0]), Math.trunc(boxRaw[3] * outputShape[1]) ]; - results.push({ id: i++, score, class: classVal, label, box, boxRaw }); + results.push({ id: i2++, score, class: classVal, label, box, boxRaw }); } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return results; } async function predict6(input2, config3) { @@ -78113,7 +78105,7 @@ async function predict7(image2, config3) { }); } } - stack2.forEach((s) => dispose(s)); + stack2.forEach((s2) => dispose(s2)); } cache2.score = cache2.keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); const x = cache2.keypoints.map((a) => a.position[0]); @@ -78134,9 +78126,9 @@ async function predict7(image2, config3) { ]; for (const [name, indexes] of Object.entries(connected2)) { const pt = []; - for (let i = 0; i < indexes.length - 1; i++) { - const pt0 = cache2.keypoints.find((kpt4) => kpt4.part === indexes[i]); - const pt1 = cache2.keypoints.find((kpt4) => kpt4.part === indexes[i + 1]); + for (let i2 = 0; i2 < indexes.length - 1; i2++) { + const pt0 = cache2.keypoints.find((kpt4) => kpt4.part === indexes[i2]); + const pt1 = cache2.keypoints.find((kpt4) => kpt4.part === indexes[i2 + 1]); if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]); } @@ -78178,22 +78170,22 @@ async function predict8(image2, config3, idx, count3) { var _a2, _b2; const obj = []; if ((_a2 = config3.face.emotion) == null ? void 0 : _a2.enabled) { - const t = {}; + const t2 = {}; const inputSize10 = (model9 == null ? void 0 : model9.inputs[0].shape) ? model9.inputs[0].shape[2] : 0; - t.resize = image.resizeBilinear(image2, [inputSize10, inputSize10], false); - t.channels = mul(t.resize, constants.rgb); - t.grayscale = sum2(t.channels, 3, true); - t.grayscaleSub = sub(t.grayscale, constants.tf05); - t.grayscaleMul = mul(t.grayscaleSub, constants.tf2); - t.emotion = model9 == null ? void 0 : model9.execute(t.grayscaleMul); + t2.resize = image.resizeBilinear(image2, [inputSize10, inputSize10], false); + t2.channels = mul(t2.resize, constants.rgb); + t2.grayscale = sum2(t2.channels, 3, true); + t2.grayscaleSub = sub(t2.grayscale, constants.tf05); + t2.grayscaleMul = mul(t2.grayscaleSub, constants.tf2); + t2.emotion = model9 == null ? void 0 : model9.execute(t2.grayscaleMul); lastTime8 = now(); - const data = await t.emotion.data(); - for (let i = 0; i < data.length; i++) { - if (data[i] > (((_b2 = config3.face.emotion) == null ? void 0 : _b2.minConfidence) || 0)) - obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] }); + const data = await t2.emotion.data(); + for (let i2 = 0; i2 < data.length; i2++) { + if (data[i2] > (((_b2 = config3.face.emotion) == null ? void 0 : _b2.minConfidence) || 0)) + obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i2]) / 100), emotion: annotations[i2] }); } obj.sort((a, b) => b.score - a.score); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); } last6[idx] = obj; lastCount5 = count3; @@ -78230,12 +78222,12 @@ async function predict9(input2, config3, idx, count3) { var _a2; let data = []; if (((_a2 = config3.face["mobilefacenet"]) == null ? void 0 : _a2.enabled) && (model10 == null ? void 0 : model10.inputs[0].shape)) { - const t = {}; - t.crop = image.resizeBilinear(input2, [model10.inputs[0].shape[2], model10.inputs[0].shape[1]], false); - t.data = model10 == null ? void 0 : model10.execute(t.crop); - const output = await t.data.data(); + const t2 = {}; + t2.crop = image.resizeBilinear(input2, [model10.inputs[0].shape[2], model10.inputs[0].shape[1]], false); + t2.data = model10 == null ? void 0 : model10.execute(t2.crop); + const output = await t2.data.data(); data = Array.from(output); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); } last7[idx] = data; lastCount6 = count3; @@ -78273,12 +78265,12 @@ async function predict10(input2, config3, idx, count3) { var _a2; let data = []; if (((_a2 = config3.face["insightface"]) == null ? void 0 : _a2.enabled) && (model11 == null ? void 0 : model11.inputs[0].shape)) { - const t = {}; - t.crop = image.resizeBilinear(input2, [model11.inputs[0].shape[2], model11.inputs[0].shape[1]], false); - t.data = model11 == null ? void 0 : model11.execute(t.crop); - const output = await t.data.data(); + const t2 = {}; + t2.crop = image.resizeBilinear(input2, [model11.inputs[0].shape[2], model11.inputs[0].shape[1]], false); + t2.data = model11 == null ? void 0 : model11.execute(t2.crop); + const output = await t2.data.data(); data = Array.from(output); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); } last8[idx] = data; lastCount7 = count3; @@ -78317,8 +78309,8 @@ async function load11(config3) { return model12; } function replaceIrisCoords(rawCoords, newCoords, prefix, keys) { - for (let i = 0; i < irisIndices.length; i++) { - const { key, indices } = irisIndices[i]; + for (let i2 = 0; i2 < irisIndices.length; i2++) { + const { key, indices } = irisIndices[i2]; const originalIndices = meshAnnotations[`${prefix}${key}`]; if (!keys || keys.includes(key)) { for (let j = 0; j < indices.length; j++) { @@ -78355,10 +78347,10 @@ var getEyeBox = (rawCoords, face4, eyeInnerCornerIndex, eyeOuterCornerIndex, mes }; var 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]; + for (let i2 = 0; i2 < irisLandmarks.numCoordinates; i2++) { + const x = eyeData[i2 * 3]; + const y = eyeData[i2 * 3 + 1]; + const z = eyeData[i2 * 3 + 2]; eyeRawCoords.push([ (flip ? 1 - x / inputSize5 : x / inputSize5) * eyeBoxSize[0] + eyeBox.startPoint[0], y / inputSize5 * eyeBoxSize[1] + eyeBox.startPoint[1], @@ -78371,11 +78363,11 @@ var getAdjustedIrisCoords = (rawCoords, irisCoords, direction) => { const upperCenterZ = rawCoords[meshAnnotations[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2]; const lowerCenterZ = rawCoords[meshAnnotations[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2]; const averageZ = (upperCenterZ + lowerCenterZ) / 2; - return irisCoords.map((coord, i) => { + return irisCoords.map((coord, i2) => { let z = averageZ; - if (i === 2) { + if (i2 === 2) { z = upperCenterZ; - } else if (i === 4) { + } else if (i2 === 4) { z = lowerCenterZ; } return [coord[0], coord[1], z]; @@ -78750,25 +78742,25 @@ var LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG = [ // src/face/attention.ts async function augment(rawCoords, results) { - const t = { - lips: await results.filter((r) => r.size === 160)[0].data(), - irisL: await results.filter((r) => r.size === 10)[0].data(), - eyeL: await results.filter((r) => r.size === 142)[0].data(), - irisR: await results.filter((r) => r.size === 10)[1].data(), - eyeR: await results.filter((r) => r.size === 142)[1].data() + const t2 = { + lips: await results.filter((r2) => r2.size === 160)[0].data(), + irisL: await results.filter((r2) => r2.size === 10)[0].data(), + eyeL: await results.filter((r2) => r2.size === 142)[0].data(), + irisR: await results.filter((r2) => r2.size === 10)[1].data(), + eyeR: await results.filter((r2) => r2.size === 142)[1].data() }; const irisLDepth = LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.length; - for (let i = 0; i < t.irisL.length / 2; i++) - rawCoords.push([t.irisL[2 * i + 0], t.irisL[2 * i + 1], irisLDepth]); + for (let i2 = 0; i2 < t2.irisL.length / 2; i2++) + rawCoords.push([t2.irisL[2 * i2 + 0], t2.irisL[2 * i2 + 1], irisLDepth]); const irisRDepth = LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.reduce((prev, curr) => prev += rawCoords[curr][2], 0) / LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.length; - for (let i = 0; i < t.irisR.length / 2; i++) - rawCoords.push([t.irisR[2 * i + 0], t.irisR[2 * i + 1], irisRDepth]); - for (let i = 0; i < t.eyeL.length / 2; i++) - rawCoords[LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]] = [t.eyeL[2 * i + 0], t.eyeL[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i]][2]]; - for (let i = 0; i < t.eyeR.length / 2; i++) - rawCoords[LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]] = [t.eyeR[2 * i + 0], t.eyeR[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i]][2]]; - for (let i = 0; i < t.lips.length / 2; i++) - rawCoords[LANDMARKS_REFINEMENT_LIPS_CONFIG[i]] = [t.lips[2 * i + 0], t.lips[2 * i + 1], rawCoords[LANDMARKS_REFINEMENT_LIPS_CONFIG[i]][2]]; + for (let i2 = 0; i2 < t2.irisR.length / 2; i2++) + rawCoords.push([t2.irisR[2 * i2 + 0], t2.irisR[2 * i2 + 1], irisRDepth]); + for (let i2 = 0; i2 < t2.eyeL.length / 2; i2++) + rawCoords[LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i2]] = [t2.eyeL[2 * i2 + 0], t2.eyeL[2 * i2 + 1], rawCoords[LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG[i2]][2]]; + for (let i2 = 0; i2 < t2.eyeR.length / 2; i2++) + rawCoords[LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i2]] = [t2.eyeR[2 * i2 + 0], t2.eyeR[2 * i2 + 1], rawCoords[LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG[i2]][2]]; + for (let i2 = 0; i2 < t2.lips.length / 2; i2++) + rawCoords[LANDMARKS_REFINEMENT_LIPS_CONFIG[i2]] = [t2.lips[2 * i2 + 0], t2.lips[2 * i2 + 1], rawCoords[LANDMARKS_REFINEMENT_LIPS_CONFIG[i2]][2]]; return rawCoords; } @@ -78794,8 +78786,8 @@ async function predict11(input2, config3) { const faces = []; const newCache = []; let id = 0; - for (let i = 0; i < cache3.boxes.length; i++) { - const box = cache3.boxes[i]; + for (let i2 = 0; i2 < cache3.boxes.length; i2++) { + const box = cache3.boxes[i2]; let angle = 0; let rotationMatrix; const face4 = { @@ -78837,7 +78829,7 @@ async function predict11(input2, config3) { return faces; } const results = model13.execute(face4.tensor); - const confidenceT = results.find((t) => t.shape[t.shape.length - 1] === 1); + const confidenceT = results.find((t2) => t2.shape[t2.shape.length - 1] === 1); const faceConfidence = await confidenceT.data(); face4.faceScore = Math.round(100 * faceConfidence[0]) / 100; if (face4.faceScore < (((_h = config3.face.detector) == null ? void 0 : _h.minConfidence) || 1)) { @@ -78856,7 +78848,7 @@ async function predict11(input2, config3) { } } } else { - const meshT = results.find((t) => t.shape[t.shape.length - 1] === 1404); + const meshT = results.find((t2) => t2.shape[t2.shape.length - 1] === 1404); const coordsReshaped = reshape(meshT, [-1, 3]); let rawCoords = await coordsReshaped.array(); dispose(coordsReshaped); @@ -78956,23 +78948,23 @@ async function predict12(image2, config3, idx, count3) { const resT = model14 == null ? void 0 : model14.execute(enhanced); lastTime11 = now(); dispose(enhanced); - const genderT = await resT.find((t) => t.shape[1] === 1); + const genderT = await resT.find((t2) => t2.shape[1] === 1); const gender2 = await genderT.data(); const confidence = Math.trunc(200 * Math.abs(gender2[0] - 0.5)) / 100; if (confidence > (((_b2 = config3.face.description) == null ? void 0 : _b2.minConfidence) || 0)) { obj.gender = gender2[0] <= 0.5 ? "female" : "male"; obj.genderScore = Math.min(0.99, confidence); } - const argmax2 = argMax(resT.find((t) => t.shape[1] === 100), 1); + const argmax2 = argMax(resT.find((t2) => t2.shape[1] === 100), 1); const age2 = (await argmax2.data())[0]; dispose(argmax2); - const ageT = resT.find((t) => t.shape[1] === 100); + const ageT = resT.find((t2) => t2.shape[1] === 100); const all6 = await ageT.data(); obj.age = Math.round(all6[age2 - 1] > all6[age2 + 1] ? 10 * age2 - 100 * all6[age2 - 1] : 10 * age2 + 100 * all6[age2 + 1]) / 10; - const desc = resT.find((t) => t.shape[1] === 1024); + const desc = resT.find((t2) => t2.shape[1] === 1024); const descriptor = desc ? await desc.data() : []; obj.descriptor = Array.from(descriptor); - resT.forEach((t) => dispose(t)); + resT.forEach((t2) => dispose(t2)); } last9[idx] = obj; lastCount8 = count3; @@ -79040,15 +79032,15 @@ function computeRotation2(point1, point2) { var buildTranslationMatrix2 = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]]; function dot5(v1, v2) { let product = 0; - for (let i = 0; i < v1.length; i++) { - product += v1[i] * v2[i]; + for (let i2 = 0; i2 < v1.length; i2++) { + product += v1[i2] * v2[i2]; } return product; } function getColumnFrom2DArr2(arr, columnIndex) { const column = []; - for (let i = 0; i < arr.length; i++) { - column.push(arr[i][columnIndex]); + for (let i2 = 0; i2 < arr.length; i2++) { + column.push(arr[i2][columnIndex]); } return column; } @@ -82057,49 +82049,49 @@ var HandDetector = class { this.doubleInputSizeTensor = tensor1d([this.inputSize * 2, this.inputSize * 2]); } normalizeBoxes(boxes) { - const t = {}; - t.boxOffsets = slice(boxes, [0, 0], [-1, 2]); - t.boxSizes = slice(boxes, [0, 2], [-1, 2]); - t.div = div(t.boxOffsets, this.inputSizeTensor); - t.boxCenterPoints = add2(t.div, this.anchorsTensor); - t.halfBoxSizes = div(t.boxSizes, this.doubleInputSizeTensor); - t.sub = sub(t.boxCenterPoints, t.halfBoxSizes); - t.startPoints = mul(t.sub, this.inputSizeTensor); - t.add = add2(t.boxCenterPoints, t.halfBoxSizes); - t.endPoints = mul(t.add, this.inputSizeTensor); - const res = concat2d([t.startPoints, t.endPoints], 1); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + const t2 = {}; + t2.boxOffsets = slice(boxes, [0, 0], [-1, 2]); + t2.boxSizes = slice(boxes, [0, 2], [-1, 2]); + t2.div = div(t2.boxOffsets, this.inputSizeTensor); + t2.boxCenterPoints = add2(t2.div, this.anchorsTensor); + t2.halfBoxSizes = div(t2.boxSizes, this.doubleInputSizeTensor); + t2.sub = sub(t2.boxCenterPoints, t2.halfBoxSizes); + t2.startPoints = mul(t2.sub, this.inputSizeTensor); + t2.add = add2(t2.boxCenterPoints, t2.halfBoxSizes); + t2.endPoints = mul(t2.add, this.inputSizeTensor); + const res = concat2d([t2.startPoints, t2.endPoints], 1); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return res; } normalizeLandmarks(rawPalmLandmarks, index2) { - const t = {}; - t.reshape = reshape(rawPalmLandmarks, [-1, 7, 2]); - t.div = div(t.reshape, this.inputSizeTensor); - t.landmarks = add2(t.div, this.anchors[index2]); - const res = mul(t.landmarks, this.inputSizeTensor); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + const t2 = {}; + t2.reshape = reshape(rawPalmLandmarks, [-1, 7, 2]); + t2.div = div(t2.reshape, this.inputSizeTensor); + t2.landmarks = add2(t2.div, this.anchors[index2]); + const res = mul(t2.landmarks, this.inputSizeTensor); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return res; } async predict(input2, config3) { - const t = {}; - t.resize = image.resizeBilinear(input2, [this.inputSize, this.inputSize]); - t.div = div(t.resize, constants.tf127); - t.image = sub(t.div, constants.tf1); - t.batched = this.model.execute(t.image); - t.predictions = squeeze(t.batched); - t.slice = slice(t.predictions, [0, 0], [-1, 1]); - t.sigmoid = sigmoid(t.slice); - t.scores = squeeze(t.sigmoid); - const scores = await t.scores.data(); - t.boxes = slice(t.predictions, [0, 1], [-1, 4]); - t.norm = this.normalizeBoxes(t.boxes); - t.nms = image.nonMaxSuppression(t.norm, t.scores, 3 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); - const nms = await t.nms.array(); + const t2 = {}; + t2.resize = image.resizeBilinear(input2, [this.inputSize, this.inputSize]); + t2.div = div(t2.resize, constants.tf127); + t2.image = sub(t2.div, constants.tf1); + t2.batched = this.model.execute(t2.image); + t2.predictions = squeeze(t2.batched); + t2.slice = slice(t2.predictions, [0, 0], [-1, 1]); + t2.sigmoid = sigmoid(t2.slice); + t2.scores = squeeze(t2.sigmoid); + const scores = await t2.scores.data(); + t2.boxes = slice(t2.predictions, [0, 1], [-1, 4]); + t2.norm = this.normalizeBoxes(t2.boxes); + t2.nms = image.nonMaxSuppression(t2.norm, t2.scores, 3 * config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); + const nms = await t2.nms.array(); const hands = []; for (const index2 of nms) { const p2 = {}; - p2.box = slice(t.norm, [index2, 0], [1, -1]); - p2.slice = slice(t.predictions, [index2, 5], [1, 14]); + p2.box = slice(t2.norm, [index2, 0], [1, -1]); + p2.slice = slice(t2.predictions, [index2, 5], [1, 14]); p2.norm = this.normalizeLandmarks(p2.slice, index2); p2.palmLandmarks = reshape(p2.norm, [-1, 2]); const box = await p2.box.data(); @@ -82111,7 +82103,7 @@ var HandDetector = class { hands.push(scaled); Object.keys(p2).forEach((tensor2) => dispose(p2[tensor2])); } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return hands; } }; @@ -82154,8 +82146,8 @@ var HandPipeline = class { 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)); + for (let i2 = 0; i2 < palmLandmarkIds.length; i2++) { + boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i2]].slice(0, 2)); } return boxAroundHand; } @@ -82202,8 +82194,8 @@ var HandPipeline = class { useFreshBox = true; } const hands = []; - for (let i = 0; i < this.storedBoxes.length; i++) { - const currentBox = this.storedBoxes[i]; + for (let i2 = 0; i2 < this.storedBoxes.length; i2++) { + const currentBox = this.storedBoxes[i2]; if (!currentBox) continue; if (config3.hand.landmarks) { @@ -82229,7 +82221,7 @@ var HandPipeline = class { dispose(keypointsReshaped); const coords3 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); const nextBoundingBox = this.getBoxForHandLandmarks(coords3); - this.storedBoxes[i] = { ...nextBoundingBox, confidence }; + this.storedBoxes[i2] = { ...nextBoundingBox, confidence }; const result = { landmarks: coords3, confidence, @@ -82239,7 +82231,7 @@ var HandPipeline = class { }; hands.push(result); } else { - this.storedBoxes[i] = null; + this.storedBoxes[i2] = null; } dispose(keypoints); } else { @@ -82682,14 +82674,14 @@ async function predict13(input2, config3) { if (!predictions) return []; const hands = []; - for (let i = 0; i < predictions.length; i++) { + for (let i2 = 0; i2 < predictions.length; i2++) { const annotations2 = {}; - if (predictions[i].landmarks) { + if (predictions[i2].landmarks) { for (const key of Object.keys(meshAnnotations2)) { - annotations2[key] = meshAnnotations2[key].map((index2) => predictions[i].landmarks[index2]); + annotations2[key] = meshAnnotations2[key].map((index2) => predictions[i2].landmarks[index2]); } } - const keypoints = predictions[i].landmarks; + const keypoints = predictions[i2].landmarks; let box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; let boxRaw = [0, 0, 0, 0]; if (keypoints && keypoints.length > 0) { @@ -82707,25 +82699,25 @@ async function predict13(input2, config3) { box[3] -= box[1]; boxRaw = [box[0] / (input2.shape[2] || 0), box[1] / (input2.shape[1] || 0), box[2] / (input2.shape[2] || 0), box[3] / (input2.shape[1] || 0)]; } else { - box = 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(input2.shape[2] || 0, predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])), - Math.trunc(Math.min(input2.shape[1] || 0, predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])) + box = predictions[i2].box ? [ + Math.trunc(Math.max(0, predictions[i2].box.topLeft[0])), + Math.trunc(Math.max(0, predictions[i2].box.topLeft[1])), + Math.trunc(Math.min(input2.shape[2] || 0, predictions[i2].box.bottomRight[0]) - Math.max(0, predictions[i2].box.topLeft[0])), + Math.trunc(Math.min(input2.shape[1] || 0, predictions[i2].box.bottomRight[1]) - Math.max(0, predictions[i2].box.topLeft[1])) ] : [0, 0, 0, 0]; boxRaw = [ - predictions[i].box.topLeft[0] / (input2.shape[2] || 0), - predictions[i].box.topLeft[1] / (input2.shape[1] || 0), - (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input2.shape[2] || 0), - (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input2.shape[1] || 0) + predictions[i2].box.topLeft[0] / (input2.shape[2] || 0), + predictions[i2].box.topLeft[1] / (input2.shape[1] || 0), + (predictions[i2].box.bottomRight[0] - predictions[i2].box.topLeft[0]) / (input2.shape[2] || 0), + (predictions[i2].box.bottomRight[1] - predictions[i2].box.topLeft[1]) / (input2.shape[1] || 0) ]; } const landmarks = analyze(keypoints); hands.push({ - id: i, - score: Math.round(100 * predictions[i].confidence) / 100, - boxScore: Math.round(100 * predictions[i].boxConfidence) / 100, - fingerScore: Math.round(100 * predictions[i].fingerConfidence) / 100, + id: i2, + score: Math.round(100 * predictions[i2].confidence) / 100, + boxScore: Math.round(100 * predictions[i2].boxConfidence) / 100, + fingerScore: Math.round(100 * predictions[i2].fingerConfidence) / 100, label: "hand", box, boxRaw, @@ -82806,17 +82798,17 @@ async function register(instance2) { return; } if (config2.canvas) { - config2.canvas.addEventListener("webglcontextlost", async (e) => { - log("error: humangl:", e.type); + config2.canvas.addEventListener("webglcontextlost", async (e2) => { + log("error: humangl:", e2.type); log("possible browser memory leak using webgl or conflict with multiple backend registrations"); instance2.emit("error"); throw new Error("backend error: webgl context lost"); }); - config2.canvas.addEventListener("webglcontextrestored", (e) => { - log("error: humangl context restored:", e); + config2.canvas.addEventListener("webglcontextrestored", (e2) => { + log("error: humangl context restored:", e2); }); - config2.canvas.addEventListener("webglcontextcreationerror", (e) => { - log("error: humangl context create:", e); + config2.canvas.addEventListener("webglcontextcreationerror", (e2) => { + log("error: humangl context create:", e2); }); } } catch (err) { @@ -83065,29 +83057,29 @@ async function detectHands(input2, config3) { const hands = []; if (!input2 || !models2[0]) return hands; - const t = {}; + const t2 = {}; const ratio = (input2.shape[2] || 1) / (input2.shape[1] || 1); const height = Math.min(Math.round((input2.shape[1] || 0) / 8) * 8, maxDetectorResolution); const width = Math.round(height * ratio / 8) * 8; - t.resize = image.resizeBilinear(input2, [height, width]); - t.cast = cast(t.resize, "int32"); - [t.rawScores, t.rawBoxes] = await models2[0].executeAsync(t.cast, modelOutputNodes); - t.boxes = squeeze(t.rawBoxes, [0, 2]); - t.scores = squeeze(t.rawScores, [0]); - const classScores = unstack(t.scores, 1); + t2.resize = image.resizeBilinear(input2, [height, width]); + t2.cast = cast(t2.resize, "int32"); + [t2.rawScores, t2.rawBoxes] = await models2[0].executeAsync(t2.cast, modelOutputNodes); + t2.boxes = squeeze(t2.rawBoxes, [0, 2]); + t2.scores = squeeze(t2.rawScores, [0]); + const classScores = unstack(t2.scores, 1); dispose(classScores[faceIndex]); classScores.splice(faceIndex, 1); - t.filtered = stack(classScores, 1); + t2.filtered = stack(classScores, 1); dispose(classScores); - t.max = max(t.filtered, 1); - t.argmax = argMax(t.filtered, 1); + t2.max = max(t2.filtered, 1); + t2.argmax = argMax(t2.filtered, 1); let id = 0; - t.nms = image.nonMaxSuppression(t.boxes, t.max, (config3.hand.maxDetected || 0) + 1, config3.hand.iouThreshold || 0, config3.hand.minConfidence || 1); - const nms = await t.nms.data(); - const scores = await t.max.data(); - const classNum = await t.argmax.data(); + t2.nms = image.nonMaxSuppression(t2.boxes, t2.max, (config3.hand.maxDetected || 0) + 1, config3.hand.iouThreshold || 0, config3.hand.minConfidence || 1); + const nms = await t2.nms.data(); + const scores = await t2.max.data(); + const classNum = await t2.argmax.data(); for (const nmsIndex of Array.from(nms)) { - const boxSlice = slice(t.boxes, nmsIndex, 1); + const boxSlice = slice(t2.boxes, nmsIndex, 1); const boxYX = await boxSlice.data(); dispose(boxSlice); const boxData = [boxYX[1], boxYX[0], boxYX[3] - boxYX[1], boxYX[2] - boxYX[0]]; @@ -83098,7 +83090,7 @@ async function detectHands(input2, config3) { const hand3 = { id: id++, score, box: boxFull, boxRaw, label }; hands.push(hand3); } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); hands.sort((a, b) => b.score - a.score); if (hands.length > (config3.hand.maxDetected || 1)) hands.length = config3.hand.maxDetected || 1; @@ -83118,17 +83110,17 @@ async function detectFingers(input2, h, config3) { annotations: {} }; if (input2 && models2[1] && config3.hand.landmarks && h.score > (config3.hand.minConfidence || 0)) { - const t = {}; + const t2 = {}; const boxCrop = [h.boxRaw[1], h.boxRaw[0], h.boxRaw[3] + h.boxRaw[1], h.boxRaw[2] + h.boxRaw[0]]; - t.crop = image.cropAndResize(input2, [boxCrop], [0], [inputSize7[1][0], inputSize7[1][1]], "bilinear"); - t.div = div(t.crop, constants.tf255); - [t.score, t.keypoints] = models2[1].execute(t.div, ["Identity_1", "Identity"]); - const rawScore = (await t.score.data())[0]; + t2.crop = image.cropAndResize(input2, [boxCrop], [0], [inputSize7[1][0], inputSize7[1][1]], "bilinear"); + t2.div = div(t2.crop, constants.tf255); + [t2.score, t2.keypoints] = models2[1].execute(t2.div, ["Identity_1", "Identity"]); + const rawScore = (await t2.score.data())[0]; const score = (100 - Math.trunc(100 / (1 + Math.exp(rawScore)))) / 100; if (score >= (config3.hand.minConfidence || 0)) { hand3.fingerScore = score; - t.reshaped = reshape(t.keypoints, [-1, 3]); - const coordsData = await t.reshaped.array(); + t2.reshaped = reshape(t2.keypoints, [-1, 3]); + const coordsData = await t2.reshaped.array(); const coordsRaw = coordsData.map((kpt4) => [kpt4[0] / inputSize7[1][1], kpt4[1] / inputSize7[1][0], kpt4[2] || 0]); const coordsNorm = coordsRaw.map((kpt4) => [kpt4[0] * h.boxRaw[2], kpt4[1] * h.boxRaw[3], kpt4[2] || 0]); hand3.keypoints = coordsNorm.map((kpt4) => [outputSize[0] * (kpt4[0] + h.boxRaw[0]), outputSize[1] * (kpt4[1] + h.boxRaw[1]), kpt4[2] || 0]); @@ -83137,7 +83129,7 @@ async function detectFingers(input2, h, config3) { hand3.annotations[key] = fingerMap[key].map((index2) => hand3.landmarks && hand3.keypoints[index2] ? hand3.keypoints[index2] : null); } } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); } return hand3; } @@ -83168,19 +83160,19 @@ async function predict14(input2, config3) { const oldCache = [...cache4.boxes]; cache4.boxes.length = 0; if (config3.cacheSensitivity > 0) { - for (let i = 0; i < cache4.hands.length; i++) { - const boxKpt = square4(cache4.hands[i].keypoints, outputSize); - if (boxKpt.box[2] / (input2.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input2.shape[1] || 1) > 0.05 && cache4.hands[i].fingerScore && cache4.hands[i].fingerScore > (config3.hand.minConfidence || 0)) { + for (let i2 = 0; i2 < cache4.hands.length; i2++) { + const boxKpt = square4(cache4.hands[i2].keypoints, outputSize); + if (boxKpt.box[2] / (input2.shape[2] || 1) > 0.05 && boxKpt.box[3] / (input2.shape[1] || 1) > 0.05 && cache4.hands[i2].fingerScore && cache4.hands[i2].fingerScore > (config3.hand.minConfidence || 0)) { const boxScale = scale2(boxKpt.box, boxExpandFact); const boxScaleRaw = scale2(boxKpt.boxRaw, boxExpandFact); - cache4.boxes.push({ ...oldCache[i], box: boxScale, boxRaw: boxScaleRaw }); + cache4.boxes.push({ ...oldCache[i2], box: boxScale, boxRaw: boxScaleRaw }); } } } - for (let i = 0; i < cache4.hands.length; i++) { - const bbox = calc(cache4.hands[i].keypoints, outputSize); - cache4.hands[i].box = bbox.box; - cache4.hands[i].boxRaw = bbox.boxRaw; + for (let i2 = 0; i2 < cache4.hands.length; i2++) { + const bbox = calc(cache4.hands[i2].keypoints, outputSize); + cache4.hands[i2].box = bbox.box; + cache4.hands[i2].boxRaw = bbox.boxRaw; } resolve(cache4.hands); }); @@ -83332,22 +83324,22 @@ function bodyParts(body4) { } } function jitter(keypoints) { - for (let i = 0; i < keypoints.length; i++) { - if (keypoints[i] && cache5.keypoints[i]) { - const diff = [Math.abs(keypoints[i].positionRaw[0] - cache5.keypoints[i].positionRaw[0]), Math.abs(keypoints[i].positionRaw[1] - cache5.keypoints[i].positionRaw[1])]; + for (let i2 = 0; i2 < keypoints.length; i2++) { + if (keypoints[i2] && cache5.keypoints[i2]) { + const diff = [Math.abs(keypoints[i2].positionRaw[0] - cache5.keypoints[i2].positionRaw[0]), Math.abs(keypoints[i2].positionRaw[1] - cache5.keypoints[i2].positionRaw[1])]; if (diff[0] < maxJitter && diff[1] < maxJitter) { - keypoints[i] = cache5.keypoints[i]; + keypoints[i2] = cache5.keypoints[i2]; } else { - cache5.keypoints[i] = keypoints[i]; + cache5.keypoints[i2] = keypoints[i2]; } } else { - cache5.keypoints[i] = keypoints[i]; + cache5.keypoints[i2] = keypoints[i2]; } } return keypoints; } function padInput(input2, inputSize10) { - const t = {}; + const t2 = {}; if (!input2.shape || !input2.shape[1] || !input2.shape[2]) return input2; cache5.padding = [ @@ -83356,10 +83348,10 @@ function padInput(input2, inputSize10) { [input2.shape[1] > input2.shape[2] ? Math.trunc((input2.shape[1] - input2.shape[2]) / 2) : 0, input2.shape[1] > input2.shape[2] ? Math.trunc((input2.shape[1] - input2.shape[2]) / 2) : 0], [0, 0] ]; - t.pad = pad(input2, cache5.padding); - t.resize = image.resizeBilinear(t.pad, [inputSize10, inputSize10]); - const final = cast(t.resize, "int32"); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + t2.pad = pad(input2, cache5.padding); + t2.resize = image.resizeBilinear(t2.pad, [inputSize10, inputSize10]); + const final = cast(t2.resize, "int32"); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return final; } function rescaleBody(body4, outputSize2) { @@ -83427,9 +83419,9 @@ async function parseSinglePose(res, config3, image2) { const annotations2 = {}; for (const [name, indexes] of Object.entries(connected3)) { const pt = []; - for (let i = 0; i < indexes.length - 1; i++) { - const pt0 = keypoints.find((kp) => kp.part === indexes[i]); - const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]); + for (let i2 = 0; i2 < indexes.length - 1; i2++) { + const pt0 = keypoints.find((kp) => kp.part === indexes[i2]); + const pt1 = keypoints.find((kp) => kp.part === indexes[i2 + 1]); if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]); } @@ -83447,12 +83439,12 @@ async function parseMultiPose(res, config3, image2) { const totalScore = Math.round(100 * kpt4[51 + 4]) / 100; if (totalScore > config3.body.minConfidence) { const keypoints = []; - for (let i = 0; i < 17; i++) { - const score = kpt4[3 * i + 2]; + for (let i2 = 0; i2 < 17; i2++) { + const score = kpt4[3 * i2 + 2]; if (score > config3.body.minConfidence) { - const positionRaw = [kpt4[3 * i + 1], kpt4[3 * i + 0]]; + const positionRaw = [kpt4[3 * i2 + 1], kpt4[3 * i2 + 0]]; keypoints.push({ - part: kpt3[i], + part: kpt3[i2], score: Math.round(100 * score) / 100, positionRaw, position: [Math.round((image2.shape[2] || 0) * positionRaw[0]), Math.round((image2.shape[1] || 0) * positionRaw[1])] @@ -83463,9 +83455,9 @@ async function parseMultiPose(res, config3, image2) { const annotations2 = {}; for (const [name, indexes] of Object.entries(connected3)) { const pt = []; - for (let i = 0; i < indexes.length - 1; i++) { - const pt0 = keypoints.find((kp) => kp.part === indexes[i]); - const pt1 = keypoints.find((kp) => kp.part === indexes[i + 1]); + for (let i2 = 0; i2 < indexes.length - 1; i2++) { + const pt0 = keypoints.find((kp) => kp.part === indexes[i2]); + const pt1 = keypoints.find((kp) => kp.part === indexes[i2 + 1]); if (pt0 && pt1 && pt0.score > (config3.body.minConfidence || 0) && pt1.score > (config3.body.minConfidence || 0)) pt.push([pt0.position, pt1.position]); } @@ -83493,18 +83485,18 @@ async function predict16(input2, config3) { return cache6.bodies; } return new Promise(async (resolve) => { - const t = {}; + const t2 = {}; skipped14 = 0; - t.input = padInput(input2, inputSize8); - t.res = model16 == null ? void 0 : model16.execute(t.input); + t2.input = padInput(input2, inputSize8); + t2.res = model16 == null ? void 0 : model16.execute(t2.input); cache6.last = now(); - const res = await t.res.array(); - cache6.bodies = t.res.shape[2] === 17 ? await parseSinglePose(res, config3, input2) : await parseMultiPose(res, config3, input2); + const res = await t2.res.array(); + cache6.bodies = t2.res.shape[2] === 17 ? await parseSinglePose(res, config3, input2) : await parseMultiPose(res, config3, input2); for (const body4 of cache6.bodies) { rescaleBody(body4, [input2.shape[2] || 1, input2.shape[1] || 1]); jitter(body4.keypoints); } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); resolve(cache6.bodies); }); } @@ -83536,13 +83528,13 @@ async function process4(res, outputShape, config3) { const boxesMaxT = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); const boxIdxT = boxesMaxT.argMax(2); const boxIdx = await boxIdxT.array(); - for (let i = 0; i < scoresT.shape[0]; i++) { + for (let i2 = 0; i2 < scoresT.shape[0]; i2++) { for (let j = 0; j < scoresT.shape[1]; j++) { - const score = scores[i][j]; + const score = scores[i2][j]; if (score > (config3.object.minConfidence || 0) && 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 / inputSize9)); + const cx = (0.5 + Math.trunc(i2 % baseSize)) / baseSize; + const cy = (0.5 + Math.trunc(i2 / baseSize)) / baseSize; + const boxOffset = boxIdx[i2].map((a) => a * (baseSize / strideSize / inputSize9)); const [x, y] = [ cx - scaleBox / strideSize * boxOffset[0], cy - scaleBox / strideSize * boxOffset[1] @@ -83631,8 +83623,8 @@ var partNames = [ "rightAnkle" ]; var count2 = partNames.length; -var partIds = partNames.reduce((result, jointName, i) => { - result[jointName] = i; +var partIds = partNames.reduce((result, jointName, i2) => { + result[jointName] = i2; return result; }, {}); var connectedPartNames = [ @@ -83685,8 +83677,8 @@ function getBoundingBox(keypoints) { function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]) { const scaleY = height / inputResolutionHeight; const scaleX = width / inputResolutionWidth; - const scalePose = (pose, i) => ({ - id: i, + const scalePose = (pose, i2) => ({ + id: i2, 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)], @@ -83698,7 +83690,7 @@ function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolut })), annotations: {} }); - const scaledPoses = poses.map((pose, i) => scalePose(pose, i)); + const scaledPoses = poses.map((pose, i2) => scalePose(pose, i2)); return scaledPoses; } var MaxHeap = class { @@ -83750,16 +83742,16 @@ var MaxHeap = class { k = j; } } - getValueAt(i) { - return this.getElementValue(this.priorityQueue[i]); + getValueAt(i2) { + return this.getElementValue(this.priorityQueue[i2]); } - less(i, j) { - return this.getValueAt(i) < this.getValueAt(j); + less(i2, j) { + return this.getValueAt(i2) < this.getValueAt(j); } - exchange(i, j) { - const t = this.priorityQueue[i]; - this.priorityQueue[i] = this.priorityQueue[j]; - this.priorityQueue[j] = t; + exchange(i2, j) { + const t2 = this.priorityQueue[i2]; + this.priorityQueue[i2] = this.priorityQueue[j]; + this.priorityQueue[j] = t2; } }; function getOffsetPoint(y, x, keypoint, offsets) { @@ -83812,7 +83804,7 @@ function traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacemen const displacement = getDisplacement(sourceKeypointIndices); const displacedPoint = addVectors(sourceKeypoint.position, displacement); let targetKeypoint = displacedPoint; - for (let i = 0; i < offsetRefineStep; i++) { + for (let i2 = 0; i2 < offsetRefineStep; i2++) { const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width); const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets); targetKeypoint = addVectors( @@ -83934,8 +83926,8 @@ async function predict18(input2, config3) { return results3d; }); const buffers = await Promise.all(res.map((tensor2) => tensor2.buffer())); - for (const t of res) - dispose(t); + for (const t2 of res) + dispose(t2); const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config3.body.maxDetected, config3.body.minConfidence); if (!model18.inputs[0].shape) return []; @@ -83972,32 +83964,32 @@ async function process5(input2, background, config3) { const height = ((_b = inputImage.tensor) == null ? void 0 : _b.shape[1]) || 0; if (!inputImage.tensor) return { data: [], canvas: null, alpha: null }; - const t = {}; - t.resize = image.resizeBilinear(inputImage.tensor, [model19.inputs[0].shape ? model19.inputs[0].shape[1] : 0, model19.inputs[0].shape ? model19.inputs[0].shape[2] : 0], false); + const t2 = {}; + t2.resize = image.resizeBilinear(inputImage.tensor, [model19.inputs[0].shape ? model19.inputs[0].shape[1] : 0, model19.inputs[0].shape ? model19.inputs[0].shape[2] : 0], false); dispose(inputImage.tensor); - t.norm = div(t.resize, constants.tf255); - t.res = model19.execute(t.norm); - t.squeeze = squeeze(t.res, 0); - if (t.squeeze.shape[2] === 2) { - t.softmax = softmax(t.squeeze); - [t.bg, t.fg] = unstack(t.softmax, 2); - t.expand = expandDims(t.fg, 2); - t.pad = expandDims(t.expand, 0); - t.crop = image.cropAndResize(t.pad, [[0, 0, 0.5, 0.5]], [0], [width, height]); - t.data = squeeze(t.crop, 0); + t2.norm = div(t2.resize, constants.tf255); + t2.res = model19.execute(t2.norm); + t2.squeeze = squeeze(t2.res, 0); + if (t2.squeeze.shape[2] === 2) { + t2.softmax = softmax(t2.squeeze); + [t2.bg, t2.fg] = unstack(t2.softmax, 2); + t2.expand = expandDims(t2.fg, 2); + t2.pad = expandDims(t2.expand, 0); + t2.crop = image.cropAndResize(t2.pad, [[0, 0, 0.5, 0.5]], [0], [width, height]); + t2.data = squeeze(t2.crop, 0); } else { - t.data = image.resizeBilinear(t.squeeze, [height, width]); + t2.data = image.resizeBilinear(t2.squeeze, [height, width]); } - const data = Array.from(await t.data.data()); + const data = Array.from(await t2.data.data()); if (env2.node && !env2.Canvas && typeof ImageData === "undefined") { if (config3.debug) log("canvas support missing"); - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); return { data, canvas: null, alpha: null }; } const alphaCanvas = canvas(width, height); if (browser_exports) - await browser_exports.toPixels(t.data, alphaCanvas); + await browser_exports.toPixels(t2.data, alphaCanvas); const alphaCtx = alphaCanvas.getContext("2d"); if (config3.segmentation.blur && config3.segmentation.blur > 0) alphaCtx.filter = `blur(${config3.segmentation.blur}px)`; @@ -84013,8 +84005,8 @@ async function process5(input2, background, config3) { compositeCtx.globalCompositeOperation = "source-over"; compositeCtx.filter = "none"; const compositeData = compositeCtx.getImageData(0, 0, width, height); - for (let i = 0; i < width * height; i++) - compositeData.data[4 * i + 3] = alphaData.data[4 * i + 0]; + for (let i2 = 0; i2 < width * height; i2++) + compositeData.data[4 * i2 + 3] = alphaData.data[4 * i2 + 0]; compositeCtx.putImageData(compositeData, 0, 0); let mergedCanvas = null; if (background && compositeCanvas) { @@ -84025,7 +84017,7 @@ async function process5(input2, background, config3) { ctxMerge.drawImage(bgImage.canvas, 0, 0, mergedCanvas.width, mergedCanvas.height); ctxMerge.drawImage(compositeCanvas, 0, 0); } - Object.keys(t).forEach((tensor2) => dispose(t[tensor2])); + Object.keys(t2).forEach((tensor2) => dispose(t2[tensor2])); busy = false; return { data, canvas: compositeCanvas, alpha: alphaCanvas }; } @@ -84233,7 +84225,7 @@ async function loadModel(modelPath) { let cachedModels = {}; try { cachedModels = options2.cacheSupported && options2.cacheModels ? await io_exports.listModels() : {}; - } catch (e) { + } catch (e2) { options2.cacheSupported = false; } modelStats[shortModelName].inCache = options2.cacheSupported && options2.cacheModels && Object.keys(cachedModels).includes(cachedModelName); @@ -84267,7 +84259,7 @@ async function loadModel(modelPath) { } // package.json -var version5 = "2.9.2"; +var version5 = "2.9.3"; // src/draw/draw.ts var draw_exports = {}; @@ -84356,10 +84348,10 @@ function curves(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); + for (let i2 = 0; i2 < points.length - 2; i2++) { + const xc = (points[i2][0] + points[i2 + 1][0]) / 2; + const yc = (points[i2][1] + points[i2 + 1][1]) / 2; + ctx.quadraticCurveTo(points[i2][0], points[i2][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(); @@ -84446,15 +84438,15 @@ function drawLabels(f, ctx) { if (labels2.length === 0) labels2.push("face"); ctx.fillStyle = opt.color; - for (let i = labels2.length - 1; i >= 0; i--) { + for (let i2 = labels2.length - 1; i2 >= 0; i2--) { const x = Math.max(f.box[0], 0); - const y = i * opt.lineHeight + f.box[1]; + const y = i2 * opt.lineHeight + f.box[1]; if (opt.shadowColor && opt.shadowColor !== "") { ctx.fillStyle = opt.shadowColor; - ctx.fillText(labels2[i], x + 5, y + 16); + ctx.fillText(labels2[i2], x + 5, y + 16); } ctx.fillStyle = opt.labelColor; - ctx.fillText(labels2[i], x + 4, y + 15); + ctx.fillText(labels2[i2], x + 4, y + 15); } } } @@ -84528,8 +84520,8 @@ function drawGazeArrows(f, ctx) { function drawFacePolygons(f, ctx) { if (opt.drawPolygons && f.mesh.length >= 468) { 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((index2) => f.mesh[index2]); + for (let i2 = 0; i2 < TRI468.length / 3; i2++) { + const points = [TRI468[i2 * 3 + 0], TRI468[i2 * 3 + 1], TRI468[i2 * 3 + 2]].map((index2) => f.mesh[index2]); lines(ctx, points, opt); } drawIrisElipse(f, ctx); @@ -84537,15 +84529,15 @@ function drawFacePolygons(f, ctx) { } function drawFacePoints(f, ctx) { if (opt.drawPoints && f.mesh.length >= 468) { - for (let i = 0; i < f.mesh.length; i++) { - point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2], opt); + for (let i2 = 0; i2 < f.mesh.length; i2++) { + point(ctx, f.mesh[i2][0], f.mesh[i2][1], f.mesh[i2][2], opt); if (opt.drawAttention) { - if (LANDMARKS_REFINEMENT_LIPS_CONFIG.includes(i)) - point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] + 127, opt); - if (LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.includes(i)) - point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] - 127, opt); - if (LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.includes(i)) - point(ctx, f.mesh[i][0], f.mesh[i][1], f.mesh[i][2] - 127, opt); + if (LANDMARKS_REFINEMENT_LIPS_CONFIG.includes(i2)) + point(ctx, f.mesh[i2][0], f.mesh[i2][1], f.mesh[i2][2] + 127, opt); + if (LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG.includes(i2)) + point(ctx, f.mesh[i2][0], f.mesh[i2][1], f.mesh[i2][2] - 127, opt); + if (LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG.includes(i2)) + point(ctx, f.mesh[i2][0], f.mesh[i2][1], f.mesh[i2][2] - 127, opt); } } } @@ -84587,41 +84579,41 @@ async function body(inCanvas2, result, drawOptions) { if (!ctx) return; ctx.lineJoin = "round"; - for (let i = 0; i < result.length; i++) { + for (let i2 = 0; i2 < result.length; i2++) { 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.drawBoxes && result[i2].box && ((_a = result[i2].box) == null ? void 0 : _a.length) === 4) { + rect(ctx, result[i2].box[0], result[i2].box[1], result[i2].box[2], result[i2].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.fillText(`body ${100 * result[i2].score}%`, result[i2].box[0] + 3, 1 + result[i2].box[1] + localOptions.lineHeight, result[i2].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]); + ctx.fillText(`body ${100 * result[i2].score}%`, result[i2].box[0] + 2, 0 + result[i2].box[1] + localOptions.lineHeight, result[i2].box[2]); } } - if (localOptions.drawPoints && result[i].keypoints) { - for (let pt = 0; pt < result[i].keypoints.length; pt++) { - if (!result[i].keypoints[pt].score || result[i].keypoints[pt].score === 0) + if (localOptions.drawPoints && result[i2].keypoints) { + for (let pt = 0; pt < result[i2].keypoints.length; pt++) { + if (!result[i2].keypoints[pt].score || result[i2].keypoints[pt].score === 0) continue; - ctx.fillStyle = colorDepth(result[i].keypoints[pt].position[2], localOptions); - point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions); + ctx.fillStyle = colorDepth(result[i2].keypoints[pt].position[2], localOptions); + point(ctx, result[i2].keypoints[pt].position[0], result[i2].keypoints[pt].position[1], 0, localOptions); } } - if (localOptions.drawLabels && result[i].keypoints) { + if (localOptions.drawLabels && result[i2].keypoints) { ctx.font = localOptions.font; - for (const pt of result[i].keypoints) { + for (const pt of result[i2].keypoints) { if (!pt.score || pt.score === 0) continue; ctx.fillStyle = colorDepth(pt.position[2], localOptions); ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4); } } - if (localOptions.drawPolygons && result[i].keypoints && result[i].annotations) { - for (const part of Object.values(result[i].annotations)) { + if (localOptions.drawPolygons && result[i2].keypoints && result[i2].annotations) { + for (const part of Object.values(result[i2].annotations)) { for (const connected4 of part) curves(ctx, connected4, localOptions); } @@ -84682,12 +84674,12 @@ async function hand(inCanvas2, result, drawOptions) { const addHandLine = (part) => { if (!part || part.length === 0 || !part[0]) return; - for (let i = 0; i < part.length; i++) { + for (let i2 = 0; i2 < part.length; i2++) { ctx.beginPath(); - const z = part[i][2] || 0; - ctx.strokeStyle = colorDepth(i * z, localOptions); - ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]); - ctx.lineTo(part[i][0], part[i][1]); + const z = part[i2][2] || 0; + ctx.strokeStyle = colorDepth(i2 * z, localOptions); + ctx.moveTo(part[i2 > 0 ? i2 - 1 : 0][0], part[i2 > 0 ? i2 - 1 : 0][1]); + ctx.lineTo(part[i2][0], part[i2][1]); ctx.stroke(); } }; @@ -84741,7 +84733,7 @@ async function gesture(inCanvas2, result, drawOptions) { return; ctx.font = localOptions.font; ctx.fillStyle = localOptions.color; - let i = 1; + let i2 = 1; for (let j = 0; j < result.length; j++) { let where2 = []; let what = []; @@ -84751,11 +84743,11 @@ async function gesture(inCanvas2, result, drawOptions) { const label = `${where2[0]} ${who}: ${what[1]}`; if (localOptions.shadowColor && localOptions.shadowColor !== "") { ctx.fillStyle = localOptions.shadowColor; - ctx.fillText(label, 8, 2 + i * localOptions.lineHeight); + ctx.fillText(label, 8, 2 + i2 * localOptions.lineHeight); } ctx.fillStyle = localOptions.labelColor; - ctx.fillText(label, 6, 0 + i * localOptions.lineHeight); - i += 1; + ctx.fillText(label, 6, 0 + i2 * localOptions.lineHeight); + i2 += 1; } } } @@ -84772,19 +84764,19 @@ async function person(inCanvas2, result, drawOptions) { return; ctx.lineJoin = "round"; ctx.font = localOptions.font; - for (let i = 0; i < result.length; i++) { + for (let i2 = 0; i2 < result.length; i2++) { 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); + rect(ctx, result[i2].box[0], result[i2].box[1], result[i2].box[2], result[i2].box[3], localOptions); if (localOptions.drawLabels) { - const label = `person #${i}`; + const label = `person #${i2}`; 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.fillText(label, result[i2].box[0] + 3, 1 + result[i2].box[1] + localOptions.lineHeight, result[i2].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.fillText(label, result[i2].box[0] + 2, 0 + result[i2].box[1] + localOptions.lineHeight, result[i2].box[2]); } ctx.stroke(); } @@ -84821,8 +84813,8 @@ var alpha = 0.5; function insidePoly(x, y, polygon) { let inside = false; let j = polygon.length - 1; - for (let i = 0; i < polygon.length; j = i++) { - if (polygon[i].y > y !== polygon[j].y > y && x < (polygon[j].x - polygon[i].x) * (y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x) + for (let i2 = 0; i2 < polygon.length; j = i2++) { + if (polygon[i2].y > y !== polygon[j].y > y && x < (polygon[j].x - polygon[i2].x) * (y - polygon[i2].y) / (polygon[j].y - polygon[i2].y) + polygon[i2].x) inside = !inside; } return inside; @@ -84895,8 +84887,8 @@ var calculateFaceAngle = (face4, imageSize) => { 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; + const rotationMatrixToEulerAngle = (r2) => { + const [r00, _r01, _r02, r10, r11, r12, r20, r21, r22] = r2; let thetaX; let thetaY; let thetaZ; @@ -84969,97 +84961,97 @@ var detectFace = async (instance2, input2) => { return []; if (!faces) return []; - for (let i = 0; i < faces.length; i++) { + for (let i2 = 0; i2 < faces.length; i2++) { instance2.analyze("Get Face"); - if (!faces[i].tensor || faces[i].tensor["isDisposedInternal"]) { - log("Face object is disposed:", faces[i].tensor); + if (!faces[i2].tensor || faces[i2].tensor["isDisposedInternal"]) { + log("Face object is disposed:", faces[i2].tensor); continue; } if ((_a = instance2.config.face.detector) == null ? void 0 : _a.mask) { - const masked = await mask(faces[i]); - dispose(faces[i].tensor); - faces[i].tensor = masked; + const masked = await mask(faces[i2]); + dispose(faces[i2].tensor); + faces[i2].tensor = masked; } - const rotation = faces[i].mesh && faces[i].mesh.length > 200 ? calculateFaceAngle(faces[i], [input2.shape[2], input2.shape[1]]) : null; + const rotation = faces[i2].mesh && faces[i2].mesh.length > 200 ? calculateFaceAngle(faces[i2], [input2.shape[2], input2.shape[1]]) : null; instance2.analyze("Start Emotion:"); if (instance2.config.async) { - emotionRes = ((_b = instance2.config.face.emotion) == null ? void 0 : _b.enabled) ? predict8(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : []; + emotionRes = ((_b = instance2.config.face.emotion) == null ? void 0 : _b.enabled) ? predict8(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : []; } else { instance2.state = "run:emotion"; timeStamp = now(); - emotionRes = ((_c = instance2.config.face.emotion) == null ? void 0 : _c.enabled) ? await predict8(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : []; + emotionRes = ((_c = instance2.config.face.emotion) == null ? void 0 : _c.enabled) ? await predict8(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : []; instance2.performance.emotion = env2.perfadd ? (instance2.performance.emotion || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); } instance2.analyze("End Emotion:"); instance2.analyze("Start AntiSpoof:"); if (instance2.config.async) { - antispoofRes = ((_d = instance2.config.face.antispoof) == null ? void 0 : _d.enabled) ? predict4(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : 0; + antispoofRes = ((_d = instance2.config.face.antispoof) == null ? void 0 : _d.enabled) ? predict4(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : 0; } else { instance2.state = "run:antispoof"; timeStamp = now(); - antispoofRes = ((_e = instance2.config.face.antispoof) == null ? void 0 : _e.enabled) ? await predict4(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : 0; + antispoofRes = ((_e = instance2.config.face.antispoof) == null ? void 0 : _e.enabled) ? await predict4(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : 0; instance2.performance.antispoof = env2.perfadd ? (instance2.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); } instance2.analyze("End AntiSpoof:"); instance2.analyze("Start Liveness:"); if (instance2.config.async) { - livenessRes = ((_f = instance2.config.face.liveness) == null ? void 0 : _f.enabled) ? predict15(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : 0; + livenessRes = ((_f = instance2.config.face.liveness) == null ? void 0 : _f.enabled) ? predict15(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : 0; } else { instance2.state = "run:liveness"; timeStamp = now(); - livenessRes = ((_g = instance2.config.face.liveness) == null ? void 0 : _g.enabled) ? await predict15(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : 0; + livenessRes = ((_g = instance2.config.face.liveness) == null ? void 0 : _g.enabled) ? await predict15(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : 0; instance2.performance.liveness = env2.perfadd ? (instance2.performance.antispoof || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); } instance2.analyze("End Liveness:"); instance2.analyze("Start GEAR:"); if (instance2.config.async) { - gearRes = ((_h = instance2.config.face["gear"]) == null ? void 0 : _h.enabled) ? predict(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; + gearRes = ((_h = instance2.config.face["gear"]) == null ? void 0 : _h.enabled) ? predict(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; } else { instance2.state = "run:gear"; timeStamp = now(); - gearRes = ((_i = instance2.config.face["gear"]) == null ? void 0 : _i.enabled) ? await predict(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; + gearRes = ((_i = instance2.config.face["gear"]) == null ? void 0 : _i.enabled) ? await predict(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; instance2.performance.gear = Math.trunc(now() - timeStamp); } instance2.analyze("End GEAR:"); instance2.analyze("Start SSRNet:"); if (instance2.config.async) { - ageRes = ((_j = instance2.config.face["ssrnet"]) == null ? void 0 : _j.enabled) ? predict2(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; - genderRes = ((_k = instance2.config.face["ssrnet"]) == null ? void 0 : _k.enabled) ? predict3(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; + ageRes = ((_j = instance2.config.face["ssrnet"]) == null ? void 0 : _j.enabled) ? predict2(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; + genderRes = ((_k = instance2.config.face["ssrnet"]) == null ? void 0 : _k.enabled) ? predict3(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; } else { instance2.state = "run:ssrnet"; timeStamp = now(); - ageRes = ((_l = instance2.config.face["ssrnet"]) == null ? void 0 : _l.enabled) ? await predict2(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; - genderRes = ((_m = instance2.config.face["ssrnet"]) == null ? void 0 : _m.enabled) ? await predict3(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; + ageRes = ((_l = instance2.config.face["ssrnet"]) == null ? void 0 : _l.enabled) ? await predict2(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; + genderRes = ((_m = instance2.config.face["ssrnet"]) == null ? void 0 : _m.enabled) ? await predict3(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; instance2.performance.ssrnet = Math.trunc(now() - timeStamp); } instance2.analyze("End SSRNet:"); instance2.analyze("Start MobileFaceNet:"); if (instance2.config.async) { - mobilefacenetRes = ((_n = instance2.config.face["mobilefacenet"]) == null ? void 0 : _n.enabled) ? predict9(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; + mobilefacenetRes = ((_n = instance2.config.face["mobilefacenet"]) == null ? void 0 : _n.enabled) ? predict9(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; } else { instance2.state = "run:mobilefacenet"; timeStamp = now(); - mobilefacenetRes = ((_o = instance2.config.face["mobilefacenet"]) == null ? void 0 : _o.enabled) ? await predict9(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; + mobilefacenetRes = ((_o = instance2.config.face["mobilefacenet"]) == null ? void 0 : _o.enabled) ? await predict9(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; instance2.performance.mobilefacenet = Math.trunc(now() - timeStamp); } instance2.analyze("End MobileFaceNet:"); instance2.analyze("Start InsightFace:"); if (instance2.config.async) { - insightfaceRes = ((_p = instance2.config.face["insightface"]) == null ? void 0 : _p.enabled) ? predict10(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; + insightfaceRes = ((_p = instance2.config.face["insightface"]) == null ? void 0 : _p.enabled) ? predict10(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; } else { instance2.state = "run:mobilefacenet"; timeStamp = now(); - insightfaceRes = ((_q = instance2.config.face["insightface"]) == null ? void 0 : _q.enabled) ? await predict10(faces[i].tensor || tensor([]), instance2.config, i, faces.length) : null; + insightfaceRes = ((_q = instance2.config.face["insightface"]) == null ? void 0 : _q.enabled) ? await predict10(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length) : null; instance2.performance.mobilefacenet = Math.trunc(now() - timeStamp); } instance2.analyze("End InsightFace:"); instance2.analyze("Start Description:"); if (instance2.config.async) { - descRes = predict12(faces[i].tensor || tensor([]), instance2.config, i, faces.length); + descRes = predict12(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length); } else { instance2.state = "run:description"; timeStamp = now(); - descRes = await predict12(faces[i].tensor || tensor([]), instance2.config, i, faces.length); + descRes = await predict12(faces[i2].tensor || tensor([]), instance2.config, i2, faces.length); instance2.performance.description = env2.perfadd ? (instance2.performance.description || 0) + Math.trunc(now() - timeStamp) : Math.trunc(now() - timeStamp); } instance2.analyze("End Description:"); @@ -85092,14 +85084,14 @@ var detectFace = async (instance2, input2) => { } if (!((_v = instance2.config.face.iris) == null ? void 0 : _v.enabled)) { } - const irisSize = faces[i].annotations && faces[i].annotations.leftEyeIris && faces[i].annotations.leftEyeIris[0] && faces[i].annotations.rightEyeIris && faces[i].annotations.rightEyeIris[0] && faces[i].annotations.leftEyeIris.length > 0 && faces[i].annotations.rightEyeIris.length > 0 && faces[i].annotations.leftEyeIris[0] !== null && faces[i].annotations.rightEyeIris[0] !== null ? 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])) / input2.shape[2] : 0; - const tensor2 = ((_w = instance2.config.face.detector) == null ? void 0 : _w.return) ? squeeze(faces[i].tensor) : null; - dispose(faces[i].tensor); - if (faces[i].tensor) - delete faces[i].tensor; + const irisSize = faces[i2].annotations && faces[i2].annotations.leftEyeIris && faces[i2].annotations.leftEyeIris[0] && faces[i2].annotations.rightEyeIris && faces[i2].annotations.rightEyeIris[0] && faces[i2].annotations.leftEyeIris.length > 0 && faces[i2].annotations.rightEyeIris.length > 0 && faces[i2].annotations.leftEyeIris[0] !== null && faces[i2].annotations.rightEyeIris[0] !== null ? Math.max(Math.abs(faces[i2].annotations.leftEyeIris[3][0] - faces[i2].annotations.leftEyeIris[1][0]), Math.abs(faces[i2].annotations.rightEyeIris[4][1] - faces[i2].annotations.rightEyeIris[2][1])) / input2.shape[2] : 0; + const tensor2 = ((_w = instance2.config.face.detector) == null ? void 0 : _w.return) ? squeeze(faces[i2].tensor) : null; + dispose(faces[i2].tensor); + if (faces[i2].tensor) + delete faces[i2].tensor; const res = { - ...faces[i], - id: i + ...faces[i2], + id: i2 }; if (descRes == null ? void 0 : descRes.age) res.age = descRes.age; @@ -85145,20 +85137,20 @@ var body2 = (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"); + for (let i2 = 0; i2 < res.length; i2++) { + const leftWrist = res[i2].keypoints.find((a) => a.part === "leftWrist"); + const rightWrist = res[i2].keypoints.find((a) => a.part === "rightWrist"); + const nose = res[i2].keypoints.find((a) => a.part === "nose"); if (nose && leftWrist && rightWrist && leftWrist.position[1] < nose.position[1] && rightWrist.position[1] < nose.position[1]) - gestures.push({ body: i, gesture: "i give up" }); + gestures.push({ body: i2, gesture: "i give up" }); else if (nose && leftWrist && leftWrist.position[1] < nose.position[1]) - gestures.push({ body: i, gesture: "raise left hand" }); + gestures.push({ body: i2, gesture: "raise left hand" }); else if (nose && rightWrist && rightWrist.position[1] < nose.position[1]) - 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"); + gestures.push({ body: i2, gesture: "raise right hand" }); + const leftShoulder = res[i2].keypoints.find((a) => a.part === "leftShoulder"); + const rightShoulder = res[i2].keypoints.find((a) => a.part === "rightShoulder"); if (leftShoulder && rightShoulder && Math.abs(leftShoulder.positionRaw[1] - rightShoulder.positionRaw[1]) > 0.1) { - gestures.push({ body: i, gesture: `leaning ${leftShoulder.position[1] > rightShoulder.position[1] ? "left" : "right"}` }); + gestures.push({ body: i2, gesture: `leaning ${leftShoulder.position[1] > rightShoulder.position[1] ? "left" : "right"}` }); } } return gestures; @@ -85167,26 +85159,26 @@ var face2 = (res) => { if (!res) return []; const gestures = []; - for (let i = 0; i < res.length; i++) { - if (res[i].mesh && res[i].mesh.length > 450) { - const zDiff = (res[i].mesh[33][2] || 0) - (res[i].mesh[263][2] || 0); - const xDiff = res[i].mesh[33][0] - res[i].mesh[263][0]; + for (let i2 = 0; i2 < res.length; i2++) { + if (res[i2].mesh && res[i2].mesh.length > 450) { + const zDiff = (res[i2].mesh[33][2] || 0) - (res[i2].mesh[263][2] || 0); + const xDiff = res[i2].mesh[33][0] - res[i2].mesh[263][0]; if (Math.abs(zDiff / xDiff) <= 0.15) - gestures.push({ face: i, gesture: "facing center" }); + gestures.push({ face: i2, gesture: "facing center" }); else - gestures.push({ face: i, gesture: `facing ${zDiff < 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]); + gestures.push({ face: i2, gesture: `facing ${zDiff < 0 ? "left" : "right"}` }); + const openLeft = Math.abs(res[i2].mesh[374][1] - res[i2].mesh[386][1]) / Math.abs(res[i2].mesh[443][1] - res[i2].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]); + gestures.push({ face: i2, gesture: "blink left eye" }); + const openRight = Math.abs(res[i2].mesh[145][1] - res[i2].mesh[159][1]) / Math.abs(res[i2].mesh[223][1] - res[i2].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])); + gestures.push({ face: i2, gesture: "blink right eye" }); + const mouthOpen = Math.min(100, 500 * Math.abs(res[i2].mesh[13][1] - res[i2].mesh[14][1]) / Math.abs(res[i2].mesh[10][1] - res[i2].mesh[152][1])); if (mouthOpen > 10) - gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` }); - const chinDepth = res[i].mesh[152][2] || 0; + gestures.push({ face: i2, gesture: `mouth ${Math.trunc(mouthOpen)}% open` }); + const chinDepth = res[i2].mesh[152][2] || 0; if (Math.abs(chinDepth) > 10) - gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? "up" : "down"}` }); + gestures.push({ face: i2, gesture: `head ${chinDepth < 0 ? "up" : "down"}` }); } } return gestures; @@ -85195,42 +85187,42 @@ var iris2 = (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.leftEyeIris[0] || !res[i].annotations.rightEyeIris || !res[i].annotations.rightEyeIris[0]) + for (let i2 = 0; i2 < res.length; i2++) { + if (!res[i2].annotations || !res[i2].annotations.leftEyeIris || !res[i2].annotations.leftEyeIris[0] || !res[i2].annotations.rightEyeIris || !res[i2].annotations.rightEyeIris[0]) 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 sizeXLeft = res[i2].annotations.leftEyeIris[3][0] - res[i2].annotations.leftEyeIris[1][0]; + const sizeYLeft = res[i2].annotations.leftEyeIris[4][1] - res[i2].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 sizeXRight = res[i2].annotations.rightEyeIris[3][0] - res[i2].annotations.rightEyeIris[1][0]; + const sizeYRight = res[i2].annotations.rightEyeIris[4][1] - res[i2].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" }); + gestures.push({ iris: i2, gesture: "facing center" }); } - const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2]; - const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2]; + const leftIrisCenterX = Math.abs(res[i2].mesh[263][0] - res[i2].annotations.leftEyeIris[0][0]) / res[i2].box[2]; + const rightIrisCenterX = Math.abs(res[i2].mesh[33][0] - res[i2].annotations.rightEyeIris[0][0]) / res[i2].box[2]; if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false; if (leftIrisCenterX > rightIrisCenterX) { if (leftIrisCenterX > 0.05) - gestures.push({ iris: i, gesture: "looking right" }); + gestures.push({ iris: i2, gesture: "looking right" }); } else { if (rightIrisCenterX > 0.05) - gestures.push({ iris: i, gesture: "looking left" }); + gestures.push({ iris: i2, 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]; + const rightIrisCenterY = Math.abs(res[i2].mesh[145][1] - res[i2].annotations.rightEyeIris[0][1]) / res[i2].box[3]; + const leftIrisCenterY = Math.abs(res[i2].mesh[374][1] - res[i2].annotations.leftEyeIris[0][1]) / res[i2].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" }); + gestures.push({ iris: i2, gesture: "looking down" }); if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) - gestures.push({ iris: i, gesture: "looking up" }); + gestures.push({ iris: i2, gesture: "looking up" }); if (center) - gestures.push({ iris: i, gesture: "looking center" }); + gestures.push({ iris: i2, gesture: "looking center" }); } return gestures; }; @@ -85238,24 +85230,24 @@ var hand2 = (res) => { if (!res) return []; const gestures = []; - for (let i = 0; i < res.length; i++) { + for (let i2 = 0; i2 < res.length; i2++) { const fingers = []; - if (res[i]["annotations"]) { - for (const [finger, pos] of Object.entries(res[i]["annotations"])) { + if (res[i2]["annotations"]) { + for (const [finger, pos] of Object.entries(res[i2]["annotations"])) { if (finger !== "palmBase" && Array.isArray(pos) && pos[0]) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); } } if (fingers && fingers.length > 0) { const closest = fingers.reduce((best, a) => (best.position[2] || 0) < (a.position[2] || 0) ? best : a); - gestures.push({ hand: i, gesture: `${closest.name} forward` }); + gestures.push({ hand: i2, gesture: `${closest.name} forward` }); const highest = fingers.reduce((best, a) => best.position[1] < a.position[1] ? best : a); - gestures.push({ hand: i, gesture: `${highest.name} up` }); + gestures.push({ hand: i2, gesture: `${highest.name} up` }); } - if (res[i]["keypoints"]) { - const poses = match(res[i]["keypoints"]); + if (res[i2]["keypoints"]) { + const poses = match(res[i2]["keypoints"]); for (const pose of poses) - gestures.push({ hand: i, gesture: pose.name }); + gestures.push({ hand: i2, gesture: pose.name }); } } return gestures; @@ -85278,28 +85270,28 @@ function calc2(newResult, config3) { 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 box = newResult.body[i].box.map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + newBoxCoord) / bufferedFactor); - const boxRaw = newResult.body[i].boxRaw.map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + newBoxCoord) / bufferedFactor); - const keypoints = newResult.body[i].keypoints.map((newKpt, j) => { + for (let i2 = 0; i2 < newResult.body.length; i2++) { + const box = newResult.body[i2].box.map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i2].box[j] + newBoxCoord) / bufferedFactor); + const boxRaw = newResult.body[i2].boxRaw.map((newBoxCoord, j) => ((bufferedFactor - 1) * bufferedResult.body[i2].boxRaw[j] + newBoxCoord) / bufferedFactor); + const keypoints = newResult.body[i2].keypoints.map((newKpt, j) => { var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2; return { score: newKpt.score, part: newKpt.part, position: [ - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2] + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i2].keypoints[j].position[0] || 0) + (newKpt.position[0] || 0)) / bufferedFactor : newKpt.position[0], + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i2].keypoints[j].position[1] || 0) + (newKpt.position[1] || 0)) / bufferedFactor : newKpt.position[1], + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i2].keypoints[j].position[2] || 0) + (newKpt.position[2] || 0)) / bufferedFactor : newKpt.position[2] ], positionRaw: [ - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2] + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i2].keypoints[j].positionRaw[0] || 0) + (newKpt.positionRaw[0] || 0)) / bufferedFactor : newKpt.positionRaw[0], + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i2].keypoints[j].positionRaw[1] || 0) + (newKpt.positionRaw[1] || 0)) / bufferedFactor : newKpt.positionRaw[1], + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (bufferedResult.body[i2].keypoints[j].positionRaw[2] || 0) + (newKpt.positionRaw[2] || 0)) / bufferedFactor : newKpt.positionRaw[2] ], distance: [ - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_a2 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _a2[0]) || 0) + (((_b2 = newKpt.distance) == null ? void 0 : _b2[0]) || 0)) / bufferedFactor : (_c2 = newKpt.distance) == null ? void 0 : _c2[0], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_d2 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _d2[1]) || 0) + (((_e2 = newKpt.distance) == null ? void 0 : _e2[1]) || 0)) / bufferedFactor : (_f2 = newKpt.distance) == null ? void 0 : _f2[1], - bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * (((_g2 = bufferedResult.body[i].keypoints[j].distance) == null ? void 0 : _g2[2]) || 0) + (((_h2 = newKpt.distance) == null ? void 0 : _h2[2]) || 0)) / bufferedFactor : (_i2 = newKpt.distance) == null ? void 0 : _i2[2] + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (((_a2 = bufferedResult.body[i2].keypoints[j].distance) == null ? void 0 : _a2[0]) || 0) + (((_b2 = newKpt.distance) == null ? void 0 : _b2[0]) || 0)) / bufferedFactor : (_c2 = newKpt.distance) == null ? void 0 : _c2[0], + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (((_d2 = bufferedResult.body[i2].keypoints[j].distance) == null ? void 0 : _d2[1]) || 0) + (((_e2 = newKpt.distance) == null ? void 0 : _e2[1]) || 0)) / bufferedFactor : (_f2 = newKpt.distance) == null ? void 0 : _f2[1], + bufferedResult.body[i2].keypoints[j] ? ((bufferedFactor - 1) * (((_g2 = bufferedResult.body[i2].keypoints[j].distance) == null ? void 0 : _g2[2]) || 0) + (((_h2 = newKpt.distance) == null ? void 0 : _h2[2]) || 0)) / bufferedFactor : (_i2 = newKpt.distance) == null ? void 0 : _i2[2] ] }; }); @@ -85321,60 +85313,60 @@ function calc2(newResult, config3) { } annotations2[name] = pt; } - bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints, annotations: annotations2 }; + bufferedResult.body[i2] = { ...newResult.body[i2], box, boxRaw, keypoints, annotations: annotations2 }; } } 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 box = newResult.hand[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor); - const boxRaw = newResult.hand[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor); - if (bufferedResult.hand[i].keypoints.length !== newResult.hand[i].keypoints.length) - bufferedResult.hand[i].keypoints = newResult.hand[i].keypoints; - const keypoints = newResult.hand[i].keypoints && newResult.hand[i].keypoints.length > 0 ? newResult.hand[i].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : []; + for (let i2 = 0; i2 < newResult.hand.length; i2++) { + const box = newResult.hand[i2].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i2].box[j] + b) / bufferedFactor); + const boxRaw = newResult.hand[i2].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i2].boxRaw[j] + b) / bufferedFactor); + if (bufferedResult.hand[i2].keypoints.length !== newResult.hand[i2].keypoints.length) + bufferedResult.hand[i2].keypoints = newResult.hand[i2].keypoints; + const keypoints = newResult.hand[i2].keypoints && newResult.hand[i2].keypoints.length > 0 ? newResult.hand[i2].keypoints.map((landmark, j) => landmark.map((coord, k) => ((bufferedFactor - 1) * (bufferedResult.hand[i2].keypoints[j][k] || 1) + (coord || 0)) / bufferedFactor)) : []; let annotations2 = {}; - if (Object.keys(bufferedResult.hand[i].annotations).length !== Object.keys(newResult.hand[i].annotations).length) { - bufferedResult.hand[i].annotations = newResult.hand[i].annotations; - annotations2 = bufferedResult.hand[i].annotations; - } else if (newResult.hand[i].annotations) { - for (const key of Object.keys(newResult.hand[i].annotations)) { - annotations2[key] = newResult.hand[i].annotations[key] && newResult.hand[i].annotations[key][0] ? newResult.hand[i].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor)) : null; + if (Object.keys(bufferedResult.hand[i2].annotations).length !== Object.keys(newResult.hand[i2].annotations).length) { + bufferedResult.hand[i2].annotations = newResult.hand[i2].annotations; + annotations2 = bufferedResult.hand[i2].annotations; + } else if (newResult.hand[i2].annotations) { + for (const key of Object.keys(newResult.hand[i2].annotations)) { + annotations2[key] = newResult.hand[i2].annotations[key] && newResult.hand[i2].annotations[key][0] ? newResult.hand[i2].annotations[key].map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i2].annotations[key][j][k] + coord) / bufferedFactor)) : null; } } - bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations: annotations2 }; + bufferedResult.hand[i2] = { ...newResult.hand[i2], box, boxRaw, keypoints, annotations: annotations2 }; } } 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 box = newResult.face[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor); - const boxRaw = newResult.face[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor); - if (newResult.face[i].rotation) { + for (let i2 = 0; i2 < newResult.face.length; i2++) { + const box = newResult.face[i2].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i2].box[j] + b) / bufferedFactor); + const boxRaw = newResult.face[i2].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i2].boxRaw[j] + b) / bufferedFactor); + if (newResult.face[i2].rotation) { 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 = (_g = newResult.face[i].rotation) == null ? void 0 : _g.matrix; + rotation.matrix = (_g = newResult.face[i2].rotation) == null ? void 0 : _g.matrix; rotation.angle = { - roll: ((bufferedFactor - 1) * (((_i = (_h = bufferedResult.face[i].rotation) == null ? void 0 : _h.angle) == null ? void 0 : _i.roll) || 0) + (((_k = (_j = newResult.face[i].rotation) == null ? void 0 : _j.angle) == null ? void 0 : _k.roll) || 0)) / bufferedFactor, - yaw: ((bufferedFactor - 1) * (((_m = (_l = bufferedResult.face[i].rotation) == null ? void 0 : _l.angle) == null ? void 0 : _m.yaw) || 0) + (((_o = (_n = newResult.face[i].rotation) == null ? void 0 : _n.angle) == null ? void 0 : _o.yaw) || 0)) / bufferedFactor, - pitch: ((bufferedFactor - 1) * (((_q = (_p = bufferedResult.face[i].rotation) == null ? void 0 : _p.angle) == null ? void 0 : _q.pitch) || 0) + (((_s = (_r = newResult.face[i].rotation) == null ? void 0 : _r.angle) == null ? void 0 : _s.pitch) || 0)) / bufferedFactor + roll: ((bufferedFactor - 1) * (((_i = (_h = bufferedResult.face[i2].rotation) == null ? void 0 : _h.angle) == null ? void 0 : _i.roll) || 0) + (((_k = (_j = newResult.face[i2].rotation) == null ? void 0 : _j.angle) == null ? void 0 : _k.roll) || 0)) / bufferedFactor, + yaw: ((bufferedFactor - 1) * (((_m = (_l = bufferedResult.face[i2].rotation) == null ? void 0 : _l.angle) == null ? void 0 : _m.yaw) || 0) + (((_o = (_n = newResult.face[i2].rotation) == null ? void 0 : _n.angle) == null ? void 0 : _o.yaw) || 0)) / bufferedFactor, + pitch: ((bufferedFactor - 1) * (((_q = (_p = bufferedResult.face[i2].rotation) == null ? void 0 : _p.angle) == null ? void 0 : _q.pitch) || 0) + (((_s = (_r = newResult.face[i2].rotation) == null ? void 0 : _r.angle) == null ? void 0 : _s.pitch) || 0)) / bufferedFactor }; rotation.gaze = { - bearing: ((bufferedFactor - 1) * (((_u = (_t = bufferedResult.face[i].rotation) == null ? void 0 : _t.gaze) == null ? void 0 : _u.bearing) || 0) + (((_w = (_v = newResult.face[i].rotation) == null ? void 0 : _v.gaze) == null ? void 0 : _w.bearing) || 0)) / bufferedFactor, - strength: ((bufferedFactor - 1) * (((_y = (_x = bufferedResult.face[i].rotation) == null ? void 0 : _x.gaze) == null ? void 0 : _y.strength) || 0) + (((_A = (_z = newResult.face[i].rotation) == null ? void 0 : _z.gaze) == null ? void 0 : _A.strength) || 0)) / bufferedFactor + bearing: ((bufferedFactor - 1) * (((_u = (_t = bufferedResult.face[i2].rotation) == null ? void 0 : _t.gaze) == null ? void 0 : _u.bearing) || 0) + (((_w = (_v = newResult.face[i2].rotation) == null ? void 0 : _v.gaze) == null ? void 0 : _w.bearing) || 0)) / bufferedFactor, + strength: ((bufferedFactor - 1) * (((_y = (_x = bufferedResult.face[i2].rotation) == null ? void 0 : _x.gaze) == null ? void 0 : _y.strength) || 0) + (((_A = (_z = newResult.face[i2].rotation) == null ? void 0 : _z.gaze) == null ? void 0 : _A.strength) || 0)) / bufferedFactor }; - bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; + bufferedResult.face[i2] = { ...newResult.face[i2], rotation, box, boxRaw }; } - bufferedResult.face[i] = { ...newResult.face[i], box, boxRaw }; + bufferedResult.face[i2] = { ...newResult.face[i2], box, boxRaw }; } } 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 box = newResult.object[i].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor); - const boxRaw = newResult.object[i].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor); - bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; + for (let i2 = 0; i2 < newResult.object.length; i2++) { + const box = newResult.object[i2].box.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i2].box[j] + b) / bufferedFactor); + const boxRaw = newResult.object[i2].boxRaw.map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i2].boxRaw[j] + b) / bufferedFactor); + bufferedResult.object[i2] = { ...newResult.object[i2], box, boxRaw }; } } if (newResult.persons) { @@ -85382,8 +85374,8 @@ function calc2(newResult, config3) { 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((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor); + for (let i2 = 0; i2 < newPersons.length; i2++) { + bufferedResult.persons[i2].box = newPersons[i2].box.map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i2].box[j] + box) / bufferedFactor); } } } @@ -85407,8 +85399,8 @@ function distance(descriptor1, descriptor2, options4 = { order: 2, multiplier: 2 if (!descriptor1 || !descriptor1) return Number.MAX_SAFE_INTEGER; let sum7 = 0; - for (let i = 0; i < descriptor1.length; i++) { - const diff = !options4.order || options4.order === 2 ? descriptor1[i] - descriptor2[i] : Math.abs(descriptor1[i] - descriptor2[i]); + for (let i2 = 0; i2 < descriptor1.length; i2++) { + const diff = !options4.order || options4.order === 2 ? descriptor1[i2] - descriptor2[i2] : Math.abs(descriptor1[i2] - descriptor2[i2]); sum7 += !options4.order || options4.order === 2 ? diff * diff : diff ** options4.order; } return (options4.multiplier || 20) * sum7; @@ -85431,11 +85423,11 @@ function match2(descriptor, descriptors, options4 = { order: 2, multiplier: 25, } let lowestDistance = Number.MAX_SAFE_INTEGER; let index2 = -1; - for (let i = 0; i < descriptors.length; i++) { - const res = descriptors[i].length === descriptor.length ? distance(descriptor, descriptors[i], options4) : Number.MAX_SAFE_INTEGER; + for (let i2 = 0; i2 < descriptors.length; i2++) { + const res = descriptors[i2].length === descriptor.length ? distance(descriptor, descriptors[i2], options4) : Number.MAX_SAFE_INTEGER; if (res < lowestDistance) { lowestDistance = res; - index2 = i; + index2 = i2; } if (lowestDistance < (options4.threshold || 0)) break; @@ -86342,10 +86334,10 @@ async function runCompile(allModels) { const res = model20.execute(tensor2); compiledModels.push(modelName); if (Array.isArray(res)) - res.forEach((t) => dispose(t)); + res.forEach((t2) => dispose(t2)); else dispose(res); - } catch (e) { + } catch (e2) { log("compile fail model:", modelName); } dispose(tensor2); @@ -86418,7 +86410,7 @@ var Human = class { return "input must be a tensor"; try { this.tf.getBackend(); - } catch (e) { + } catch (e2) { return "backend not loaded"; } return null; @@ -86433,7 +86425,7 @@ var Human = class { }); var _a; this.env = env2; - const tfVersion = (((_a = version82) == null ? void 0 : _a.tfjs) || version).replace(/-(.*)/, ""); + const tfVersion = (((_a = V) == null ? void 0 : _a.tfjs) || version).replace(/-(.*)/, ""); config.wasmPath = `https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${tfVersion}/dist/`; config.modelBasePath = env2.browser ? "../models/" : "file://models/"; config.backend = env2.browser ? "humangl" : "tensorflow"; diff --git a/dist/human.esm.js.map b/dist/human.esm.js.map index b2954caf..7aa8861e 100644 --- a/dist/human.esm.js.map +++ b/dist/human.esm.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/util/util.ts", "../src/config.ts", "tfjs.esm.js", "../src/image/imagefxshaders.ts", "../src/image/imagefx.ts", "../src/image/enhance.ts", "../src/image/image.ts", "../src/util/env.ts", "../src/models.ts", "../src/gear/gear.ts", "../src/tfjs/constants.ts", "../src/gear/ssrnet-age.ts", "../src/gear/ssrnet-gender.ts", "../src/face/antispoof.ts", "../src/face/facemeshcoords.ts", "../src/face/facemeshutil.ts", "../src/face/blazeface.ts", "../src/body/blazeposecoords.ts", "../src/body/blazeposedetector.ts", "../src/util/box.ts", "../src/body/blazepose.ts", "../src/object/labels.ts", "../src/object/centernet.ts", "../src/body/efficientposecoords.ts", "../src/body/efficientpose.ts", "../src/gear/emotion.ts", "../src/face/mobilefacenet.ts", "../src/face/insightface.ts", "../src/face/iris.ts", "../src/face/constants.ts", "../src/face/attention.ts", "../src/face/facemesh.ts", "../src/face/faceres.ts", "../src/hand/handposeutil.ts", "../src/hand/handposeanchors.ts", "../src/hand/handposedetector.ts", "../src/hand/handposepipeline.ts", "../src/hand/fingerdef.ts", "../src/hand/fingergesture.ts", "../src/hand/fingerpose.ts", "../src/hand/handpose.ts", "../src/tfjs/humangl.ts", "../src/tfjs/backend.ts", "../src/hand/handtrack.ts", "../src/face/liveness.ts", "../src/body/movenetcoords.ts", "../src/body/movenetfix.ts", "../src/body/movenet.ts", "../src/object/nanodet.ts", "../src/body/posenetutils.ts", "../src/body/posenet.ts", "../src/segmentation/segmentation.ts", "../src/tfjs/load.ts", "../src/draw/draw.ts", "../src/draw/primitives.ts", "../src/draw/options.ts", "../src/draw/face.ts", "../src/draw/body.ts", "../src/draw/hand.ts", "../src/draw/object.ts", "../src/draw/gesture.ts", "../src/face/mask.ts", "../src/face/angles.ts", "../src/face/face.ts", "../src/gesture/gesture.ts", "../src/util/interpolate.ts", "../src/face/match.ts", "../src/util/persons.ts", "../src/sample.ts", "../src/warmup.ts", "../src/human.ts"], - "sourcesContent": ["import type { Config } from '../exports';\n\n/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`modelpath error: expecting json file: ${path}`);\n return path;\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: checks current config validity\nexport function validate(defaults: Partial, config: Partial, parent = 'config', msgs: Array<{ reason: string, where: string, expected?: string }> = []) {\n for (const key of Object.keys(config)) {\n if (typeof config[key] === 'object') {\n validate(defaults[key], config[key], key, msgs);\n } else {\n const defined = defaults && (typeof defaults[key] !== 'undefined');\n if (!defined) msgs.push({ reason: 'unknown property', where: `${parent}.${key} = ${config[key]}` });\n const same = defaults && typeof defaults[key] === typeof config[key];\n if (defined && !same) msgs.push({ reason: 'property type mismatch', where: `${parent}.${key} = ${config[key]}`, expected: typeof defaults[key] });\n }\n // ok = ok && defined && same;\n }\n if (config.debug && parent === 'config' && msgs.length > 0) log('invalid configuration', msgs);\n return msgs;\n}\n\n// helper function: perform deep merge of multiple objects so it allows full inheritance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data: Array) => data.reduce((acc: Array, val) => {\n acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n return acc;\n}, []);\n\n// helper function: async wait\nexport async function wait(time: number) {\n const waiting = new Promise((resolve) => { setTimeout(() => resolve(true), time); });\n await waiting;\n}\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/** Generic config type inherited by all module types */\nexport interface GenericConfig {\n /** is module enabled? */\n enabled: boolean,\n /** path to model json file (relative to `modelBasePath` */\n modelPath: string,\n /** how many max frames to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipFrames: number,\n /** how many max milliseconds to go without re-running model if cached results are acceptable\n * for two-phase models such as face and hand caching applies to bounding boxes detection only */\n skipTime: number,\n}\n\n/** Detector part of face configuration */\nexport interface FaceDetectorConfig extends GenericConfig {\n /** is face rotation correction performed after detecting face?\n * used to correctly analyze faces under high angles\n */\n rotation: boolean,\n /** maximum number of detected faces */\n maxDetected: number,\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected faces before one is discarded */\n iouThreshold: number,\n /** should child models perform on masked image of a face */\n mask: boolean,\n /** should face detection return processed and cropped face tensor that can with an external model for addtional processing?\n * if enabled it must be manually deallocated to avoid memory leak */\n return: boolean,\n}\n\n/** Mesh part of face configuration */\nexport interface FaceMeshConfig extends GenericConfig {\n /** Keep detected faces that cannot be verified using facemesh */\n keepInvalid: boolean\n}\n\n/** Iris part of face configuration */\nexport interface FaceIrisConfig extends GenericConfig {}\n\n/** Attention part of face configuration */\nexport interface FaceAttentionConfig extends GenericConfig {}\n\n/** Description or face embedding part of face configuration\n * - also used by age and gender detection\n */\nexport interface FaceDescriptionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Emotion part of face configuration */\nexport interface FaceEmotionConfig extends GenericConfig {\n /** minimum confidence for a detected face before results are discarded */\n minConfidence: number,\n}\n\n/** Anti-spoofing part of face configuration */\nexport interface FaceAntiSpoofConfig extends GenericConfig {}\n\n/** Liveness part of face configuration */\nexport interface FaceLivenessConfig extends GenericConfig {}\n\n/** Gear part of face configuration */\nexport interface FaceGearConfig extends GenericConfig {\n /** minimum confidence for a detected race before results are discarded */\n minConfidence: number,\n}\n\n/** Configures all face-specific options: face detection, mesh analysis, age, gender, emotion detection and face description */\nexport interface FaceConfig extends GenericConfig {\n detector: Partial,\n mesh: Partial,\n attention: Partial,\n iris: Partial,\n description: Partial,\n emotion: Partial,\n antispoof: Partial,\n liveness: Partial,\n gear: Partial,\n}\n\n/** Configures all body detection specific options */\nexport interface BodyConfig extends GenericConfig {\n /** maximum number of detected bodies */\n maxDetected: number,\n /** minimum confidence for a detected body before results are discarded */\n minConfidence: number,\n /* experimental\n /** experimental: detector used for body model before actual analysis\n detector?: {\n /** experimental: enable body detector before body landmarks\n enabled: boolean,\n /** experimental: path to optional body detector model json file\n modelPath: string,\n /** experimental: minimum confidence for a detected body before results are discarded\n minConfidence: number,\n /** experimental: minimum overlap between two detected bodies before one is discarded\n iouThreshold: number\n },\n */\n}\n\n/** Configures all hand detection specific options */\nexport interface HandConfig extends GenericConfig {\n /** should hand rotation correction be performed after hand detection? */\n rotation: boolean,\n /** minimum confidence for a detected hand before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected hands before one is discarded */\n iouThreshold: number,\n /** maximum number of detected hands */\n maxDetected: number,\n /** should hand landmarks be detected or just return detected hand box */\n landmarks: boolean,\n detector: {\n /** path to hand detector model json */\n modelPath?: string,\n },\n skeleton: {\n /** path to hand skeleton model json */\n modelPath?: string,\n },\n}\n\n/** Configures all object detection specific options */\nexport interface ObjectConfig extends GenericConfig {\n /** minimum confidence for a detected objects before results are discarded */\n minConfidence: number,\n /** minimum overlap between two detected objects before one is discarded */\n iouThreshold: number,\n /** maximum number of detected objects */\n maxDetected: number,\n}\n\n/** Configures all body segmentation module\n * removes background from input containing person\n * if segmentation is enabled it will run as preprocessing task before any other model\n * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n * remove background or replace it with user-provided background\n*/\nexport interface SegmentationConfig extends GenericConfig {\n /** blur segmentation output by pixels for more realistic image */\n blur: number,\n}\n\n/** Run input through image filters before inference\n * - available only in Browser environments\n * - image filters run with near-zero latency as they are executed on the GPU using WebGL\n*/\nexport interface FilterConfig {\n /** are image filters enabled? */\n enabled: boolean,\n /** perform image histogram equalization\n * - equalization is performed on input as a whole and detected face before its passed for further analysis\n */\n equalization: boolean,\n /** resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** return processed canvas imagedata in result */\n return: boolean,\n /** flip input as mirror image */\n flip: boolean,\n /** range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** image negative */\n negative: boolean,\n /** image sepia colors */\n sepia: boolean,\n /** image vintage colors */\n vintage: boolean,\n /** image kodachrome colors */\n kodachrome: boolean,\n /** image technicolor colors */\n technicolor: boolean,\n /** image polaroid camera effect */\n polaroid: boolean,\n /** range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n}\n\n/** Controlls gesture detection */\nexport interface GestureConfig {\n /** is gesture detection enabled? */\n enabled: boolean,\n}\n/** Possible TensorFlow backends */\nexport type BackendType = ['cpu', 'wasm', 'webgl', 'humangl', 'tensorflow', 'webgpu'];\n\n/** Possible values for `human.warmup` */\nexport type WarmupType = ['' | 'none' | 'face' | 'full' | 'body'];\n\n/**\n * Configuration interface definition for **Human** library\n * Contains all configurable parameters\n * Defaults: [config](https://github.com/vladmandic/human/blob/main/src/config.ts#L262)\n */\nexport interface Config {\n /** Backend used for TFJS operations\n * valid build-in backends are:\n * - Browser: `cpu`, `wasm`, `webgl`, `humangl`, `webgpu`\n * - NodeJS: `cpu`, `wasm`, `tensorflow`\n * default: `humangl` for browser and `tensorflow` for nodejs\n */\n backend: '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow' | 'webgpu',\n\n /** Path to *.wasm files if backend is set to `wasm`\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPath: string,\n\n /** Force WASM loader to use platform fetch\n *\n * default: auto-detects to link to CDN `jsdelivr` when running in browser\n */\n wasmPlatformFetch: boolean,\n\n /** Print debug statements to console\n *\n * default: `true`\n */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially\n *\n * default: `true`\n */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - used by `webgl`, `humangl` and `webgpu` backends\n *\n * default: `full`\n */\n warmup: '' | 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n *\n * default: `../models/` for browsers and `file://models/` for nodejs\n */\n modelBasePath: string,\n\n /** Cache models in IndexDB on first sucessfull load\n * default: true if indexdb is available (browsers), false if its not (nodejs)\n */\n cacheModels: boolean,\n\n /** Validate kernel ops used in model during model load\n * default: true\n * any errors will be printed on console but will be treated as non-fatal\n */\n validateModels: boolean,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n *\n * default: 0.7\n */\n cacheSensitivity: number;\n\n /** Perform immediate garbage collection on deallocated tensors instead of caching them */\n deallocate: boolean;\n\n /** Internal Variable */\n skipAllowed: boolean;\n\n /** Filter config {@link FilterConfig} */\n filter: Partial,\n\n /** Gesture config {@link GestureConfig} */\n gesture: Partial;\n\n /** Face config {@link FaceConfig} */\n face: Partial,\n\n /** Body config {@link BodyConfig} */\n body: Partial,\n\n /** Hand config {@link HandConfig} */\n hand: Partial,\n\n /** Object config {@link ObjectConfig} */\n object: Partial,\n\n /** Segmentation config {@link SegmentationConfig} */\n segmentation: Partial,\n}\n\n/** - [See all default Config values...](https://github.com/vladmandic/human/blob/main/src/config.ts#L262) */\nconst config: Config = {\n backend: '',\n modelBasePath: '',\n cacheModels: true,\n validateModels: true,\n wasmPath: '',\n wasmPlatformFetch: false,\n debug: false,\n async: true,\n warmup: 'full',\n cacheSensitivity: 0.70,\n skipAllowed: false,\n deallocate: false,\n filter: {\n enabled: true,\n equalization: false,\n width: 0,\n height: 0,\n flip: false,\n return: true,\n brightness: 0,\n contrast: 0,\n sharpness: 0,\n blur: 0,\n saturation: 0,\n hue: 0,\n negative: false,\n sepia: false,\n vintage: false,\n kodachrome: false,\n technicolor: false,\n polaroid: false,\n pixelate: 0,\n },\n gesture: {\n enabled: true,\n },\n face: {\n enabled: true,\n detector: {\n modelPath: 'blazeface.json',\n rotation: true,\n maxDetected: 1,\n skipFrames: 99,\n skipTime: 2500,\n minConfidence: 0.2,\n iouThreshold: 0.1,\n mask: false,\n return: false,\n },\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json',\n keepInvalid: false,\n },\n attention: {\n enabled: false,\n modelPath: 'facemesh-attention.json',\n },\n iris: {\n enabled: true,\n modelPath: 'iris.json',\n },\n emotion: {\n enabled: true,\n minConfidence: 0.1,\n skipFrames: 99,\n skipTime: 1500,\n modelPath: 'emotion.json',\n },\n description: {\n enabled: true,\n modelPath: 'faceres.json',\n skipFrames: 99,\n skipTime: 3000,\n minConfidence: 0.1,\n },\n antispoof: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'antispoof.json',\n },\n liveness: {\n enabled: false,\n skipFrames: 99,\n skipTime: 4000,\n modelPath: 'liveness.json',\n },\n },\n body: {\n enabled: true,\n modelPath: 'movenet-lightning.json',\n maxDetected: -1,\n minConfidence: 0.3,\n skipFrames: 1,\n skipTime: 200,\n },\n hand: {\n enabled: true,\n rotation: true,\n skipFrames: 99,\n skipTime: 1000,\n minConfidence: 0.50,\n iouThreshold: 0.2,\n maxDetected: -1,\n landmarks: true,\n detector: {\n modelPath: 'handtrack.json',\n },\n skeleton: {\n modelPath: 'handlandmark-full.json',\n },\n },\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json',\n minConfidence: 0.2,\n iouThreshold: 0.4,\n maxDetected: 10,\n skipFrames: 99,\n skipTime: 2000,\n },\n segmentation: {\n enabled: false,\n modelPath: 'selfie.json',\n blur: 8,\n },\n};\n\nexport { config as defaults };\n", "/*\n Human\n homepage: \n author: '\n*/\n\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod4) => function __require() {\n return mod4 || (0, cb[__getOwnPropNames(cb)[0]])((mod4 = { exports: {} }).exports, mod4), mod4.exports;\n};\nvar __export = (target, all5) => {\n for (var name in all5)\n __defProp(target, name, { get: all5[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod4, isNodeMode, target) => (target = mod4 != null ? __create(__getProtoOf(mod4)) : {}, __copyProps(\n isNodeMode || !mod4 || !mod4.__esModule ? __defProp(target, \"default\", { value: mod4, enumerable: true }) : target,\n mod4\n));\n\n// node_modules/.pnpm/long@4.0.0/node_modules/long/src/long.js\nvar require_long = __commonJS({\n \"node_modules/.pnpm/long@4.0.0/node_modules/long/src/long.js\"(exports, module) {\n module.exports = Long2;\n var wasm = null;\n try {\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\n 0,\n 97,\n 115,\n 109,\n 1,\n 0,\n 0,\n 0,\n 1,\n 13,\n 2,\n 96,\n 0,\n 1,\n 127,\n 96,\n 4,\n 127,\n 127,\n 127,\n 127,\n 1,\n 127,\n 3,\n 7,\n 6,\n 0,\n 1,\n 1,\n 1,\n 1,\n 1,\n 6,\n 6,\n 1,\n 127,\n 1,\n 65,\n 0,\n 11,\n 7,\n 50,\n 6,\n 3,\n 109,\n 117,\n 108,\n 0,\n 1,\n 5,\n 100,\n 105,\n 118,\n 95,\n 115,\n 0,\n 2,\n 5,\n 100,\n 105,\n 118,\n 95,\n 117,\n 0,\n 3,\n 5,\n 114,\n 101,\n 109,\n 95,\n 115,\n 0,\n 4,\n 5,\n 114,\n 101,\n 109,\n 95,\n 117,\n 0,\n 5,\n 8,\n 103,\n 101,\n 116,\n 95,\n 104,\n 105,\n 103,\n 104,\n 0,\n 0,\n 10,\n 191,\n 1,\n 6,\n 4,\n 0,\n 35,\n 0,\n 11,\n 36,\n 1,\n 1,\n 126,\n 32,\n 0,\n 173,\n 32,\n 1,\n 173,\n 66,\n 32,\n 134,\n 132,\n 32,\n 2,\n 173,\n 32,\n 3,\n 173,\n 66,\n 32,\n 134,\n 132,\n 126,\n 34,\n 4,\n 66,\n 32,\n 135,\n 167,\n 36,\n 0,\n 32,\n 4,\n 167,\n 11,\n 36,\n 1,\n 1,\n 126,\n 32,\n 0,\n 173,\n 32,\n 1,\n 173,\n 66,\n 32,\n 134,\n 132,\n 32,\n 2,\n 173,\n 32,\n 3,\n 173,\n 66,\n 32,\n 134,\n 132,\n 127,\n 34,\n 4,\n 66,\n 32,\n 135,\n 167,\n 36,\n 0,\n 32,\n 4,\n 167,\n 11,\n 36,\n 1,\n 1,\n 126,\n 32,\n 0,\n 173,\n 32,\n 1,\n 173,\n 66,\n 32,\n 134,\n 132,\n 32,\n 2,\n 173,\n 32,\n 3,\n 173,\n 66,\n 32,\n 134,\n 132,\n 128,\n 34,\n 4,\n 66,\n 32,\n 135,\n 167,\n 36,\n 0,\n 32,\n 4,\n 167,\n 11,\n 36,\n 1,\n 1,\n 126,\n 32,\n 0,\n 173,\n 32,\n 1,\n 173,\n 66,\n 32,\n 134,\n 132,\n 32,\n 2,\n 173,\n 32,\n 3,\n 173,\n 66,\n 32,\n 134,\n 132,\n 129,\n 34,\n 4,\n 66,\n 32,\n 135,\n 167,\n 36,\n 0,\n 32,\n 4,\n 167,\n 11,\n 36,\n 1,\n 1,\n 126,\n 32,\n 0,\n 173,\n 32,\n 1,\n 173,\n 66,\n 32,\n 134,\n 132,\n 32,\n 2,\n 173,\n 32,\n 3,\n 173,\n 66,\n 32,\n 134,\n 132,\n 130,\n 34,\n 4,\n 66,\n 32,\n 135,\n 167,\n 36,\n 0,\n 32,\n 4,\n 167,\n 11\n ])), {}).exports;\n } catch (e) {\n }\n function Long2(low, high, unsigned) {\n this.low = low | 0;\n this.high = high | 0;\n this.unsigned = !!unsigned;\n }\n Long2.prototype.__isLong__;\n Object.defineProperty(Long2.prototype, \"__isLong__\", { value: true });\n function isLong(obj) {\n return (obj && obj[\"__isLong__\"]) === true;\n }\n Long2.isLong = isLong;\n var INT_CACHE = {};\n var UINT_CACHE = {};\n function fromInt(value, unsigned) {\n var obj, cachedObj, cache;\n if (unsigned) {\n value >>>= 0;\n if (cache = 0 <= value && value < 256) {\n cachedObj = UINT_CACHE[value];\n if (cachedObj)\n return cachedObj;\n }\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\n if (cache)\n UINT_CACHE[value] = obj;\n return obj;\n } else {\n value |= 0;\n if (cache = -128 <= value && value < 128) {\n cachedObj = INT_CACHE[value];\n if (cachedObj)\n return cachedObj;\n }\n obj = fromBits(value, value < 0 ? -1 : 0, false);\n if (cache)\n INT_CACHE[value] = obj;\n return obj;\n }\n }\n Long2.fromInt = fromInt;\n function fromNumber(value, unsigned) {\n if (isNaN(value))\n return unsigned ? UZERO : ZERO;\n if (unsigned) {\n if (value < 0)\n return UZERO;\n if (value >= TWO_PWR_64_DBL)\n return MAX_UNSIGNED_VALUE;\n } else {\n if (value <= -TWO_PWR_63_DBL)\n return MIN_VALUE;\n if (value + 1 >= TWO_PWR_63_DBL)\n return MAX_VALUE;\n }\n if (value < 0)\n return fromNumber(-value, unsigned).neg();\n return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned);\n }\n Long2.fromNumber = fromNumber;\n function fromBits(lowBits, highBits, unsigned) {\n return new Long2(lowBits, highBits, unsigned);\n }\n Long2.fromBits = fromBits;\n var pow_dbl = Math.pow;\n function fromString(str, unsigned, radix) {\n if (str.length === 0)\n throw Error(\"empty string\");\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\n return ZERO;\n if (typeof unsigned === \"number\") {\n radix = unsigned, unsigned = false;\n } else {\n unsigned = !!unsigned;\n }\n radix = radix || 10;\n if (radix < 2 || 36 < radix)\n throw RangeError(\"radix\");\n var p2;\n if ((p2 = str.indexOf(\"-\")) > 0)\n throw Error(\"interior hyphen\");\n else if (p2 === 0) {\n return fromString(str.substring(1), unsigned, radix).neg();\n }\n var radixToPower = fromNumber(pow_dbl(radix, 8));\n var result = ZERO;\n for (var i = 0; i < str.length; i += 8) {\n var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix);\n if (size < 8) {\n var power = fromNumber(pow_dbl(radix, size));\n result = result.mul(power).add(fromNumber(value));\n } else {\n result = result.mul(radixToPower);\n result = result.add(fromNumber(value));\n }\n }\n result.unsigned = unsigned;\n return result;\n }\n Long2.fromString = fromString;\n function fromValue(val, unsigned) {\n if (typeof val === \"number\")\n return fromNumber(val, unsigned);\n if (typeof val === \"string\")\n return fromString(val, unsigned);\n return fromBits(val.low, val.high, typeof unsigned === \"boolean\" ? unsigned : val.unsigned);\n }\n Long2.fromValue = fromValue;\n var TWO_PWR_16_DBL = 1 << 16;\n var TWO_PWR_24_DBL = 1 << 24;\n var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\n var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\n var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\n var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\n var ZERO = fromInt(0);\n Long2.ZERO = ZERO;\n var UZERO = fromInt(0, true);\n Long2.UZERO = UZERO;\n var ONE = fromInt(1);\n Long2.ONE = ONE;\n var UONE = fromInt(1, true);\n Long2.UONE = UONE;\n var NEG_ONE = fromInt(-1);\n Long2.NEG_ONE = NEG_ONE;\n var MAX_VALUE = fromBits(4294967295 | 0, 2147483647 | 0, false);\n Long2.MAX_VALUE = MAX_VALUE;\n var MAX_UNSIGNED_VALUE = fromBits(4294967295 | 0, 4294967295 | 0, true);\n Long2.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\n var MIN_VALUE = fromBits(0, 2147483648 | 0, false);\n Long2.MIN_VALUE = MIN_VALUE;\n var LongPrototype = Long2.prototype;\n LongPrototype.toInt = function toInt() {\n return this.unsigned ? this.low >>> 0 : this.low;\n };\n LongPrototype.toNumber = function toNumber() {\n if (this.unsigned)\n return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0);\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\n };\n LongPrototype.toString = function toString(radix) {\n radix = radix || 10;\n if (radix < 2 || 36 < radix)\n throw RangeError(\"radix\");\n if (this.isZero())\n return \"0\";\n if (this.isNegative()) {\n if (this.eq(MIN_VALUE)) {\n var radixLong = fromNumber(radix), div3 = this.div(radixLong), rem1 = div3.mul(radixLong).sub(this);\n return div3.toString(radix) + rem1.toInt().toString(radix);\n } else\n return \"-\" + this.neg().toString(radix);\n }\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), rem = this;\n var result = \"\";\n while (true) {\n var remDiv = rem.div(radixToPower), intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, digits = intval.toString(radix);\n rem = remDiv;\n if (rem.isZero())\n return digits + result;\n else {\n while (digits.length < 6)\n digits = \"0\" + digits;\n result = \"\" + digits + result;\n }\n }\n };\n LongPrototype.getHighBits = function getHighBits() {\n return this.high;\n };\n LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\n return this.high >>> 0;\n };\n LongPrototype.getLowBits = function getLowBits() {\n return this.low;\n };\n LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\n return this.low >>> 0;\n };\n LongPrototype.getNumBitsAbs = function getNumBitsAbs() {\n if (this.isNegative())\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\n var val = this.high != 0 ? this.high : this.low;\n for (var bit = 31; bit > 0; bit--)\n if ((val & 1 << bit) != 0)\n break;\n return this.high != 0 ? bit + 33 : bit + 1;\n };\n LongPrototype.isZero = function isZero() {\n return this.high === 0 && this.low === 0;\n };\n LongPrototype.eqz = LongPrototype.isZero;\n LongPrototype.isNegative = function isNegative() {\n return !this.unsigned && this.high < 0;\n };\n LongPrototype.isPositive = function isPositive() {\n return this.unsigned || this.high >= 0;\n };\n LongPrototype.isOdd = function isOdd() {\n return (this.low & 1) === 1;\n };\n LongPrototype.isEven = function isEven2() {\n return (this.low & 1) === 0;\n };\n LongPrototype.equals = function equals(other) {\n if (!isLong(other))\n other = fromValue(other);\n if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1)\n return false;\n return this.high === other.high && this.low === other.low;\n };\n LongPrototype.eq = LongPrototype.equals;\n LongPrototype.notEquals = function notEquals(other) {\n return !this.eq(other);\n };\n LongPrototype.neq = LongPrototype.notEquals;\n LongPrototype.ne = LongPrototype.notEquals;\n LongPrototype.lessThan = function lessThan(other) {\n return this.comp(other) < 0;\n };\n LongPrototype.lt = LongPrototype.lessThan;\n LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\n return this.comp(other) <= 0;\n };\n LongPrototype.lte = LongPrototype.lessThanOrEqual;\n LongPrototype.le = LongPrototype.lessThanOrEqual;\n LongPrototype.greaterThan = function greaterThan(other) {\n return this.comp(other) > 0;\n };\n LongPrototype.gt = LongPrototype.greaterThan;\n LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\n return this.comp(other) >= 0;\n };\n LongPrototype.gte = LongPrototype.greaterThanOrEqual;\n LongPrototype.ge = LongPrototype.greaterThanOrEqual;\n LongPrototype.compare = function compare(other) {\n if (!isLong(other))\n other = fromValue(other);\n if (this.eq(other))\n return 0;\n var thisNeg = this.isNegative(), otherNeg = other.isNegative();\n if (thisNeg && !otherNeg)\n return -1;\n if (!thisNeg && otherNeg)\n return 1;\n if (!this.unsigned)\n return this.sub(other).isNegative() ? -1 : 1;\n return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1;\n };\n LongPrototype.comp = LongPrototype.compare;\n LongPrototype.negate = function negate() {\n if (!this.unsigned && this.eq(MIN_VALUE))\n return MIN_VALUE;\n return this.not().add(ONE);\n };\n LongPrototype.neg = LongPrototype.negate;\n LongPrototype.add = function add5(addend) {\n if (!isLong(addend))\n addend = fromValue(addend);\n var a48 = this.high >>> 16;\n var a32 = this.high & 65535;\n var a16 = this.low >>> 16;\n var a00 = this.low & 65535;\n var b48 = addend.high >>> 16;\n var b32 = addend.high & 65535;\n var b16 = addend.low >>> 16;\n var b00 = addend.low & 65535;\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n c00 += a00 + b00;\n c16 += c00 >>> 16;\n c00 &= 65535;\n c16 += a16 + b16;\n c32 += c16 >>> 16;\n c16 &= 65535;\n c32 += a32 + b32;\n c48 += c32 >>> 16;\n c32 &= 65535;\n c48 += a48 + b48;\n c48 &= 65535;\n return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned);\n };\n LongPrototype.subtract = function subtract(subtrahend) {\n if (!isLong(subtrahend))\n subtrahend = fromValue(subtrahend);\n return this.add(subtrahend.neg());\n };\n LongPrototype.sub = LongPrototype.subtract;\n LongPrototype.multiply = function multiply4(multiplier) {\n if (this.isZero())\n return ZERO;\n if (!isLong(multiplier))\n multiplier = fromValue(multiplier);\n if (wasm) {\n var low = wasm.mul(\n this.low,\n this.high,\n multiplier.low,\n multiplier.high\n );\n return fromBits(low, wasm.get_high(), this.unsigned);\n }\n if (multiplier.isZero())\n return ZERO;\n if (this.eq(MIN_VALUE))\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\n if (multiplier.eq(MIN_VALUE))\n return this.isOdd() ? MIN_VALUE : ZERO;\n if (this.isNegative()) {\n if (multiplier.isNegative())\n return this.neg().mul(multiplier.neg());\n else\n return this.neg().mul(multiplier).neg();\n } else if (multiplier.isNegative())\n return this.mul(multiplier.neg()).neg();\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\n var a48 = this.high >>> 16;\n var a32 = this.high & 65535;\n var a16 = this.low >>> 16;\n var a00 = this.low & 65535;\n var b48 = multiplier.high >>> 16;\n var b32 = multiplier.high & 65535;\n var b16 = multiplier.low >>> 16;\n var b00 = multiplier.low & 65535;\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n c00 += a00 * b00;\n c16 += c00 >>> 16;\n c00 &= 65535;\n c16 += a16 * b00;\n c32 += c16 >>> 16;\n c16 &= 65535;\n c16 += a00 * b16;\n c32 += c16 >>> 16;\n c16 &= 65535;\n c32 += a32 * b00;\n c48 += c32 >>> 16;\n c32 &= 65535;\n c32 += a16 * b16;\n c48 += c32 >>> 16;\n c32 &= 65535;\n c32 += a00 * b32;\n c48 += c32 >>> 16;\n c32 &= 65535;\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n c48 &= 65535;\n return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned);\n };\n LongPrototype.mul = LongPrototype.multiply;\n LongPrototype.divide = function divide(divisor) {\n if (!isLong(divisor))\n divisor = fromValue(divisor);\n if (divisor.isZero())\n throw Error(\"division by zero\");\n if (wasm) {\n if (!this.unsigned && this.high === -2147483648 && divisor.low === -1 && divisor.high === -1) {\n return this;\n }\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\n this.low,\n this.high,\n divisor.low,\n divisor.high\n );\n return fromBits(low, wasm.get_high(), this.unsigned);\n }\n if (this.isZero())\n return this.unsigned ? UZERO : ZERO;\n var approx, rem, res;\n if (!this.unsigned) {\n if (this.eq(MIN_VALUE)) {\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\n return MIN_VALUE;\n else if (divisor.eq(MIN_VALUE))\n return ONE;\n else {\n var halfThis = this.shr(1);\n approx = halfThis.div(divisor).shl(1);\n if (approx.eq(ZERO)) {\n return divisor.isNegative() ? ONE : NEG_ONE;\n } else {\n rem = this.sub(divisor.mul(approx));\n res = approx.add(rem.div(divisor));\n return res;\n }\n }\n } else if (divisor.eq(MIN_VALUE))\n return this.unsigned ? UZERO : ZERO;\n if (this.isNegative()) {\n if (divisor.isNegative())\n return this.neg().div(divisor.neg());\n return this.neg().div(divisor).neg();\n } else if (divisor.isNegative())\n return this.div(divisor.neg()).neg();\n res = ZERO;\n } else {\n if (!divisor.unsigned)\n divisor = divisor.toUnsigned();\n if (divisor.gt(this))\n return UZERO;\n if (divisor.gt(this.shru(1)))\n return UONE;\n res = UZERO;\n }\n rem = this;\n while (rem.gte(divisor)) {\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\n var log22 = Math.ceil(Math.log(approx) / Math.LN2), delta = log22 <= 48 ? 1 : pow_dbl(2, log22 - 48), approxRes = fromNumber(approx), approxRem = approxRes.mul(divisor);\n while (approxRem.isNegative() || approxRem.gt(rem)) {\n approx -= delta;\n approxRes = fromNumber(approx, this.unsigned);\n approxRem = approxRes.mul(divisor);\n }\n if (approxRes.isZero())\n approxRes = ONE;\n res = res.add(approxRes);\n rem = rem.sub(approxRem);\n }\n return res;\n };\n LongPrototype.div = LongPrototype.divide;\n LongPrototype.modulo = function modulo(divisor) {\n if (!isLong(divisor))\n divisor = fromValue(divisor);\n if (wasm) {\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\n this.low,\n this.high,\n divisor.low,\n divisor.high\n );\n return fromBits(low, wasm.get_high(), this.unsigned);\n }\n return this.sub(this.div(divisor).mul(divisor));\n };\n LongPrototype.mod = LongPrototype.modulo;\n LongPrototype.rem = LongPrototype.modulo;\n LongPrototype.not = function not() {\n return fromBits(~this.low, ~this.high, this.unsigned);\n };\n LongPrototype.and = function and(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\n };\n LongPrototype.or = function or(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\n };\n LongPrototype.xor = function xor(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\n };\n LongPrototype.shiftLeft = function shiftLeft(numBits) {\n if (isLong(numBits))\n numBits = numBits.toInt();\n if ((numBits &= 63) === 0)\n return this;\n else if (numBits < 32)\n return fromBits(this.low << numBits, this.high << numBits | this.low >>> 32 - numBits, this.unsigned);\n else\n return fromBits(0, this.low << numBits - 32, this.unsigned);\n };\n LongPrototype.shl = LongPrototype.shiftLeft;\n LongPrototype.shiftRight = function shiftRight(numBits) {\n if (isLong(numBits))\n numBits = numBits.toInt();\n if ((numBits &= 63) === 0)\n return this;\n else if (numBits < 32)\n return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >> numBits, this.unsigned);\n else\n return fromBits(this.high >> numBits - 32, this.high >= 0 ? 0 : -1, this.unsigned);\n };\n LongPrototype.shr = LongPrototype.shiftRight;\n LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\n if (isLong(numBits))\n numBits = numBits.toInt();\n numBits &= 63;\n if (numBits === 0)\n return this;\n else {\n var high = this.high;\n if (numBits < 32) {\n var low = this.low;\n return fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits, this.unsigned);\n } else if (numBits === 32)\n return fromBits(high, 0, this.unsigned);\n else\n return fromBits(high >>> numBits - 32, 0, this.unsigned);\n }\n };\n LongPrototype.shru = LongPrototype.shiftRightUnsigned;\n LongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\n LongPrototype.toSigned = function toSigned() {\n if (!this.unsigned)\n return this;\n return fromBits(this.low, this.high, false);\n };\n LongPrototype.toUnsigned = function toUnsigned() {\n if (this.unsigned)\n return this;\n return fromBits(this.low, this.high, true);\n };\n LongPrototype.toBytes = function toBytes(le) {\n return le ? this.toBytesLE() : this.toBytesBE();\n };\n LongPrototype.toBytesLE = function toBytesLE() {\n var hi = this.high, lo = this.low;\n return [\n lo & 255,\n lo >>> 8 & 255,\n lo >>> 16 & 255,\n lo >>> 24,\n hi & 255,\n hi >>> 8 & 255,\n hi >>> 16 & 255,\n hi >>> 24\n ];\n };\n LongPrototype.toBytesBE = function toBytesBE() {\n var hi = this.high, lo = this.low;\n return [\n hi >>> 24,\n hi >>> 16 & 255,\n hi >>> 8 & 255,\n hi & 255,\n lo >>> 24,\n lo >>> 16 & 255,\n lo >>> 8 & 255,\n lo & 255\n ];\n };\n Long2.fromBytes = function fromBytes(bytes, unsigned, le) {\n return le ? Long2.fromBytesLE(bytes, unsigned) : Long2.fromBytesBE(bytes, unsigned);\n };\n Long2.fromBytesLE = function fromBytesLE(bytes, unsigned) {\n return new Long2(\n bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24,\n bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24,\n unsigned\n );\n };\n Long2.fromBytesBE = function fromBytesBE(bytes, unsigned) {\n return new Long2(\n bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7],\n bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3],\n unsigned\n );\n };\n }\n});\n\n// (disabled):node_modules/.pnpm/node-fetch@2.6.7/node_modules/node-fetch/browser.js\nvar require_browser = __commonJS({\n \"(disabled):node_modules/.pnpm/node-fetch@2.6.7/node_modules/node-fetch/browser.js\"() {\n }\n});\n\n// (disabled):util\nvar require_util = __commonJS({\n \"(disabled):util\"() {\n }\n});\n\n// node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/alea.js\nvar require_alea = __commonJS({\n \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/alea.js\"(exports, module) {\n (function(global2, module2, define2) {\n function Alea(seed) {\n var me = this, mash = Mash();\n me.next = function() {\n var t = 2091639 * me.s0 + me.c * 23283064365386963e-26;\n me.s0 = me.s1;\n me.s1 = me.s2;\n return me.s2 = t - (me.c = t | 0);\n };\n me.c = 1;\n me.s0 = mash(\" \");\n me.s1 = mash(\" \");\n me.s2 = mash(\" \");\n me.s0 -= mash(seed);\n if (me.s0 < 0) {\n me.s0 += 1;\n }\n me.s1 -= mash(seed);\n if (me.s1 < 0) {\n me.s1 += 1;\n }\n me.s2 -= mash(seed);\n if (me.s2 < 0) {\n me.s2 += 1;\n }\n mash = null;\n }\n function copy(f, t) {\n t.c = f.c;\n t.s0 = f.s0;\n t.s1 = f.s1;\n t.s2 = f.s2;\n return t;\n }\n function impl(seed, opts) {\n var xg = new Alea(seed), state = opts && opts.state, prng = xg.next;\n prng.int32 = function() {\n return xg.next() * 4294967296 | 0;\n };\n prng.double = function() {\n return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32;\n };\n prng.quick = prng;\n if (state) {\n if (typeof state == \"object\")\n copy(state, xg);\n prng.state = function() {\n return copy(xg, {});\n };\n }\n return prng;\n }\n function Mash() {\n var n = 4022871197;\n var mash = function(data) {\n data = String(data);\n for (var i = 0; i < data.length; i++) {\n n += data.charCodeAt(i);\n var h = 0.02519603282416938 * n;\n n = h >>> 0;\n h -= n;\n h *= n;\n n = h >>> 0;\n h -= n;\n n += h * 4294967296;\n }\n return (n >>> 0) * 23283064365386963e-26;\n };\n return mash;\n }\n if (module2 && module2.exports) {\n module2.exports = impl;\n } else if (define2 && define2.amd) {\n define2(function() {\n return impl;\n });\n } else {\n this.alea = impl;\n }\n })(\n exports,\n typeof module == \"object\" && module,\n typeof define == \"function\" && define\n );\n }\n});\n\n// node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js\nvar require_xor128 = __commonJS({\n \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js\"(exports, module) {\n (function(global2, module2, define2) {\n function XorGen(seed) {\n var me = this, strseed = \"\";\n me.x = 0;\n me.y = 0;\n me.z = 0;\n me.w = 0;\n me.next = function() {\n var t = me.x ^ me.x << 11;\n me.x = me.y;\n me.y = me.z;\n me.z = me.w;\n return me.w ^= me.w >>> 19 ^ t ^ t >>> 8;\n };\n if (seed === (seed | 0)) {\n me.x = seed;\n } else {\n strseed += seed;\n }\n for (var k = 0; k < strseed.length + 64; k++) {\n me.x ^= strseed.charCodeAt(k) | 0;\n me.next();\n }\n }\n function copy(f, t) {\n t.x = f.x;\n t.y = f.y;\n t.z = f.z;\n t.w = f.w;\n return t;\n }\n function impl(seed, opts) {\n var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n return (xg.next() >>> 0) / 4294967296;\n };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof state == \"object\")\n copy(state, xg);\n prng.state = function() {\n return copy(xg, {});\n };\n }\n return prng;\n }\n if (module2 && module2.exports) {\n module2.exports = impl;\n } else if (define2 && define2.amd) {\n define2(function() {\n return impl;\n });\n } else {\n this.xor128 = impl;\n }\n })(\n exports,\n typeof module == \"object\" && module,\n typeof define == \"function\" && define\n );\n }\n});\n\n// node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js\nvar require_xorwow = __commonJS({\n \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js\"(exports, module) {\n (function(global2, module2, define2) {\n function XorGen(seed) {\n var me = this, strseed = \"\";\n me.next = function() {\n var t = me.x ^ me.x >>> 2;\n me.x = me.y;\n me.y = me.z;\n me.z = me.w;\n me.w = me.v;\n return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0;\n };\n me.x = 0;\n me.y = 0;\n me.z = 0;\n me.w = 0;\n me.v = 0;\n if (seed === (seed | 0)) {\n me.x = seed;\n } else {\n strseed += seed;\n }\n for (var k = 0; k < strseed.length + 64; k++) {\n me.x ^= strseed.charCodeAt(k) | 0;\n if (k == strseed.length) {\n me.d = me.x << 10 ^ me.x >>> 4;\n }\n me.next();\n }\n }\n function copy(f, t) {\n t.x = f.x;\n t.y = f.y;\n t.z = f.z;\n t.w = f.w;\n t.v = f.v;\n t.d = f.d;\n return t;\n }\n function impl(seed, opts) {\n var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n return (xg.next() >>> 0) / 4294967296;\n };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof state == \"object\")\n copy(state, xg);\n prng.state = function() {\n return copy(xg, {});\n };\n }\n return prng;\n }\n if (module2 && module2.exports) {\n module2.exports = impl;\n } else if (define2 && define2.amd) {\n define2(function() {\n return impl;\n });\n } else {\n this.xorwow = impl;\n }\n })(\n exports,\n typeof module == \"object\" && module,\n typeof define == \"function\" && define\n );\n }\n});\n\n// node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js\nvar require_xorshift7 = __commonJS({\n \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js\"(exports, module) {\n (function(global2, module2, define2) {\n function XorGen(seed) {\n var me = this;\n me.next = function() {\n var X = me.x, i = me.i, t, v, w;\n t = X[i];\n t ^= t >>> 7;\n v = t ^ t << 24;\n t = X[i + 1 & 7];\n v ^= t ^ t >>> 10;\n t = X[i + 3 & 7];\n v ^= t ^ t >>> 3;\n t = X[i + 4 & 7];\n v ^= t ^ t << 7;\n t = X[i + 7 & 7];\n t = t ^ t << 13;\n v ^= t ^ t << 9;\n X[i] = v;\n me.i = i + 1 & 7;\n return v;\n };\n function init2(me2, seed2) {\n var j, w, X = [];\n if (seed2 === (seed2 | 0)) {\n w = X[0] = seed2;\n } else {\n seed2 = \"\" + seed2;\n for (j = 0; j < seed2.length; ++j) {\n X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13;\n }\n }\n while (X.length < 8)\n X.push(0);\n for (j = 0; j < 8 && X[j] === 0; ++j)\n ;\n if (j == 8)\n w = X[7] = -1;\n else\n w = X[j];\n me2.x = X;\n me2.i = 0;\n for (j = 256; j > 0; --j) {\n me2.next();\n }\n }\n init2(me, seed);\n }\n function copy(f, t) {\n t.x = f.x.slice();\n t.i = f.i;\n return t;\n }\n function impl(seed, opts) {\n if (seed == null)\n seed = +new Date();\n var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n return (xg.next() >>> 0) / 4294967296;\n };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (state.x)\n copy(state, xg);\n prng.state = function() {\n return copy(xg, {});\n };\n }\n return prng;\n }\n if (module2 && module2.exports) {\n module2.exports = impl;\n } else if (define2 && define2.amd) {\n define2(function() {\n return impl;\n });\n } else {\n this.xorshift7 = impl;\n }\n })(\n exports,\n typeof module == \"object\" && module,\n typeof define == \"function\" && define\n );\n }\n});\n\n// node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js\nvar require_xor4096 = __commonJS({\n \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js\"(exports, module) {\n (function(global2, module2, define2) {\n function XorGen(seed) {\n var me = this;\n me.next = function() {\n var w = me.w, X = me.X, i = me.i, t, v;\n me.w = w = w + 1640531527 | 0;\n v = X[i + 34 & 127];\n t = X[i = i + 1 & 127];\n v ^= v << 13;\n t ^= t << 17;\n v ^= v >>> 15;\n t ^= t >>> 12;\n v = X[i] = v ^ t;\n me.i = i;\n return v + (w ^ w >>> 16) | 0;\n };\n function init2(me2, seed2) {\n var t, v, i, j, w, X = [], limit = 128;\n if (seed2 === (seed2 | 0)) {\n v = seed2;\n seed2 = null;\n } else {\n seed2 = seed2 + \"\\0\";\n v = 0;\n limit = Math.max(limit, seed2.length);\n }\n for (i = 0, j = -32; j < limit; ++j) {\n if (seed2)\n v ^= seed2.charCodeAt((j + 32) % seed2.length);\n if (j === 0)\n w = v;\n v ^= v << 10;\n v ^= v >>> 15;\n v ^= v << 4;\n v ^= v >>> 13;\n if (j >= 0) {\n w = w + 1640531527 | 0;\n t = X[j & 127] ^= v + w;\n i = 0 == t ? i + 1 : 0;\n }\n }\n if (i >= 128) {\n X[(seed2 && seed2.length || 0) & 127] = -1;\n }\n i = 127;\n for (j = 4 * 128; j > 0; --j) {\n v = X[i + 34 & 127];\n t = X[i = i + 1 & 127];\n v ^= v << 13;\n t ^= t << 17;\n v ^= v >>> 15;\n t ^= t >>> 12;\n X[i] = v ^ t;\n }\n me2.w = w;\n me2.X = X;\n me2.i = i;\n }\n init2(me, seed);\n }\n function copy(f, t) {\n t.i = f.i;\n t.w = f.w;\n t.X = f.X.slice();\n return t;\n }\n ;\n function impl(seed, opts) {\n if (seed == null)\n seed = +new Date();\n var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n return (xg.next() >>> 0) / 4294967296;\n };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (state.X)\n copy(state, xg);\n prng.state = function() {\n return copy(xg, {});\n };\n }\n return prng;\n }\n if (module2 && module2.exports) {\n module2.exports = impl;\n } else if (define2 && define2.amd) {\n define2(function() {\n return impl;\n });\n } else {\n this.xor4096 = impl;\n }\n })(\n exports,\n typeof module == \"object\" && module,\n typeof define == \"function\" && define\n );\n }\n});\n\n// node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js\nvar require_tychei = __commonJS({\n \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js\"(exports, module) {\n (function(global2, module2, define2) {\n function XorGen(seed) {\n var me = this, strseed = \"\";\n me.next = function() {\n var b = me.b, c = me.c, d = me.d, a = me.a;\n b = b << 25 ^ b >>> 7 ^ c;\n c = c - d | 0;\n d = d << 24 ^ d >>> 8 ^ a;\n a = a - b | 0;\n me.b = b = b << 20 ^ b >>> 12 ^ c;\n me.c = c = c - d | 0;\n me.d = d << 16 ^ c >>> 16 ^ a;\n return me.a = a - b | 0;\n };\n me.a = 0;\n me.b = 0;\n me.c = 2654435769 | 0;\n me.d = 1367130551;\n if (seed === Math.floor(seed)) {\n me.a = seed / 4294967296 | 0;\n me.b = seed | 0;\n } else {\n strseed += seed;\n }\n for (var k = 0; k < strseed.length + 20; k++) {\n me.b ^= strseed.charCodeAt(k) | 0;\n me.next();\n }\n }\n function copy(f, t) {\n t.a = f.a;\n t.b = f.b;\n t.c = f.c;\n t.d = f.d;\n return t;\n }\n ;\n function impl(seed, opts) {\n var xg = new XorGen(seed), state = opts && opts.state, prng = function() {\n return (xg.next() >>> 0) / 4294967296;\n };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof state == \"object\")\n copy(state, xg);\n prng.state = function() {\n return copy(xg, {});\n };\n }\n return prng;\n }\n if (module2 && module2.exports) {\n module2.exports = impl;\n } else if (define2 && define2.amd) {\n define2(function() {\n return impl;\n });\n } else {\n this.tychei = impl;\n }\n })(\n exports,\n typeof module == \"object\" && module,\n typeof define == \"function\" && define\n );\n }\n});\n\n// (disabled):crypto\nvar require_crypto = __commonJS({\n \"(disabled):crypto\"() {\n }\n});\n\n// node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js\nvar require_seedrandom = __commonJS({\n \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js\"(exports, module) {\n (function(global2, pool3, math) {\n 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;\n function seedrandom5(seed, options, callback) {\n var key = [];\n options = options == true ? { entropy: true } : options || {};\n var shortseed = mixkey(flatten4(\n options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed,\n 3\n ), key);\n var arc4 = new ARC4(key);\n var prng = function() {\n var n = arc4.g(chunks), d = startdenom, x = 0;\n while (n < significance) {\n n = (n + x) * width;\n d *= width;\n x = arc4.g(1);\n }\n while (n >= overflow) {\n n /= 2;\n d /= 2;\n x >>>= 1;\n }\n return (n + x) / d;\n };\n prng.int32 = function() {\n return arc4.g(4) | 0;\n };\n prng.quick = function() {\n return arc4.g(4) / 4294967296;\n };\n prng.double = prng;\n mixkey(tostring(arc4.S), pool3);\n return (options.pass || callback || function(prng2, seed2, is_math_call, state) {\n if (state) {\n if (state.S) {\n copy(state, arc4);\n }\n prng2.state = function() {\n return copy(arc4, {});\n };\n }\n if (is_math_call) {\n math[rngname] = prng2;\n return seed2;\n } else\n return prng2;\n })(\n prng,\n shortseed,\n \"global\" in options ? options.global : this == math,\n options.state\n );\n }\n function ARC4(key) {\n var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\n if (!keylen) {\n key = [keylen++];\n }\n while (i < width) {\n s[i] = i++;\n }\n for (i = 0; i < width; i++) {\n s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])];\n s[j] = t;\n }\n (me.g = function(count2) {\n var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S;\n while (count2--) {\n t2 = s2[i2 = mask & i2 + 1];\n r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)];\n }\n me.i = i2;\n me.j = j2;\n return r;\n })(width);\n }\n function copy(f, t) {\n t.i = f.i;\n t.j = f.j;\n t.S = f.S.slice();\n return t;\n }\n ;\n function flatten4(obj, depth) {\n var result = [], typ = typeof obj, prop;\n if (depth && typ == \"object\") {\n for (prop in obj) {\n try {\n result.push(flatten4(obj[prop], depth - 1));\n } catch (e) {\n }\n }\n }\n return result.length ? result : typ == \"string\" ? obj : obj + \"\\0\";\n }\n function mixkey(seed, key) {\n var stringseed = seed + \"\", smear, j = 0;\n while (j < stringseed.length) {\n key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++);\n }\n return tostring(key);\n }\n function autoseed() {\n try {\n var out;\n if (nodecrypto && (out = nodecrypto.randomBytes)) {\n out = out(width);\n } else {\n out = new Uint8Array(width);\n (global2.crypto || global2.msCrypto).getRandomValues(out);\n }\n return tostring(out);\n } catch (e) {\n var browser = global2.navigator, plugins = browser && browser.plugins;\n return [+new Date(), global2, plugins, global2.screen, tostring(pool3)];\n }\n }\n function tostring(a) {\n return String.fromCharCode.apply(0, a);\n }\n mixkey(math.random(), pool3);\n if (typeof module == \"object\" && module.exports) {\n module.exports = seedrandom5;\n try {\n nodecrypto = require_crypto();\n } catch (ex) {\n }\n } else if (typeof define == \"function\" && define.amd) {\n define(function() {\n return seedrandom5;\n });\n } else {\n math[\"seed\" + rngname] = seedrandom5;\n }\n })(\n typeof self !== \"undefined\" ? self : exports,\n [],\n Math\n );\n }\n});\n\n// node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/index.js\nvar require_seedrandom2 = __commonJS({\n \"node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/index.js\"(exports, module) {\n var alea5 = require_alea();\n var xor128 = require_xor128();\n var xorwow = require_xorwow();\n var xorshift7 = require_xorshift7();\n var xor4096 = require_xor4096();\n var tychei = require_tychei();\n var sr = require_seedrandom();\n sr.alea = alea5;\n sr.xor128 = xor128;\n sr.xorwow = xorwow;\n sr.xorshift7 = xorshift7;\n sr.xor4096 = xor4096;\n sr.tychei = tychei;\n module.exports = sr;\n }\n});\n\n// (disabled):node_modules/.pnpm/string_decoder@1.3.0/node_modules/string_decoder/lib/string_decoder.js\nvar require_string_decoder = __commonJS({\n \"(disabled):node_modules/.pnpm/string_decoder@1.3.0/node_modules/string_decoder/lib/string_decoder.js\"() {\n }\n});\n\n// (disabled):fs\nvar require_fs = __commonJS({\n \"(disabled):fs\"() {\n }\n});\n\n// (disabled):path\nvar require_path = __commonJS({\n \"(disabled):path\"() {\n }\n});\n\n// (disabled):worker_threads\nvar require_worker_threads = __commonJS({\n \"(disabled):worker_threads\"() {\n }\n});\n\n// (disabled):perf_hooks\nvar require_perf_hooks = __commonJS({\n \"(disabled):perf_hooks\"() {\n }\n});\n\n// (disabled):os\nvar require_os = __commonJS({\n \"(disabled):os\"() {\n }\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.19.0_hek32lflchivueqv5i4vgonghu/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js\nvar require_tfjs_backend_wasm_threaded_simd = __commonJS({\n \"node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.19.0_hek32lflchivueqv5i4vgonghu/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js\"(exports, module) {\n var WasmBackendModuleThreadedSimd2 = (() => {\n var _scriptDir = typeof document !== \"undefined\" && document.currentScript ? document.currentScript.src : void 0;\n if (typeof __filename !== \"undefined\")\n _scriptDir = _scriptDir || __filename;\n return function(WasmBackendModuleThreadedSimd3) {\n WasmBackendModuleThreadedSimd3 = WasmBackendModuleThreadedSimd3 || {};\n function GROWABLE_HEAP_I8() {\n if (wasmMemory.buffer != buffer2) {\n updateGlobalBufferAndViews(wasmMemory.buffer);\n }\n return HEAP8;\n }\n function GROWABLE_HEAP_U8() {\n if (wasmMemory.buffer != buffer2) {\n updateGlobalBufferAndViews(wasmMemory.buffer);\n }\n return HEAPU8;\n }\n function GROWABLE_HEAP_I16() {\n if (wasmMemory.buffer != buffer2) {\n updateGlobalBufferAndViews(wasmMemory.buffer);\n }\n return HEAP16;\n }\n function GROWABLE_HEAP_U16() {\n if (wasmMemory.buffer != buffer2) {\n updateGlobalBufferAndViews(wasmMemory.buffer);\n }\n return HEAPU16;\n }\n function GROWABLE_HEAP_I32() {\n if (wasmMemory.buffer != buffer2) {\n updateGlobalBufferAndViews(wasmMemory.buffer);\n }\n return HEAP32;\n }\n function GROWABLE_HEAP_F32() {\n if (wasmMemory.buffer != buffer2) {\n updateGlobalBufferAndViews(wasmMemory.buffer);\n }\n return HEAPF32;\n }\n function GROWABLE_HEAP_F64() {\n if (wasmMemory.buffer != buffer2) {\n updateGlobalBufferAndViews(wasmMemory.buffer);\n }\n return HEAPF64;\n }\n var Module = typeof WasmBackendModuleThreadedSimd3 !== \"undefined\" ? WasmBackendModuleThreadedSimd3 : {};\n var readyPromiseResolve, readyPromiseReject;\n Module[\"ready\"] = new Promise(function(resolve, reject) {\n readyPromiseResolve = resolve;\n readyPromiseReject = reject;\n });\n var beforeListeners;\n if (typeof process !== \"undefined\" && process.listeners) {\n beforeListeners = { uncaughtException: process.listeners(\"uncaughtException\"), unhandledRejection: process.listeners(\"unhandledRejection\") };\n }\n var moduleOverrides = Object.assign({}, Module);\n var arguments_ = [];\n var thisProgram = \"./this.program\";\n var quit_ = (status, toThrow) => {\n throw toThrow;\n };\n var ENVIRONMENT_IS_WEB = typeof window === \"object\";\n var ENVIRONMENT_IS_WORKER = typeof importScripts === \"function\";\n var ENVIRONMENT_IS_NODE = typeof process === \"object\" && typeof process.versions === \"object\" && typeof process.versions.node === \"string\";\n var ENVIRONMENT_IS_PTHREAD = Module[\"ENVIRONMENT_IS_PTHREAD\"] || false;\n var scriptDirectory = \"\";\n function locateFile(path) {\n if (Module[\"locateFile\"]) {\n return Module[\"locateFile\"](path, scriptDirectory);\n }\n return scriptDirectory + path;\n }\n var read_, readAsync, readBinary, setWindowTitle;\n function logExceptionOnExit(e) {\n if (e instanceof ExitStatus)\n return;\n let toLog = e;\n err(\"exiting due to exception: \" + toLog);\n }\n var fs;\n var nodePath;\n var requireNodeFS;\n if (ENVIRONMENT_IS_NODE) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = require_path().dirname(scriptDirectory) + \"/\";\n } else {\n scriptDirectory = __dirname + \"/\";\n }\n requireNodeFS = () => {\n if (!nodePath) {\n fs = require_fs();\n nodePath = require_path();\n }\n };\n read_ = function shell_read(filename, binary) {\n requireNodeFS();\n filename = nodePath[\"normalize\"](filename);\n return fs.readFileSync(filename, binary ? void 0 : \"utf8\");\n };\n readBinary = (filename) => {\n var ret = read_(filename, true);\n if (!ret.buffer) {\n ret = new Uint8Array(ret);\n }\n return ret;\n };\n readAsync = (filename, onload, onerror) => {\n requireNodeFS();\n filename = nodePath[\"normalize\"](filename);\n fs.readFile(filename, function(err2, data) {\n if (err2)\n onerror(err2);\n else\n onload(data.buffer);\n });\n };\n if (process[\"argv\"].length > 1) {\n thisProgram = process[\"argv\"][1].replace(/\\\\/g, \"/\");\n }\n arguments_ = process[\"argv\"].slice(2);\n process[\"on\"](\"uncaughtException\", function(ex) {\n if (!(ex instanceof ExitStatus)) {\n throw ex;\n }\n });\n process[\"on\"](\"unhandledRejection\", function(reason) {\n throw reason;\n });\n quit_ = (status, toThrow) => {\n if (keepRuntimeAlive()) {\n process[\"exitCode\"] = status;\n throw toThrow;\n }\n logExceptionOnExit(toThrow);\n process[\"exit\"](status);\n };\n Module[\"inspect\"] = function() {\n return \"[Emscripten Module object]\";\n };\n let nodeWorkerThreads;\n try {\n nodeWorkerThreads = require_worker_threads();\n } catch (e) {\n console.error('The \"worker_threads\" module is not supported in this node.js build - perhaps a newer version is needed?');\n throw e;\n }\n global.Worker = nodeWorkerThreads.Worker;\n } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = self.location.href;\n } else if (typeof document !== \"undefined\" && document.currentScript) {\n scriptDirectory = document.currentScript.src;\n }\n if (typeof _scriptDir !== \"undefined\" && _scriptDir) {\n scriptDirectory = _scriptDir;\n }\n if (scriptDirectory.indexOf(\"blob:\") !== 0) {\n scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, \"\").lastIndexOf(\"/\") + 1);\n } else {\n scriptDirectory = \"\";\n }\n if (!ENVIRONMENT_IS_NODE) {\n read_ = (url) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.send(null);\n return xhr.responseText;\n };\n if (ENVIRONMENT_IS_WORKER) {\n readBinary = (url) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.responseType = \"arraybuffer\";\n xhr.send(null);\n return new Uint8Array(xhr.response);\n };\n }\n readAsync = (url, onload, onerror) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, true);\n xhr.responseType = \"arraybuffer\";\n xhr.onload = () => {\n if (xhr.status == 200 || xhr.status == 0 && xhr.response) {\n onload(xhr.response);\n return;\n }\n onerror();\n };\n xhr.onerror = onerror;\n xhr.send(null);\n };\n }\n setWindowTitle = (title) => document.title = title;\n } else {\n }\n if (ENVIRONMENT_IS_NODE) {\n if (typeof performance === \"undefined\") {\n global.performance = require_perf_hooks().performance;\n }\n }\n var defaultPrint = console.log.bind(console);\n var defaultPrintErr = console.warn.bind(console);\n if (ENVIRONMENT_IS_NODE) {\n requireNodeFS();\n defaultPrint = (str) => fs.writeSync(1, str + \"\\n\");\n defaultPrintErr = (str) => fs.writeSync(2, str + \"\\n\");\n }\n var out = Module[\"print\"] || defaultPrint;\n var err = Module[\"printErr\"] || defaultPrintErr;\n Object.assign(Module, moduleOverrides);\n moduleOverrides = null;\n if (Module[\"arguments\"])\n arguments_ = Module[\"arguments\"];\n if (Module[\"thisProgram\"])\n thisProgram = Module[\"thisProgram\"];\n if (Module[\"quit\"])\n quit_ = Module[\"quit\"];\n var POINTER_SIZE = 4;\n function warnOnce(text) {\n if (!warnOnce.shown)\n warnOnce.shown = {};\n if (!warnOnce.shown[text]) {\n warnOnce.shown[text] = 1;\n err(text);\n }\n }\n function convertJsFunctionToWasm(func2, sig) {\n if (typeof WebAssembly.Function === \"function\") {\n var typeNames = { \"i\": \"i32\", \"j\": \"i64\", \"f\": \"f32\", \"d\": \"f64\" };\n var type = { parameters: [], results: sig[0] == \"v\" ? [] : [typeNames[sig[0]]] };\n for (var i = 1; i < sig.length; ++i) {\n type.parameters.push(typeNames[sig[i]]);\n }\n return new WebAssembly.Function(type, func2);\n }\n var typeSection = [1, 0, 1, 96];\n var sigRet = sig.slice(0, 1);\n var sigParam = sig.slice(1);\n var typeCodes = { \"i\": 127, \"j\": 126, \"f\": 125, \"d\": 124 };\n typeSection.push(sigParam.length);\n for (var i = 0; i < sigParam.length; ++i) {\n typeSection.push(typeCodes[sigParam[i]]);\n }\n if (sigRet == \"v\") {\n typeSection.push(0);\n } else {\n typeSection = typeSection.concat([1, typeCodes[sigRet]]);\n }\n typeSection[1] = typeSection.length - 2;\n var bytes = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0].concat(typeSection, [2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0]));\n var module2 = new WebAssembly.Module(bytes);\n var instance = new WebAssembly.Instance(module2, { \"e\": { \"f\": func2 } });\n var wrappedFunc = instance.exports[\"f\"];\n return wrappedFunc;\n }\n var freeTableIndexes = [];\n var functionsInTableMap;\n function getEmptyTableSlot() {\n if (freeTableIndexes.length) {\n return freeTableIndexes.pop();\n }\n try {\n wasmTable.grow(1);\n } catch (err2) {\n if (!(err2 instanceof RangeError)) {\n throw err2;\n }\n throw \"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.\";\n }\n return wasmTable.length - 1;\n }\n function updateTableMap(offset, count2) {\n for (var i = offset; i < offset + count2; i++) {\n var item = getWasmTableEntry(i);\n if (item) {\n functionsInTableMap.set(item, i);\n }\n }\n }\n var tempRet0 = 0;\n var setTempRet0 = (value) => {\n tempRet0 = value;\n };\n var Atomics_load = Atomics.load;\n var Atomics_store = Atomics.store;\n var Atomics_compareExchange = Atomics.compareExchange;\n var wasmBinary;\n if (Module[\"wasmBinary\"])\n wasmBinary = Module[\"wasmBinary\"];\n var noExitRuntime = Module[\"noExitRuntime\"] || true;\n if (typeof WebAssembly !== \"object\") {\n abort(\"no native wasm support detected\");\n }\n var wasmMemory;\n var wasmModule;\n var ABORT = false;\n var EXITSTATUS;\n function assert3(condition, text) {\n if (!condition) {\n abort(text);\n }\n }\n function getCFunc(ident) {\n var func2 = Module[\"_\" + ident];\n return func2;\n }\n function ccall(ident, returnType, argTypes, args, opts) {\n var toC = { \"string\": function(str) {\n var ret2 = 0;\n if (str !== null && str !== void 0 && str !== 0) {\n var len = (str.length << 2) + 1;\n ret2 = stackAlloc(len);\n stringToUTF8(str, ret2, len);\n }\n return ret2;\n }, \"array\": function(arr) {\n var ret2 = stackAlloc(arr.length);\n writeArrayToMemory(arr, ret2);\n return ret2;\n } };\n function convertReturnValue(ret2) {\n if (returnType === \"string\")\n return UTF8ToString(ret2);\n if (returnType === \"boolean\")\n return Boolean(ret2);\n return ret2;\n }\n var func2 = getCFunc(ident);\n var cArgs = [];\n var stack2 = 0;\n if (args) {\n for (var i = 0; i < args.length; i++) {\n var converter = toC[argTypes[i]];\n if (converter) {\n if (stack2 === 0)\n stack2 = stackSave();\n cArgs[i] = converter(args[i]);\n } else {\n cArgs[i] = args[i];\n }\n }\n }\n var ret = func2.apply(null, cArgs);\n function onDone(ret2) {\n if (stack2 !== 0)\n stackRestore(stack2);\n return convertReturnValue(ret2);\n }\n ret = onDone(ret);\n return ret;\n }\n function cwrap(ident, returnType, argTypes, opts) {\n argTypes = argTypes || [];\n var numericArgs = argTypes.every(function(type) {\n return type === \"number\";\n });\n var numericRet = returnType !== \"string\";\n if (numericRet && numericArgs && !opts) {\n return getCFunc(ident);\n }\n return function() {\n return ccall(ident, returnType, argTypes, arguments, opts);\n };\n }\n var ALLOC_STACK = 1;\n function TextDecoderWrapper(encoding) {\n var textDecoder = new TextDecoder(encoding);\n this.decode = (data) => {\n if (data.buffer instanceof SharedArrayBuffer) {\n data = new Uint8Array(data);\n }\n return textDecoder.decode.call(textDecoder, data);\n };\n }\n var UTF8Decoder = typeof TextDecoder !== \"undefined\" ? new TextDecoderWrapper(\"utf8\") : void 0;\n function UTF8ArrayToString(heap, idx, maxBytesToRead) {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n while (heap[endPtr] && !(endPtr >= endIdx))\n ++endPtr;\n if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {\n return UTF8Decoder.decode(heap.subarray(idx, endPtr));\n } else {\n var str = \"\";\n while (idx < endPtr) {\n var u0 = heap[idx++];\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0);\n continue;\n }\n var u1 = heap[idx++] & 63;\n if ((u0 & 224) == 192) {\n str += String.fromCharCode((u0 & 31) << 6 | u1);\n continue;\n }\n var u2 = heap[idx++] & 63;\n if ((u0 & 240) == 224) {\n u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n } else {\n u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63;\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0);\n } else {\n var ch = u0 - 65536;\n str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n }\n }\n }\n return str;\n }\n function UTF8ToString(ptr, maxBytesToRead) {\n return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : \"\";\n }\n function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\n if (!(maxBytesToWrite > 0))\n return 0;\n var startIdx = outIdx;\n var endIdx = outIdx + maxBytesToWrite - 1;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 55296 && u <= 57343) {\n var u1 = str.charCodeAt(++i);\n u = 65536 + ((u & 1023) << 10) | u1 & 1023;\n }\n if (u <= 127) {\n if (outIdx >= endIdx)\n break;\n heap[outIdx++] = u;\n } else if (u <= 2047) {\n if (outIdx + 1 >= endIdx)\n break;\n heap[outIdx++] = 192 | u >> 6;\n heap[outIdx++] = 128 | u & 63;\n } else if (u <= 65535) {\n if (outIdx + 2 >= endIdx)\n break;\n heap[outIdx++] = 224 | u >> 12;\n heap[outIdx++] = 128 | u >> 6 & 63;\n heap[outIdx++] = 128 | u & 63;\n } else {\n if (outIdx + 3 >= endIdx)\n break;\n heap[outIdx++] = 240 | u >> 18;\n heap[outIdx++] = 128 | u >> 12 & 63;\n heap[outIdx++] = 128 | u >> 6 & 63;\n heap[outIdx++] = 128 | u & 63;\n }\n }\n heap[outIdx] = 0;\n return outIdx - startIdx;\n }\n function stringToUTF8(str, outPtr, maxBytesToWrite) {\n return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite);\n }\n function lengthBytesUTF8(str) {\n var len = 0;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 55296 && u <= 57343)\n u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;\n if (u <= 127)\n ++len;\n else if (u <= 2047)\n len += 2;\n else if (u <= 65535)\n len += 3;\n else\n len += 4;\n }\n return len;\n }\n var UTF16Decoder = typeof TextDecoder !== \"undefined\" ? new TextDecoderWrapper(\"utf-16le\") : void 0;\n function writeArrayToMemory(array2, buffer3) {\n GROWABLE_HEAP_I8().set(array2, buffer3);\n }\n function writeAsciiToMemory(str, buffer3, dontAddNull) {\n for (var i = 0; i < str.length; ++i) {\n GROWABLE_HEAP_I8()[buffer3++ >> 0] = str.charCodeAt(i);\n }\n if (!dontAddNull)\n GROWABLE_HEAP_I8()[buffer3 >> 0] = 0;\n }\n function alignUp(x, multiple) {\n if (x % multiple > 0) {\n x += multiple - x % multiple;\n }\n return x;\n }\n var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n if (ENVIRONMENT_IS_PTHREAD) {\n buffer2 = Module[\"buffer\"];\n }\n function updateGlobalBufferAndViews(buf) {\n buffer2 = buf;\n Module[\"HEAP8\"] = HEAP8 = new Int8Array(buf);\n Module[\"HEAP16\"] = HEAP16 = new Int16Array(buf);\n Module[\"HEAP32\"] = HEAP32 = new Int32Array(buf);\n Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(buf);\n Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(buf);\n Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(buf);\n Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(buf);\n Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(buf);\n }\n var INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 16777216;\n if (ENVIRONMENT_IS_PTHREAD) {\n wasmMemory = Module[\"wasmMemory\"];\n buffer2 = Module[\"buffer\"];\n } else {\n if (Module[\"wasmMemory\"]) {\n wasmMemory = Module[\"wasmMemory\"];\n } else {\n wasmMemory = new WebAssembly.Memory({ \"initial\": INITIAL_MEMORY / 65536, \"maximum\": 2147483648 / 65536, \"shared\": true });\n if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) {\n 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\");\n if (ENVIRONMENT_IS_NODE) {\n console.log(\"(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)\");\n }\n throw Error(\"bad memory\");\n }\n }\n }\n if (wasmMemory) {\n buffer2 = wasmMemory.buffer;\n }\n INITIAL_MEMORY = buffer2.byteLength;\n updateGlobalBufferAndViews(buffer2);\n var wasmTable;\n var __ATPRERUN__ = [];\n var __ATINIT__ = [];\n var __ATEXIT__ = [];\n var __ATPOSTRUN__ = [];\n var runtimeInitialized = false;\n var runtimeExited = false;\n var runtimeKeepaliveCounter = 0;\n function keepRuntimeAlive() {\n return noExitRuntime || runtimeKeepaliveCounter > 0;\n }\n function preRun() {\n if (Module[\"preRun\"]) {\n if (typeof Module[\"preRun\"] == \"function\")\n Module[\"preRun\"] = [Module[\"preRun\"]];\n while (Module[\"preRun\"].length) {\n addOnPreRun(Module[\"preRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPRERUN__);\n }\n function initRuntime() {\n runtimeInitialized = true;\n if (ENVIRONMENT_IS_PTHREAD)\n return;\n callRuntimeCallbacks(__ATINIT__);\n }\n function exitRuntime() {\n if (ENVIRONMENT_IS_PTHREAD)\n return;\n PThread.terminateAllThreads();\n runtimeExited = true;\n }\n function postRun() {\n if (ENVIRONMENT_IS_PTHREAD)\n return;\n if (Module[\"postRun\"]) {\n if (typeof Module[\"postRun\"] == \"function\")\n Module[\"postRun\"] = [Module[\"postRun\"]];\n while (Module[\"postRun\"].length) {\n addOnPostRun(Module[\"postRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPOSTRUN__);\n }\n function addOnPreRun(cb) {\n __ATPRERUN__.unshift(cb);\n }\n function addOnInit(cb) {\n __ATINIT__.unshift(cb);\n }\n function addOnPostRun(cb) {\n __ATPOSTRUN__.unshift(cb);\n }\n var runDependencies = 0;\n var runDependencyWatcher = null;\n var dependenciesFulfilled = null;\n function addRunDependency(id) {\n runDependencies++;\n if (Module[\"monitorRunDependencies\"]) {\n Module[\"monitorRunDependencies\"](runDependencies);\n }\n }\n function removeRunDependency(id) {\n runDependencies--;\n if (Module[\"monitorRunDependencies\"]) {\n Module[\"monitorRunDependencies\"](runDependencies);\n }\n if (runDependencies == 0) {\n if (runDependencyWatcher !== null) {\n clearInterval(runDependencyWatcher);\n runDependencyWatcher = null;\n }\n if (dependenciesFulfilled) {\n var callback = dependenciesFulfilled;\n dependenciesFulfilled = null;\n callback();\n }\n }\n }\n Module[\"preloadedImages\"] = {};\n Module[\"preloadedAudios\"] = {};\n function abort(what) {\n if (ENVIRONMENT_IS_PTHREAD) {\n postMessage({ \"cmd\": \"onAbort\", \"arg\": what });\n } else {\n if (Module[\"onAbort\"]) {\n Module[\"onAbort\"](what);\n }\n }\n what = \"Aborted(\" + what + \")\";\n err(what);\n ABORT = true;\n EXITSTATUS = 1;\n what += \". Build with -s ASSERTIONS=1 for more info.\";\n var e = new WebAssembly.RuntimeError(what);\n readyPromiseReject(e);\n throw e;\n }\n var dataURIPrefix = \"data:application/octet-stream;base64,\";\n function isDataURI(filename) {\n return filename.startsWith(dataURIPrefix);\n }\n function isFileURI(filename) {\n return filename.startsWith(\"file://\");\n }\n var wasmBinaryFile;\n wasmBinaryFile = \"tfjs-backend-wasm-threaded-simd.wasm\";\n if (!isDataURI(wasmBinaryFile)) {\n wasmBinaryFile = locateFile(wasmBinaryFile);\n }\n function getBinary(file) {\n try {\n if (file == wasmBinaryFile && wasmBinary) {\n return new Uint8Array(wasmBinary);\n }\n if (readBinary) {\n return readBinary(file);\n } else {\n throw \"both async and sync fetching of the wasm failed\";\n }\n } catch (err2) {\n abort(err2);\n }\n }\n function getBinaryPromise() {\n if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\n if (typeof fetch === \"function\" && !isFileURI(wasmBinaryFile)) {\n return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(function(response) {\n if (!response[\"ok\"]) {\n throw \"failed to load wasm binary file at '\" + wasmBinaryFile + \"'\";\n }\n return response[\"arrayBuffer\"]();\n }).catch(function() {\n return getBinary(wasmBinaryFile);\n });\n } else {\n if (readAsync) {\n return new Promise(function(resolve, reject) {\n readAsync(wasmBinaryFile, function(response) {\n resolve(new Uint8Array(response));\n }, reject);\n });\n }\n }\n }\n return Promise.resolve().then(function() {\n return getBinary(wasmBinaryFile);\n });\n }\n function createWasm() {\n var info = { \"env\": asmLibraryArg, \"wasi_snapshot_preview1\": asmLibraryArg };\n function receiveInstance(instance, module2) {\n var exports3 = instance.exports;\n Module[\"asm\"] = exports3;\n registerTlsInit(Module[\"asm\"][\"emscripten_tls_init\"]);\n wasmTable = Module[\"asm\"][\"__indirect_function_table\"];\n addOnInit(Module[\"asm\"][\"__wasm_call_ctors\"]);\n wasmModule = module2;\n if (!ENVIRONMENT_IS_PTHREAD) {\n var numWorkersToLoad = PThread.unusedWorkers.length;\n PThread.unusedWorkers.forEach(function(w) {\n PThread.loadWasmModuleToWorker(w, function() {\n if (!--numWorkersToLoad)\n removeRunDependency(\"wasm-instantiate\");\n });\n });\n }\n }\n if (!ENVIRONMENT_IS_PTHREAD) {\n addRunDependency(\"wasm-instantiate\");\n }\n function receiveInstantiationResult(result) {\n receiveInstance(result[\"instance\"], result[\"module\"]);\n }\n function instantiateArrayBuffer(receiver) {\n return getBinaryPromise().then(function(binary) {\n return WebAssembly.instantiate(binary, info);\n }).then(function(instance) {\n return instance;\n }).then(receiver, function(reason) {\n err(\"failed to asynchronously prepare wasm: \" + reason);\n abort(reason);\n });\n }\n function instantiateAsync() {\n if (!wasmBinary && typeof WebAssembly.instantiateStreaming === \"function\" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === \"function\") {\n return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(function(response) {\n var result = WebAssembly.instantiateStreaming(response, info);\n return result.then(receiveInstantiationResult, function(reason) {\n err(\"wasm streaming compile failed: \" + reason);\n err(\"falling back to ArrayBuffer instantiation\");\n return instantiateArrayBuffer(receiveInstantiationResult);\n });\n });\n } else {\n return instantiateArrayBuffer(receiveInstantiationResult);\n }\n }\n if (Module[\"instantiateWasm\"]) {\n try {\n var exports2 = Module[\"instantiateWasm\"](info, receiveInstance);\n return exports2;\n } catch (e) {\n err(\"Module.instantiateWasm callback failed with error: \" + e);\n return false;\n }\n }\n instantiateAsync().catch(readyPromiseReject);\n return {};\n }\n var tempDouble;\n var tempI64;\n var ASM_CONSTS = {};\n function callRuntimeCallbacks(callbacks2) {\n while (callbacks2.length > 0) {\n var callback = callbacks2.shift();\n if (typeof callback == \"function\") {\n callback(Module);\n continue;\n }\n var func2 = callback.func;\n if (typeof func2 === \"number\") {\n if (callback.arg === void 0) {\n getWasmTableEntry(func2)();\n } else {\n getWasmTableEntry(func2)(callback.arg);\n }\n } else {\n func2(callback.arg === void 0 ? null : callback.arg);\n }\n }\n }\n function withStackSave(f) {\n var stack2 = stackSave();\n var ret = f();\n stackRestore(stack2);\n return ret;\n }\n function demangle(func2) {\n return func2;\n }\n function demangleAll(text) {\n var regex = /\\b_Z[\\w\\d_]+/g;\n return text.replace(regex, function(x) {\n var y = demangle(x);\n return x === y ? x : y + \" [\" + x + \"]\";\n });\n }\n function killThread(pthread_ptr) {\n GROWABLE_HEAP_I32()[pthread_ptr >> 2] = 0;\n var pthread = PThread.pthreads[pthread_ptr];\n delete PThread.pthreads[pthread_ptr];\n pthread.worker.terminate();\n __emscripten_thread_free_data(pthread_ptr);\n PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1);\n pthread.worker.pthread = void 0;\n }\n function cancelThread(pthread_ptr) {\n var pthread = PThread.pthreads[pthread_ptr];\n pthread.worker.postMessage({ \"cmd\": \"cancel\" });\n }\n function cleanupThread(pthread_ptr) {\n var pthread = PThread.pthreads[pthread_ptr];\n if (pthread) {\n GROWABLE_HEAP_I32()[pthread_ptr >> 2] = 0;\n var worker = pthread.worker;\n PThread.returnWorkerToPool(worker);\n }\n }\n function _exit(status) {\n exit(status);\n }\n function handleException(e) {\n if (e instanceof ExitStatus || e == \"unwind\") {\n return EXITSTATUS;\n }\n quit_(1, e);\n }\n var PThread = { unusedWorkers: [], runningWorkers: [], tlsInitFunctions: [], init: function() {\n if (ENVIRONMENT_IS_PTHREAD) {\n PThread.initWorker();\n } else {\n PThread.initMainThread();\n }\n }, initMainThread: function() {\n var pthreadPoolSize = 8;\n for (var i = 0; i < pthreadPoolSize; ++i) {\n PThread.allocateUnusedWorker();\n }\n }, initWorker: function() {\n noExitRuntime = false;\n }, pthreads: {}, setExitStatus: function(status) {\n EXITSTATUS = status;\n }, terminateAllThreads: function() {\n for (var t in PThread.pthreads) {\n var pthread = PThread.pthreads[t];\n if (pthread && pthread.worker) {\n PThread.returnWorkerToPool(pthread.worker);\n }\n }\n for (var i = 0; i < PThread.unusedWorkers.length; ++i) {\n var worker = PThread.unusedWorkers[i];\n worker.terminate();\n }\n PThread.unusedWorkers = [];\n }, returnWorkerToPool: function(worker) {\n PThread.runWithoutMainThreadQueuedCalls(function() {\n delete PThread.pthreads[worker.pthread.threadInfoStruct];\n PThread.unusedWorkers.push(worker);\n PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1);\n __emscripten_thread_free_data(worker.pthread.threadInfoStruct);\n worker.pthread = void 0;\n });\n }, runWithoutMainThreadQueuedCalls: function(func2) {\n GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0;\n try {\n func2();\n } finally {\n GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1;\n }\n }, receiveObjectTransfer: function(data) {\n }, threadInit: function() {\n for (var i in PThread.tlsInitFunctions) {\n PThread.tlsInitFunctions[i]();\n }\n }, loadWasmModuleToWorker: function(worker, onFinishedLoading) {\n worker.onmessage = (e) => {\n var d = e[\"data\"];\n var cmd = d[\"cmd\"];\n if (worker.pthread)\n PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct;\n if (d[\"targetThread\"] && d[\"targetThread\"] != _pthread_self()) {\n var thread = PThread.pthreads[d.targetThread];\n if (thread) {\n thread.worker.postMessage(d, d[\"transferList\"]);\n } else {\n err('Internal error! Worker sent a message \"' + cmd + '\" to target pthread ' + d[\"targetThread\"] + \", but that thread no longer exists!\");\n }\n PThread.currentProxiedOperationCallerThread = void 0;\n return;\n }\n if (cmd === \"processQueuedMainThreadWork\") {\n _emscripten_main_thread_process_queued_calls();\n } else if (cmd === \"spawnThread\") {\n spawnThread(d);\n } else if (cmd === \"cleanupThread\") {\n cleanupThread(d[\"thread\"]);\n } else if (cmd === \"killThread\") {\n killThread(d[\"thread\"]);\n } else if (cmd === \"cancelThread\") {\n cancelThread(d[\"thread\"]);\n } else if (cmd === \"loaded\") {\n worker.loaded = true;\n if (onFinishedLoading)\n onFinishedLoading(worker);\n if (worker.runPthread) {\n worker.runPthread();\n delete worker.runPthread;\n }\n } else if (cmd === \"print\") {\n out(\"Thread \" + d[\"threadId\"] + \": \" + d[\"text\"]);\n } else if (cmd === \"printErr\") {\n err(\"Thread \" + d[\"threadId\"] + \": \" + d[\"text\"]);\n } else if (cmd === \"alert\") {\n alert(\"Thread \" + d[\"threadId\"] + \": \" + d[\"text\"]);\n } else if (d.target === \"setimmediate\") {\n worker.postMessage(d);\n } else if (cmd === \"onAbort\") {\n if (Module[\"onAbort\"]) {\n Module[\"onAbort\"](d[\"arg\"]);\n }\n } else {\n err(\"worker sent an unknown command \" + cmd);\n }\n PThread.currentProxiedOperationCallerThread = void 0;\n };\n worker.onerror = (e) => {\n var message = \"worker sent an error!\";\n err(message + \" \" + e.filename + \":\" + e.lineno + \": \" + e.message);\n throw e;\n };\n if (ENVIRONMENT_IS_NODE) {\n worker.on(\"message\", function(data) {\n worker.onmessage({ data });\n });\n worker.on(\"error\", function(e) {\n worker.onerror(e);\n });\n worker.on(\"detachedExit\", function() {\n });\n }\n worker.postMessage({ \"cmd\": \"load\", \"urlOrBlob\": Module[\"mainScriptUrlOrBlob\"] || _scriptDir, \"wasmMemory\": wasmMemory, \"wasmModule\": wasmModule });\n }, allocateUnusedWorker: function() {\n var pthreadMainJs = locateFile(\"tfjs-backend-wasm-threaded-simd.worker.js\");\n PThread.unusedWorkers.push(new Worker(pthreadMainJs));\n }, getNewWorker: function() {\n if (PThread.unusedWorkers.length == 0) {\n PThread.allocateUnusedWorker();\n PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]);\n }\n return PThread.unusedWorkers.pop();\n } };\n function establishStackSpace() {\n var pthread_ptr = _pthread_self();\n var stackTop = GROWABLE_HEAP_I32()[pthread_ptr + 44 >> 2];\n var stackSize = GROWABLE_HEAP_I32()[pthread_ptr + 48 >> 2];\n var stackMax = stackTop - stackSize;\n _emscripten_stack_set_limits(stackTop, stackMax);\n stackRestore(stackTop);\n }\n Module[\"establishStackSpace\"] = establishStackSpace;\n function exitOnMainThread(returnCode) {\n if (ENVIRONMENT_IS_PTHREAD)\n return _emscripten_proxy_to_main_thread_js(1, 0, returnCode);\n try {\n _exit(returnCode);\n } catch (e) {\n handleException(e);\n }\n }\n var wasmTableMirror = [];\n function getWasmTableEntry(funcPtr) {\n var func2 = wasmTableMirror[funcPtr];\n if (!func2) {\n if (funcPtr >= wasmTableMirror.length)\n wasmTableMirror.length = funcPtr + 1;\n wasmTableMirror[funcPtr] = func2 = wasmTable.get(funcPtr);\n }\n return func2;\n }\n function invokeEntryPoint(ptr, arg) {\n return getWasmTableEntry(ptr)(arg);\n }\n Module[\"invokeEntryPoint\"] = invokeEntryPoint;\n function jsStackTrace() {\n var error = new Error();\n if (!error.stack) {\n try {\n throw new Error();\n } catch (e) {\n error = e;\n }\n if (!error.stack) {\n return \"(no stack trace available)\";\n }\n }\n return error.stack.toString();\n }\n function registerTlsInit(tlsInitFunc, moduleExports, metadata) {\n PThread.tlsInitFunctions.push(tlsInitFunc);\n }\n function setWasmTableEntry(idx, func2) {\n wasmTable.set(idx, func2);\n wasmTableMirror[idx] = func2;\n }\n var _emscripten_get_now;\n if (ENVIRONMENT_IS_NODE) {\n _emscripten_get_now = () => {\n var t = process[\"hrtime\"]();\n return t[0] * 1e3 + t[1] / 1e6;\n };\n } else if (ENVIRONMENT_IS_PTHREAD) {\n _emscripten_get_now = () => performance.now() - Module[\"__performance_now_clock_drift\"];\n } else\n _emscripten_get_now = () => performance.now();\n var _emscripten_get_now_is_monotonic = true;\n function setErrNo(value) {\n GROWABLE_HEAP_I32()[___errno_location() >> 2] = value;\n return value;\n }\n function _clock_gettime(clk_id, tp) {\n var now2;\n if (clk_id === 0) {\n now2 = Date.now();\n } else if ((clk_id === 1 || clk_id === 4) && _emscripten_get_now_is_monotonic) {\n now2 = _emscripten_get_now();\n } else {\n setErrNo(28);\n return -1;\n }\n GROWABLE_HEAP_I32()[tp >> 2] = now2 / 1e3 | 0;\n GROWABLE_HEAP_I32()[tp + 4 >> 2] = now2 % 1e3 * 1e3 * 1e3 | 0;\n return 0;\n }\n function ___clock_gettime(a0, a12) {\n return _clock_gettime(a0, a12);\n }\n function ___emscripten_init_main_thread_js(tb) {\n __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1, !ENVIRONMENT_IS_WEB);\n PThread.threadInit();\n }\n function ___emscripten_thread_cleanup(thread) {\n if (!ENVIRONMENT_IS_PTHREAD)\n cleanupThread(thread);\n else\n postMessage({ \"cmd\": \"cleanupThread\", \"thread\": thread });\n }\n function spawnThread(threadParams) {\n var worker = PThread.getNewWorker();\n if (!worker) {\n return 6;\n }\n PThread.runningWorkers.push(worker);\n var pthread = PThread.pthreads[threadParams.pthread_ptr] = { worker, threadInfoStruct: threadParams.pthread_ptr };\n worker.pthread = pthread;\n var msg = { \"cmd\": \"run\", \"start_routine\": threadParams.startRoutine, \"arg\": threadParams.arg, \"threadInfoStruct\": threadParams.pthread_ptr };\n worker.runPthread = () => {\n msg.time = performance.now();\n worker.postMessage(msg, threadParams.transferList);\n };\n if (worker.loaded) {\n worker.runPthread();\n delete worker.runPthread;\n }\n return 0;\n }\n function ___pthread_create_js(pthread_ptr, attr, start_routine, arg) {\n if (typeof SharedArrayBuffer === \"undefined\") {\n err(\"Current environment does not support SharedArrayBuffer, pthreads are not available!\");\n return 6;\n }\n var transferList = [];\n var error = 0;\n if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) {\n return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg);\n }\n if (error)\n return error;\n var threadParams = { startRoutine: start_routine, pthread_ptr, arg, transferList };\n if (ENVIRONMENT_IS_PTHREAD) {\n threadParams.cmd = \"spawnThread\";\n postMessage(threadParams, transferList);\n return 0;\n }\n return spawnThread(threadParams);\n }\n function __emscripten_default_pthread_stack_size() {\n return 2097152;\n }\n function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) {\n if (targetThreadId == mainThreadId) {\n postMessage({ \"cmd\": \"processQueuedMainThreadWork\" });\n } else if (ENVIRONMENT_IS_PTHREAD) {\n postMessage({ \"targetThread\": targetThreadId, \"cmd\": \"processThreadQueue\" });\n } else {\n var pthread = PThread.pthreads[targetThreadId];\n var worker = pthread && pthread.worker;\n if (!worker) {\n return;\n }\n worker.postMessage({ \"cmd\": \"processThreadQueue\" });\n }\n return 1;\n }\n function _abort() {\n abort(\"\");\n }\n function _emscripten_check_blocking_allowed() {\n if (ENVIRONMENT_IS_NODE)\n return;\n if (ENVIRONMENT_IS_WORKER)\n return;\n warnOnce(\"Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread\");\n }\n function _emscripten_get_heap_max() {\n return 2147483648;\n }\n function _emscripten_memcpy_big(dest, src, num) {\n GROWABLE_HEAP_U8().copyWithin(dest, src, src + num);\n }\n function _emscripten_num_logical_cores() {\n if (ENVIRONMENT_IS_NODE)\n return require_os().cpus().length;\n return navigator[\"hardwareConcurrency\"];\n }\n function _emscripten_proxy_to_main_thread_js(index, sync) {\n var numCallArgs = arguments.length - 2;\n var outerArgs = arguments;\n return withStackSave(function() {\n var serializedNumCallArgs = numCallArgs;\n var args = stackAlloc(serializedNumCallArgs * 8);\n var b = args >> 3;\n for (var i = 0; i < numCallArgs; i++) {\n var arg = outerArgs[2 + i];\n GROWABLE_HEAP_F64()[b + i] = arg;\n }\n return _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync);\n });\n }\n var _emscripten_receive_on_main_thread_js_callArgs = [];\n function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) {\n _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs;\n var b = args >> 3;\n for (var i = 0; i < numCallArgs; i++) {\n _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i];\n }\n var isEmAsmConst = index < 0;\n var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1];\n return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs);\n }\n function emscripten_realloc_buffer(size) {\n try {\n wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16);\n updateGlobalBufferAndViews(wasmMemory.buffer);\n return 1;\n } catch (e) {\n }\n }\n function _emscripten_resize_heap(requestedSize) {\n var oldSize = GROWABLE_HEAP_U8().length;\n requestedSize = requestedSize >>> 0;\n if (requestedSize <= oldSize) {\n return false;\n }\n var maxHeapSize = _emscripten_get_heap_max();\n if (requestedSize > maxHeapSize) {\n return false;\n }\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\n var replacement = emscripten_realloc_buffer(newSize);\n if (replacement) {\n return true;\n }\n }\n return false;\n }\n var JSEvents = { inEventHandler: 0, removeAllEventListeners: function() {\n for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) {\n JSEvents._removeHandler(i);\n }\n JSEvents.eventHandlers = [];\n JSEvents.deferredCalls = [];\n }, registerRemoveEventListeners: function() {\n if (!JSEvents.removeEventListenersRegistered) {\n __ATEXIT__.push(JSEvents.removeAllEventListeners);\n JSEvents.removeEventListenersRegistered = true;\n }\n }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) {\n function arraysHaveEqualContent(arrA, arrB) {\n if (arrA.length != arrB.length)\n return false;\n for (var i2 in arrA) {\n if (arrA[i2] != arrB[i2])\n return false;\n }\n return true;\n }\n for (var i in JSEvents.deferredCalls) {\n var call = JSEvents.deferredCalls[i];\n if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) {\n return;\n }\n }\n JSEvents.deferredCalls.push({ targetFunction, precedence, argsList });\n JSEvents.deferredCalls.sort(function(x, y) {\n return x.precedence < y.precedence;\n });\n }, removeDeferredCalls: function(targetFunction) {\n for (var i = 0; i < JSEvents.deferredCalls.length; ++i) {\n if (JSEvents.deferredCalls[i].targetFunction == targetFunction) {\n JSEvents.deferredCalls.splice(i, 1);\n --i;\n }\n }\n }, canPerformEventHandlerRequests: function() {\n return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls;\n }, runDeferredCalls: function() {\n if (!JSEvents.canPerformEventHandlerRequests()) {\n return;\n }\n for (var i = 0; i < JSEvents.deferredCalls.length; ++i) {\n var call = JSEvents.deferredCalls[i];\n JSEvents.deferredCalls.splice(i, 1);\n --i;\n call.targetFunction.apply(null, call.argsList);\n }\n }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) {\n for (var i = 0; i < JSEvents.eventHandlers.length; ++i) {\n if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) {\n JSEvents._removeHandler(i--);\n }\n }\n }, _removeHandler: function(i) {\n var h = JSEvents.eventHandlers[i];\n h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture);\n JSEvents.eventHandlers.splice(i, 1);\n }, registerOrRemoveHandler: function(eventHandler) {\n var jsEventHandler = function jsEventHandler2(event) {\n ++JSEvents.inEventHandler;\n JSEvents.currentEventHandler = eventHandler;\n JSEvents.runDeferredCalls();\n eventHandler.handlerFunc(event);\n JSEvents.runDeferredCalls();\n --JSEvents.inEventHandler;\n };\n if (eventHandler.callbackfunc) {\n eventHandler.eventListenerFunc = jsEventHandler;\n eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture);\n JSEvents.eventHandlers.push(eventHandler);\n JSEvents.registerRemoveEventListeners();\n } else {\n for (var i = 0; i < JSEvents.eventHandlers.length; ++i) {\n if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) {\n JSEvents._removeHandler(i--);\n }\n }\n }\n }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) {\n withStackSave(function() {\n var varargs = stackAlloc(12);\n GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId;\n GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData;\n GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData;\n _emscripten_dispatch_to_thread_(targetThread, 637534208, eventHandlerFunc, eventData, varargs);\n });\n }, getTargetThreadForEventCallback: function(targetThread) {\n switch (targetThread) {\n case 1:\n return 0;\n case 2:\n return PThread.currentProxiedOperationCallerThread;\n default:\n return targetThread;\n }\n }, getNodeNameForTarget: function(target) {\n if (!target)\n return \"\";\n if (target == window)\n return \"#window\";\n if (target == screen)\n return \"#screen\";\n return target && target.nodeName ? target.nodeName : \"\";\n }, fullscreenEnabled: function() {\n return document.fullscreenEnabled || document.webkitFullscreenEnabled;\n } };\n function stringToNewUTF8(jsString) {\n var length = lengthBytesUTF8(jsString) + 1;\n var cString = _malloc(length);\n stringToUTF8(jsString, cString, length);\n return cString;\n }\n function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) {\n withStackSave(function() {\n var varargs = stackAlloc(12);\n var targetCanvasPtr = 0;\n if (targetCanvas) {\n targetCanvasPtr = stringToNewUTF8(targetCanvas);\n }\n GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr;\n GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width;\n GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height;\n _emscripten_dispatch_to_thread_(targetThread, 657457152, 0, targetCanvasPtr, varargs);\n });\n }\n function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) {\n targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : \"\";\n _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height);\n }\n function maybeCStringToJsString(cString) {\n return cString > 2 ? UTF8ToString(cString) : cString;\n }\n var specialHTMLTargets = [0, typeof document !== \"undefined\" ? document : 0, typeof window !== \"undefined\" ? window : 0];\n function findEventTarget(target) {\n target = maybeCStringToJsString(target);\n var domElement = specialHTMLTargets[target] || (typeof document !== \"undefined\" ? document.querySelector(target) : void 0);\n return domElement;\n }\n function findCanvasEventTarget(target) {\n return findEventTarget(target);\n }\n function _emscripten_set_canvas_element_size_calling_thread(target, width, height) {\n var canvas = findCanvasEventTarget(target);\n if (!canvas)\n return -4;\n if (canvas.canvasSharedPtr) {\n GROWABLE_HEAP_I32()[canvas.canvasSharedPtr >> 2] = width;\n GROWABLE_HEAP_I32()[canvas.canvasSharedPtr + 4 >> 2] = height;\n }\n if (canvas.offscreenCanvas || !canvas.controlTransferredOffscreen) {\n if (canvas.offscreenCanvas)\n canvas = canvas.offscreenCanvas;\n var autoResizeViewport = false;\n if (canvas.GLctxObject && canvas.GLctxObject.GLctx) {\n var prevViewport = canvas.GLctxObject.GLctx.getParameter(2978);\n autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas.width && prevViewport[3] === canvas.height;\n }\n canvas.width = width;\n canvas.height = height;\n if (autoResizeViewport) {\n canvas.GLctxObject.GLctx.viewport(0, 0, width, height);\n }\n } else if (canvas.canvasSharedPtr) {\n var targetThread = GROWABLE_HEAP_I32()[canvas.canvasSharedPtr + 8 >> 2];\n _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height);\n return 1;\n } else {\n return -4;\n }\n return 0;\n }\n function _emscripten_set_canvas_element_size_main_thread(target, width, height) {\n if (ENVIRONMENT_IS_PTHREAD)\n return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height);\n return _emscripten_set_canvas_element_size_calling_thread(target, width, height);\n }\n function _emscripten_set_canvas_element_size(target, width, height) {\n var canvas = findCanvasEventTarget(target);\n if (canvas) {\n return _emscripten_set_canvas_element_size_calling_thread(target, width, height);\n } else {\n return _emscripten_set_canvas_element_size_main_thread(target, width, height);\n }\n }\n function _emscripten_unwind_to_js_event_loop() {\n throw \"unwind\";\n }\n function __webgl_enable_ANGLE_instanced_arrays(ctx) {\n var ext = ctx.getExtension(\"ANGLE_instanced_arrays\");\n if (ext) {\n ctx[\"vertexAttribDivisor\"] = function(index, divisor) {\n ext[\"vertexAttribDivisorANGLE\"](index, divisor);\n };\n ctx[\"drawArraysInstanced\"] = function(mode, first, count2, primcount) {\n ext[\"drawArraysInstancedANGLE\"](mode, first, count2, primcount);\n };\n ctx[\"drawElementsInstanced\"] = function(mode, count2, type, indices, primcount) {\n ext[\"drawElementsInstancedANGLE\"](mode, count2, type, indices, primcount);\n };\n return 1;\n }\n }\n function __webgl_enable_OES_vertex_array_object(ctx) {\n var ext = ctx.getExtension(\"OES_vertex_array_object\");\n if (ext) {\n ctx[\"createVertexArray\"] = function() {\n return ext[\"createVertexArrayOES\"]();\n };\n ctx[\"deleteVertexArray\"] = function(vao) {\n ext[\"deleteVertexArrayOES\"](vao);\n };\n ctx[\"bindVertexArray\"] = function(vao) {\n ext[\"bindVertexArrayOES\"](vao);\n };\n ctx[\"isVertexArray\"] = function(vao) {\n return ext[\"isVertexArrayOES\"](vao);\n };\n return 1;\n }\n }\n function __webgl_enable_WEBGL_draw_buffers(ctx) {\n var ext = ctx.getExtension(\"WEBGL_draw_buffers\");\n if (ext) {\n ctx[\"drawBuffers\"] = function(n, bufs) {\n ext[\"drawBuffersWEBGL\"](n, bufs);\n };\n return 1;\n }\n }\n function __webgl_enable_WEBGL_multi_draw(ctx) {\n return !!(ctx.multiDrawWebgl = ctx.getExtension(\"WEBGL_multi_draw\"));\n }\n var GL = { counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, queries: [], stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) {\n if (!GL.lastError) {\n GL.lastError = errorCode;\n }\n }, getNewId: function(table) {\n var ret = GL.counter++;\n for (var i = table.length; i < ret; i++) {\n table[i] = null;\n }\n return ret;\n }, getSource: function(shader, count2, string2, length) {\n var source = \"\";\n for (var i = 0; i < count2; ++i) {\n var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1;\n source += UTF8ToString(GROWABLE_HEAP_I32()[string2 + i * 4 >> 2], len < 0 ? void 0 : len);\n }\n return source;\n }, createContext: function(canvas, webGLContextAttributes) {\n if (!canvas.getContextSafariWebGL2Fixed) {\n canvas.getContextSafariWebGL2Fixed = canvas.getContext;\n canvas.getContext = function(ver, attrs) {\n var gl = canvas.getContextSafariWebGL2Fixed(ver, attrs);\n return ver == \"webgl\" == gl instanceof WebGLRenderingContext ? gl : null;\n };\n }\n var ctx = canvas.getContext(\"webgl\", webGLContextAttributes);\n if (!ctx)\n return 0;\n var handle = GL.registerContext(ctx, webGLContextAttributes);\n return handle;\n }, registerContext: function(ctx, webGLContextAttributes) {\n var handle = _malloc(8);\n GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self();\n var context = { handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx };\n if (ctx.canvas)\n ctx.canvas.GLctxObject = context;\n GL.contexts[handle] = context;\n if (typeof webGLContextAttributes.enableExtensionsByDefault === \"undefined\" || webGLContextAttributes.enableExtensionsByDefault) {\n GL.initExtensions(context);\n }\n return handle;\n }, makeContextCurrent: function(contextHandle) {\n GL.currentContext = GL.contexts[contextHandle];\n Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx;\n return !(contextHandle && !GLctx);\n }, getContext: function(contextHandle) {\n return GL.contexts[contextHandle];\n }, deleteContext: function(contextHandle) {\n if (GL.currentContext === GL.contexts[contextHandle])\n GL.currentContext = null;\n if (typeof JSEvents === \"object\")\n JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);\n if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas)\n GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0;\n _free(GL.contexts[contextHandle].handle);\n GL.contexts[contextHandle] = null;\n }, initExtensions: function(context) {\n if (!context)\n context = GL.currentContext;\n if (context.initExtensionsDone)\n return;\n context.initExtensionsDone = true;\n var GLctx2 = context.GLctx;\n __webgl_enable_ANGLE_instanced_arrays(GLctx2);\n __webgl_enable_OES_vertex_array_object(GLctx2);\n __webgl_enable_WEBGL_draw_buffers(GLctx2);\n {\n GLctx2.disjointTimerQueryExt = GLctx2.getExtension(\"EXT_disjoint_timer_query\");\n }\n __webgl_enable_WEBGL_multi_draw(GLctx2);\n var exts = GLctx2.getSupportedExtensions() || [];\n exts.forEach(function(ext) {\n if (!ext.includes(\"lose_context\") && !ext.includes(\"debug\")) {\n GLctx2.getExtension(ext);\n }\n });\n } };\n var __emscripten_webgl_power_preferences = [\"default\", \"low-power\", \"high-performance\"];\n function _emscripten_webgl_do_create_context(target, attributes) {\n var a = attributes >> 2;\n var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)];\n 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)] };\n var canvas = findCanvasEventTarget(target);\n if (!canvas) {\n return 0;\n }\n if (contextAttributes.explicitSwapControl) {\n return 0;\n }\n var contextHandle = GL.createContext(canvas, contextAttributes);\n return contextHandle;\n }\n function _emscripten_webgl_create_context(a0, a12) {\n return _emscripten_webgl_do_create_context(a0, a12);\n }\n var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) {\n var buffer3 = SYSCALLS.buffers[stream];\n if (curr === 0 || curr === 10) {\n (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0));\n buffer3.length = 0;\n } else {\n buffer3.push(curr);\n }\n }, varargs: void 0, get: function() {\n SYSCALLS.varargs += 4;\n var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2];\n return ret;\n }, getStr: function(ptr) {\n var ret = UTF8ToString(ptr);\n return ret;\n }, get64: function(low, high) {\n return low;\n } };\n function _fd_close(fd) {\n if (ENVIRONMENT_IS_PTHREAD)\n return _emscripten_proxy_to_main_thread_js(3, 1, fd);\n return 0;\n }\n function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n if (ENVIRONMENT_IS_PTHREAD)\n return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset);\n }\n function _fd_write(fd, iov, iovcnt, pnum) {\n if (ENVIRONMENT_IS_PTHREAD)\n return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum);\n var num = 0;\n for (var i = 0; i < iovcnt; i++) {\n var ptr = GROWABLE_HEAP_I32()[iov >> 2];\n var len = GROWABLE_HEAP_I32()[iov + 4 >> 2];\n iov += 8;\n for (var j = 0; j < len; j++) {\n SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]);\n }\n num += len;\n }\n GROWABLE_HEAP_I32()[pnum >> 2] = num;\n return 0;\n }\n function _setTempRet0(val) {\n setTempRet0(val);\n }\n PThread.init();\n var GLctx;\n var proxiedFunctionTable = [null, exitOnMainThread, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write];\n var ASSERTIONS = false;\n var asmLibraryArg = { \"__clock_gettime\": ___clock_gettime, \"__emscripten_init_main_thread_js\": ___emscripten_init_main_thread_js, \"__emscripten_thread_cleanup\": ___emscripten_thread_cleanup, \"__pthread_create_js\": ___pthread_create_js, \"_emscripten_default_pthread_stack_size\": __emscripten_default_pthread_stack_size, \"_emscripten_notify_thread_queue\": __emscripten_notify_thread_queue, \"abort\": _abort, \"emscripten_check_blocking_allowed\": _emscripten_check_blocking_allowed, \"emscripten_get_heap_max\": _emscripten_get_heap_max, \"emscripten_get_now\": _emscripten_get_now, \"emscripten_memcpy_big\": _emscripten_memcpy_big, \"emscripten_num_logical_cores\": _emscripten_num_logical_cores, \"emscripten_receive_on_main_thread_js\": _emscripten_receive_on_main_thread_js, \"emscripten_resize_heap\": _emscripten_resize_heap, \"emscripten_set_canvas_element_size\": _emscripten_set_canvas_element_size, \"emscripten_unwind_to_js_event_loop\": _emscripten_unwind_to_js_event_loop, \"emscripten_webgl_create_context\": _emscripten_webgl_create_context, \"exit\": _exit, \"fd_close\": _fd_close, \"fd_seek\": _fd_seek, \"fd_write\": _fd_write, \"memory\": wasmMemory || Module[\"wasmMemory\"], \"setTempRet0\": _setTempRet0 };\n var asm = createWasm();\n var ___wasm_call_ctors = Module[\"___wasm_call_ctors\"] = function() {\n return (___wasm_call_ctors = Module[\"___wasm_call_ctors\"] = Module[\"asm\"][\"__wasm_call_ctors\"]).apply(null, arguments);\n };\n var _init = Module[\"_init\"] = function() {\n return (_init = Module[\"_init\"] = Module[\"asm\"][\"init\"]).apply(null, arguments);\n };\n var _init_with_threads_count = Module[\"_init_with_threads_count\"] = function() {\n return (_init_with_threads_count = Module[\"_init_with_threads_count\"] = Module[\"asm\"][\"init_with_threads_count\"]).apply(null, arguments);\n };\n var _get_threads_count = Module[\"_get_threads_count\"] = function() {\n return (_get_threads_count = Module[\"_get_threads_count\"] = Module[\"asm\"][\"get_threads_count\"]).apply(null, arguments);\n };\n var _register_tensor = Module[\"_register_tensor\"] = function() {\n return (_register_tensor = Module[\"_register_tensor\"] = Module[\"asm\"][\"register_tensor\"]).apply(null, arguments);\n };\n var _dispose_data = Module[\"_dispose_data\"] = function() {\n return (_dispose_data = Module[\"_dispose_data\"] = Module[\"asm\"][\"dispose_data\"]).apply(null, arguments);\n };\n var _dispose = Module[\"_dispose\"] = function() {\n return (_dispose = Module[\"_dispose\"] = Module[\"asm\"][\"dispose\"]).apply(null, arguments);\n };\n var _Abs = Module[\"_Abs\"] = function() {\n return (_Abs = Module[\"_Abs\"] = Module[\"asm\"][\"Abs\"]).apply(null, arguments);\n };\n var _Add = Module[\"_Add\"] = function() {\n return (_Add = Module[\"_Add\"] = Module[\"asm\"][\"Add\"]).apply(null, arguments);\n };\n var _AddN = Module[\"_AddN\"] = function() {\n return (_AddN = Module[\"_AddN\"] = Module[\"asm\"][\"AddN\"]).apply(null, arguments);\n };\n var _All = Module[\"_All\"] = function() {\n return (_All = Module[\"_All\"] = Module[\"asm\"][\"All\"]).apply(null, arguments);\n };\n var _Any = Module[\"_Any\"] = function() {\n return (_Any = Module[\"_Any\"] = Module[\"asm\"][\"Any\"]).apply(null, arguments);\n };\n var _ArgMax = Module[\"_ArgMax\"] = function() {\n return (_ArgMax = Module[\"_ArgMax\"] = Module[\"asm\"][\"ArgMax\"]).apply(null, arguments);\n };\n var _AvgPool = Module[\"_AvgPool\"] = function() {\n return (_AvgPool = Module[\"_AvgPool\"] = Module[\"asm\"][\"AvgPool\"]).apply(null, arguments);\n };\n var _BatchMatMul = Module[\"_BatchMatMul\"] = function() {\n return (_BatchMatMul = Module[\"_BatchMatMul\"] = Module[\"asm\"][\"BatchMatMul\"]).apply(null, arguments);\n };\n var _Ceil = Module[\"_Ceil\"] = function() {\n return (_Ceil = Module[\"_Ceil\"] = Module[\"asm\"][\"Ceil\"]).apply(null, arguments);\n };\n var _ClipByValue = Module[\"_ClipByValue\"] = function() {\n return (_ClipByValue = Module[\"_ClipByValue\"] = Module[\"asm\"][\"ClipByValue\"]).apply(null, arguments);\n };\n var _Conv2D = Module[\"_Conv2D\"] = function() {\n return (_Conv2D = Module[\"_Conv2D\"] = Module[\"asm\"][\"Conv2D\"]).apply(null, arguments);\n };\n var _Conv2DBackpropInput = Module[\"_Conv2DBackpropInput\"] = function() {\n return (_Conv2DBackpropInput = Module[\"_Conv2DBackpropInput\"] = Module[\"asm\"][\"Conv2DBackpropInput\"]).apply(null, arguments);\n };\n var _Cos = Module[\"_Cos\"] = function() {\n return (_Cos = Module[\"_Cos\"] = Module[\"asm\"][\"Cos\"]).apply(null, arguments);\n };\n var _Cosh = Module[\"_Cosh\"] = function() {\n return (_Cosh = Module[\"_Cosh\"] = Module[\"asm\"][\"Cosh\"]).apply(null, arguments);\n };\n var _CropAndResize = Module[\"_CropAndResize\"] = function() {\n return (_CropAndResize = Module[\"_CropAndResize\"] = Module[\"asm\"][\"CropAndResize\"]).apply(null, arguments);\n };\n var _Cumprod = Module[\"_Cumprod\"] = function() {\n return (_Cumprod = Module[\"_Cumprod\"] = Module[\"asm\"][\"Cumprod\"]).apply(null, arguments);\n };\n var _Cumsum = Module[\"_Cumsum\"] = function() {\n return (_Cumsum = Module[\"_Cumsum\"] = Module[\"asm\"][\"Cumsum\"]).apply(null, arguments);\n };\n var _DepthToSpace = Module[\"_DepthToSpace\"] = function() {\n return (_DepthToSpace = Module[\"_DepthToSpace\"] = Module[\"asm\"][\"DepthToSpace\"]).apply(null, arguments);\n };\n var _DepthwiseConv2dNative = Module[\"_DepthwiseConv2dNative\"] = function() {\n return (_DepthwiseConv2dNative = Module[\"_DepthwiseConv2dNative\"] = Module[\"asm\"][\"DepthwiseConv2dNative\"]).apply(null, arguments);\n };\n var _Elu = Module[\"_Elu\"] = function() {\n return (_Elu = Module[\"_Elu\"] = Module[\"asm\"][\"Elu\"]).apply(null, arguments);\n };\n var _Equal = Module[\"_Equal\"] = function() {\n return (_Equal = Module[\"_Equal\"] = Module[\"asm\"][\"Equal\"]).apply(null, arguments);\n };\n var _Exp = Module[\"_Exp\"] = function() {\n return (_Exp = Module[\"_Exp\"] = Module[\"asm\"][\"Exp\"]).apply(null, arguments);\n };\n var _FlipLeftRight = Module[\"_FlipLeftRight\"] = function() {\n return (_FlipLeftRight = Module[\"_FlipLeftRight\"] = Module[\"asm\"][\"FlipLeftRight\"]).apply(null, arguments);\n };\n var _Floor = Module[\"_Floor\"] = function() {\n return (_Floor = Module[\"_Floor\"] = Module[\"asm\"][\"Floor\"]).apply(null, arguments);\n };\n var _FloorDiv = Module[\"_FloorDiv\"] = function() {\n return (_FloorDiv = Module[\"_FloorDiv\"] = Module[\"asm\"][\"FloorDiv\"]).apply(null, arguments);\n };\n var _FusedBatchNorm = Module[\"_FusedBatchNorm\"] = function() {\n return (_FusedBatchNorm = Module[\"_FusedBatchNorm\"] = Module[\"asm\"][\"FusedBatchNorm\"]).apply(null, arguments);\n };\n var _FusedConv2D = Module[\"_FusedConv2D\"] = function() {\n return (_FusedConv2D = Module[\"_FusedConv2D\"] = Module[\"asm\"][\"FusedConv2D\"]).apply(null, arguments);\n };\n var _FusedDepthwiseConv2D = Module[\"_FusedDepthwiseConv2D\"] = function() {\n return (_FusedDepthwiseConv2D = Module[\"_FusedDepthwiseConv2D\"] = Module[\"asm\"][\"FusedDepthwiseConv2D\"]).apply(null, arguments);\n };\n var _Gather = Module[\"_Gather\"] = function() {\n return (_Gather = Module[\"_Gather\"] = Module[\"asm\"][\"Gather\"]).apply(null, arguments);\n };\n var _GatherNd = Module[\"_GatherNd\"] = function() {\n return (_GatherNd = Module[\"_GatherNd\"] = Module[\"asm\"][\"GatherNd\"]).apply(null, arguments);\n };\n var _Greater = Module[\"_Greater\"] = function() {\n return (_Greater = Module[\"_Greater\"] = Module[\"asm\"][\"Greater\"]).apply(null, arguments);\n };\n var _GreaterEqual = Module[\"_GreaterEqual\"] = function() {\n return (_GreaterEqual = Module[\"_GreaterEqual\"] = Module[\"asm\"][\"GreaterEqual\"]).apply(null, arguments);\n };\n var _LeakyRelu = Module[\"_LeakyRelu\"] = function() {\n return (_LeakyRelu = Module[\"_LeakyRelu\"] = Module[\"asm\"][\"LeakyRelu\"]).apply(null, arguments);\n };\n var _Less = Module[\"_Less\"] = function() {\n return (_Less = Module[\"_Less\"] = Module[\"asm\"][\"Less\"]).apply(null, arguments);\n };\n var _LessEqual = Module[\"_LessEqual\"] = function() {\n return (_LessEqual = Module[\"_LessEqual\"] = Module[\"asm\"][\"LessEqual\"]).apply(null, arguments);\n };\n var _Log = Module[\"_Log\"] = function() {\n return (_Log = Module[\"_Log\"] = Module[\"asm\"][\"Log\"]).apply(null, arguments);\n };\n var _LogicalAnd = Module[\"_LogicalAnd\"] = function() {\n return (_LogicalAnd = Module[\"_LogicalAnd\"] = Module[\"asm\"][\"LogicalAnd\"]).apply(null, arguments);\n };\n var _LogicalNot = Module[\"_LogicalNot\"] = function() {\n return (_LogicalNot = Module[\"_LogicalNot\"] = Module[\"asm\"][\"LogicalNot\"]).apply(null, arguments);\n };\n var _LogicalOr = Module[\"_LogicalOr\"] = function() {\n return (_LogicalOr = Module[\"_LogicalOr\"] = Module[\"asm\"][\"LogicalOr\"]).apply(null, arguments);\n };\n var _LogicalXor = Module[\"_LogicalXor\"] = function() {\n return (_LogicalXor = Module[\"_LogicalXor\"] = Module[\"asm\"][\"LogicalXor\"]).apply(null, arguments);\n };\n var _Max = Module[\"_Max\"] = function() {\n return (_Max = Module[\"_Max\"] = Module[\"asm\"][\"Max\"]).apply(null, arguments);\n };\n var _MaxPool = Module[\"_MaxPool\"] = function() {\n return (_MaxPool = Module[\"_MaxPool\"] = Module[\"asm\"][\"MaxPool\"]).apply(null, arguments);\n };\n var _Maximum = Module[\"_Maximum\"] = function() {\n return (_Maximum = Module[\"_Maximum\"] = Module[\"asm\"][\"Maximum\"]).apply(null, arguments);\n };\n var _Mean = Module[\"_Mean\"] = function() {\n return (_Mean = Module[\"_Mean\"] = Module[\"asm\"][\"Mean\"]).apply(null, arguments);\n };\n var _Min = Module[\"_Min\"] = function() {\n return (_Min = Module[\"_Min\"] = Module[\"asm\"][\"Min\"]).apply(null, arguments);\n };\n var _Minimum = Module[\"_Minimum\"] = function() {\n return (_Minimum = Module[\"_Minimum\"] = Module[\"asm\"][\"Minimum\"]).apply(null, arguments);\n };\n var _MirrorPad = Module[\"_MirrorPad\"] = function() {\n return (_MirrorPad = Module[\"_MirrorPad\"] = Module[\"asm\"][\"MirrorPad\"]).apply(null, arguments);\n };\n var _Multiply = Module[\"_Multiply\"] = function() {\n return (_Multiply = Module[\"_Multiply\"] = Module[\"asm\"][\"Multiply\"]).apply(null, arguments);\n };\n var _Neg = Module[\"_Neg\"] = function() {\n return (_Neg = Module[\"_Neg\"] = Module[\"asm\"][\"Neg\"]).apply(null, arguments);\n };\n var _NonMaxSuppressionV3 = Module[\"_NonMaxSuppressionV3\"] = function() {\n return (_NonMaxSuppressionV3 = Module[\"_NonMaxSuppressionV3\"] = Module[\"asm\"][\"NonMaxSuppressionV3\"]).apply(null, arguments);\n };\n var _NonMaxSuppressionV4 = Module[\"_NonMaxSuppressionV4\"] = function() {\n return (_NonMaxSuppressionV4 = Module[\"_NonMaxSuppressionV4\"] = Module[\"asm\"][\"NonMaxSuppressionV4\"]).apply(null, arguments);\n };\n var _NonMaxSuppressionV5 = Module[\"_NonMaxSuppressionV5\"] = function() {\n return (_NonMaxSuppressionV5 = Module[\"_NonMaxSuppressionV5\"] = Module[\"asm\"][\"NonMaxSuppressionV5\"]).apply(null, arguments);\n };\n var _NotEqual = Module[\"_NotEqual\"] = function() {\n return (_NotEqual = Module[\"_NotEqual\"] = Module[\"asm\"][\"NotEqual\"]).apply(null, arguments);\n };\n var _OneHot = Module[\"_OneHot\"] = function() {\n return (_OneHot = Module[\"_OneHot\"] = Module[\"asm\"][\"OneHot\"]).apply(null, arguments);\n };\n var _PadV2 = Module[\"_PadV2\"] = function() {\n return (_PadV2 = Module[\"_PadV2\"] = Module[\"asm\"][\"PadV2\"]).apply(null, arguments);\n };\n var _Pow = Module[\"_Pow\"] = function() {\n return (_Pow = Module[\"_Pow\"] = Module[\"asm\"][\"Pow\"]).apply(null, arguments);\n };\n var _Prelu = Module[\"_Prelu\"] = function() {\n return (_Prelu = Module[\"_Prelu\"] = Module[\"asm\"][\"Prelu\"]).apply(null, arguments);\n };\n var _Prod = Module[\"_Prod\"] = function() {\n return (_Prod = Module[\"_Prod\"] = Module[\"asm\"][\"Prod\"]).apply(null, arguments);\n };\n var _RealDiv = Module[\"_RealDiv\"] = function() {\n return (_RealDiv = Module[\"_RealDiv\"] = Module[\"asm\"][\"RealDiv\"]).apply(null, arguments);\n };\n var _Relu = Module[\"_Relu\"] = function() {\n return (_Relu = Module[\"_Relu\"] = Module[\"asm\"][\"Relu\"]).apply(null, arguments);\n };\n var _Relu6 = Module[\"_Relu6\"] = function() {\n return (_Relu6 = Module[\"_Relu6\"] = Module[\"asm\"][\"Relu6\"]).apply(null, arguments);\n };\n var _ResizeBilinear = Module[\"_ResizeBilinear\"] = function() {\n return (_ResizeBilinear = Module[\"_ResizeBilinear\"] = Module[\"asm\"][\"ResizeBilinear\"]).apply(null, arguments);\n };\n var _ResizeNearestNeighbor = Module[\"_ResizeNearestNeighbor\"] = function() {\n return (_ResizeNearestNeighbor = Module[\"_ResizeNearestNeighbor\"] = Module[\"asm\"][\"ResizeNearestNeighbor\"]).apply(null, arguments);\n };\n var _Reverse = Module[\"_Reverse\"] = function() {\n return (_Reverse = Module[\"_Reverse\"] = Module[\"asm\"][\"Reverse\"]).apply(null, arguments);\n };\n var _RotateWithOffset = Module[\"_RotateWithOffset\"] = function() {\n return (_RotateWithOffset = Module[\"_RotateWithOffset\"] = Module[\"asm\"][\"RotateWithOffset\"]).apply(null, arguments);\n };\n var _Round = Module[\"_Round\"] = function() {\n return (_Round = Module[\"_Round\"] = Module[\"asm\"][\"Round\"]).apply(null, arguments);\n };\n var _Rsqrt = Module[\"_Rsqrt\"] = function() {\n return (_Rsqrt = Module[\"_Rsqrt\"] = Module[\"asm\"][\"Rsqrt\"]).apply(null, arguments);\n };\n var _ScatterNd = Module[\"_ScatterNd\"] = function() {\n return (_ScatterNd = Module[\"_ScatterNd\"] = Module[\"asm\"][\"ScatterNd\"]).apply(null, arguments);\n };\n var _SelectV2 = Module[\"_SelectV2\"] = function() {\n return (_SelectV2 = Module[\"_SelectV2\"] = Module[\"asm\"][\"SelectV2\"]).apply(null, arguments);\n };\n var _Sigmoid = Module[\"_Sigmoid\"] = function() {\n return (_Sigmoid = Module[\"_Sigmoid\"] = Module[\"asm\"][\"Sigmoid\"]).apply(null, arguments);\n };\n var _Sin = Module[\"_Sin\"] = function() {\n return (_Sin = Module[\"_Sin\"] = Module[\"asm\"][\"Sin\"]).apply(null, arguments);\n };\n var _Softmax = Module[\"_Softmax\"] = function() {\n return (_Softmax = Module[\"_Softmax\"] = Module[\"asm\"][\"Softmax\"]).apply(null, arguments);\n };\n var _SparseFillEmptyRows = Module[\"_SparseFillEmptyRows\"] = function() {\n return (_SparseFillEmptyRows = Module[\"_SparseFillEmptyRows\"] = Module[\"asm\"][\"SparseFillEmptyRows\"]).apply(null, arguments);\n };\n var _SparseReshape = Module[\"_SparseReshape\"] = function() {\n return (_SparseReshape = Module[\"_SparseReshape\"] = Module[\"asm\"][\"SparseReshape\"]).apply(null, arguments);\n };\n var _SparseSegmentReduction = Module[\"_SparseSegmentReduction\"] = function() {\n return (_SparseSegmentReduction = Module[\"_SparseSegmentReduction\"] = Module[\"asm\"][\"SparseSegmentReduction\"]).apply(null, arguments);\n };\n var _Sqrt = Module[\"_Sqrt\"] = function() {\n return (_Sqrt = Module[\"_Sqrt\"] = Module[\"asm\"][\"Sqrt\"]).apply(null, arguments);\n };\n var _Square = Module[\"_Square\"] = function() {\n return (_Square = Module[\"_Square\"] = Module[\"asm\"][\"Square\"]).apply(null, arguments);\n };\n var _SquaredDifference = Module[\"_SquaredDifference\"] = function() {\n return (_SquaredDifference = Module[\"_SquaredDifference\"] = Module[\"asm\"][\"SquaredDifference\"]).apply(null, arguments);\n };\n var _Step = Module[\"_Step\"] = function() {\n return (_Step = Module[\"_Step\"] = Module[\"asm\"][\"Step\"]).apply(null, arguments);\n };\n var _StridedSlice = Module[\"_StridedSlice\"] = function() {\n return (_StridedSlice = Module[\"_StridedSlice\"] = Module[\"asm\"][\"StridedSlice\"]).apply(null, arguments);\n };\n var _Sub = Module[\"_Sub\"] = function() {\n return (_Sub = Module[\"_Sub\"] = Module[\"asm\"][\"Sub\"]).apply(null, arguments);\n };\n var _Sum = Module[\"_Sum\"] = function() {\n return (_Sum = Module[\"_Sum\"] = Module[\"asm\"][\"Sum\"]).apply(null, arguments);\n };\n var _Tan = Module[\"_Tan\"] = function() {\n return (_Tan = Module[\"_Tan\"] = Module[\"asm\"][\"Tan\"]).apply(null, arguments);\n };\n var _Tanh = Module[\"_Tanh\"] = function() {\n return (_Tanh = Module[\"_Tanh\"] = Module[\"asm\"][\"Tanh\"]).apply(null, arguments);\n };\n var _Tile = Module[\"_Tile\"] = function() {\n return (_Tile = Module[\"_Tile\"] = Module[\"asm\"][\"Tile\"]).apply(null, arguments);\n };\n var _TopK = Module[\"_TopK\"] = function() {\n return (_TopK = Module[\"_TopK\"] = Module[\"asm\"][\"TopK\"]).apply(null, arguments);\n };\n var _Transform = Module[\"_Transform\"] = function() {\n return (_Transform = Module[\"_Transform\"] = Module[\"asm\"][\"Transform\"]).apply(null, arguments);\n };\n var _Transpose = Module[\"_Transpose\"] = function() {\n return (_Transpose = Module[\"_Transpose\"] = Module[\"asm\"][\"Transpose\"]).apply(null, arguments);\n };\n var __FusedMatMul = Module[\"__FusedMatMul\"] = function() {\n return (__FusedMatMul = Module[\"__FusedMatMul\"] = Module[\"asm\"][\"_FusedMatMul\"]).apply(null, arguments);\n };\n var _malloc = Module[\"_malloc\"] = function() {\n return (_malloc = Module[\"_malloc\"] = Module[\"asm\"][\"malloc\"]).apply(null, arguments);\n };\n var _free = Module[\"_free\"] = function() {\n return (_free = Module[\"_free\"] = Module[\"asm\"][\"free\"]).apply(null, arguments);\n };\n var _emscripten_tls_init = Module[\"_emscripten_tls_init\"] = function() {\n return (_emscripten_tls_init = Module[\"_emscripten_tls_init\"] = Module[\"asm\"][\"emscripten_tls_init\"]).apply(null, arguments);\n };\n var ___errno_location = Module[\"___errno_location\"] = function() {\n return (___errno_location = Module[\"___errno_location\"] = Module[\"asm\"][\"__errno_location\"]).apply(null, arguments);\n };\n var _pthread_self = Module[\"_pthread_self\"] = function() {\n return (_pthread_self = Module[\"_pthread_self\"] = Module[\"asm\"][\"pthread_self\"]).apply(null, arguments);\n };\n var _emscripten_main_thread_process_queued_calls = Module[\"_emscripten_main_thread_process_queued_calls\"] = function() {\n return (_emscripten_main_thread_process_queued_calls = Module[\"_emscripten_main_thread_process_queued_calls\"] = Module[\"asm\"][\"emscripten_main_thread_process_queued_calls\"]).apply(null, arguments);\n };\n var __emscripten_thread_crashed = Module[\"__emscripten_thread_crashed\"] = function() {\n return (__emscripten_thread_crashed = Module[\"__emscripten_thread_crashed\"] = Module[\"asm\"][\"_emscripten_thread_crashed\"]).apply(null, arguments);\n };\n var __emscripten_thread_init = Module[\"__emscripten_thread_init\"] = function() {\n return (__emscripten_thread_init = Module[\"__emscripten_thread_init\"] = Module[\"asm\"][\"_emscripten_thread_init\"]).apply(null, arguments);\n };\n var _emscripten_current_thread_process_queued_calls = Module[\"_emscripten_current_thread_process_queued_calls\"] = function() {\n return (_emscripten_current_thread_process_queued_calls = Module[\"_emscripten_current_thread_process_queued_calls\"] = Module[\"asm\"][\"emscripten_current_thread_process_queued_calls\"]).apply(null, arguments);\n };\n var _emscripten_main_browser_thread_id = Module[\"_emscripten_main_browser_thread_id\"] = function() {\n return (_emscripten_main_browser_thread_id = Module[\"_emscripten_main_browser_thread_id\"] = Module[\"asm\"][\"emscripten_main_browser_thread_id\"]).apply(null, arguments);\n };\n var _emscripten_sync_run_in_main_thread_2 = Module[\"_emscripten_sync_run_in_main_thread_2\"] = function() {\n return (_emscripten_sync_run_in_main_thread_2 = Module[\"_emscripten_sync_run_in_main_thread_2\"] = Module[\"asm\"][\"emscripten_sync_run_in_main_thread_2\"]).apply(null, arguments);\n };\n var _emscripten_sync_run_in_main_thread_4 = Module[\"_emscripten_sync_run_in_main_thread_4\"] = function() {\n return (_emscripten_sync_run_in_main_thread_4 = Module[\"_emscripten_sync_run_in_main_thread_4\"] = Module[\"asm\"][\"emscripten_sync_run_in_main_thread_4\"]).apply(null, arguments);\n };\n var _emscripten_run_in_main_runtime_thread_js = Module[\"_emscripten_run_in_main_runtime_thread_js\"] = function() {\n return (_emscripten_run_in_main_runtime_thread_js = Module[\"_emscripten_run_in_main_runtime_thread_js\"] = Module[\"asm\"][\"emscripten_run_in_main_runtime_thread_js\"]).apply(null, arguments);\n };\n var _emscripten_dispatch_to_thread_ = Module[\"_emscripten_dispatch_to_thread_\"] = function() {\n return (_emscripten_dispatch_to_thread_ = Module[\"_emscripten_dispatch_to_thread_\"] = Module[\"asm\"][\"emscripten_dispatch_to_thread_\"]).apply(null, arguments);\n };\n var __emscripten_thread_free_data = Module[\"__emscripten_thread_free_data\"] = function() {\n return (__emscripten_thread_free_data = Module[\"__emscripten_thread_free_data\"] = Module[\"asm\"][\"_emscripten_thread_free_data\"]).apply(null, arguments);\n };\n var __emscripten_thread_exit = Module[\"__emscripten_thread_exit\"] = function() {\n return (__emscripten_thread_exit = Module[\"__emscripten_thread_exit\"] = Module[\"asm\"][\"_emscripten_thread_exit\"]).apply(null, arguments);\n };\n var _memalign = Module[\"_memalign\"] = function() {\n return (_memalign = Module[\"_memalign\"] = Module[\"asm\"][\"memalign\"]).apply(null, arguments);\n };\n var _emscripten_stack_set_limits = Module[\"_emscripten_stack_set_limits\"] = function() {\n return (_emscripten_stack_set_limits = Module[\"_emscripten_stack_set_limits\"] = Module[\"asm\"][\"emscripten_stack_set_limits\"]).apply(null, arguments);\n };\n var stackSave = Module[\"stackSave\"] = function() {\n return (stackSave = Module[\"stackSave\"] = Module[\"asm\"][\"stackSave\"]).apply(null, arguments);\n };\n var stackRestore = Module[\"stackRestore\"] = function() {\n return (stackRestore = Module[\"stackRestore\"] = Module[\"asm\"][\"stackRestore\"]).apply(null, arguments);\n };\n var stackAlloc = Module[\"stackAlloc\"] = function() {\n return (stackAlloc = Module[\"stackAlloc\"] = Module[\"asm\"][\"stackAlloc\"]).apply(null, arguments);\n };\n var dynCall_iijjiiii = Module[\"dynCall_iijjiiii\"] = function() {\n return (dynCall_iijjiiii = Module[\"dynCall_iijjiiii\"] = Module[\"asm\"][\"dynCall_iijjiiii\"]).apply(null, arguments);\n };\n var dynCall_jiji = Module[\"dynCall_jiji\"] = function() {\n return (dynCall_jiji = Module[\"dynCall_jiji\"] = Module[\"asm\"][\"dynCall_jiji\"]).apply(null, arguments);\n };\n var __emscripten_allow_main_runtime_queued_calls = Module[\"__emscripten_allow_main_runtime_queued_calls\"] = 21672;\n Module[\"cwrap\"] = cwrap;\n Module[\"keepRuntimeAlive\"] = keepRuntimeAlive;\n Module[\"PThread\"] = PThread;\n Module[\"PThread\"] = PThread;\n Module[\"wasmMemory\"] = wasmMemory;\n Module[\"ExitStatus\"] = ExitStatus;\n var calledRun;\n function ExitStatus(status) {\n this.name = \"ExitStatus\";\n this.message = \"Program terminated with exit(\" + status + \")\";\n this.status = status;\n }\n dependenciesFulfilled = function runCaller() {\n if (!calledRun)\n run();\n if (!calledRun)\n dependenciesFulfilled = runCaller;\n };\n function run(args) {\n args = args || arguments_;\n if (runDependencies > 0) {\n return;\n }\n if (ENVIRONMENT_IS_PTHREAD) {\n readyPromiseResolve(Module);\n initRuntime();\n postMessage({ \"cmd\": \"loaded\" });\n return;\n }\n preRun();\n if (runDependencies > 0) {\n return;\n }\n function doRun() {\n if (calledRun)\n return;\n calledRun = true;\n Module[\"calledRun\"] = true;\n if (ABORT)\n return;\n initRuntime();\n readyPromiseResolve(Module);\n if (Module[\"onRuntimeInitialized\"])\n Module[\"onRuntimeInitialized\"]();\n postRun();\n }\n if (Module[\"setStatus\"]) {\n Module[\"setStatus\"](\"Running...\");\n setTimeout(function() {\n setTimeout(function() {\n Module[\"setStatus\"](\"\");\n }, 1);\n doRun();\n }, 1);\n } else {\n doRun();\n }\n }\n Module[\"run\"] = run;\n function exit(status, implicit) {\n EXITSTATUS = status;\n if (!implicit) {\n if (ENVIRONMENT_IS_PTHREAD) {\n exitOnMainThread(status);\n throw \"unwind\";\n } else {\n }\n }\n if (keepRuntimeAlive()) {\n } else {\n exitRuntime();\n }\n procExit(status);\n }\n function procExit(code) {\n EXITSTATUS = code;\n if (!keepRuntimeAlive()) {\n PThread.terminateAllThreads();\n if (Module[\"onExit\"])\n Module[\"onExit\"](code);\n ABORT = true;\n }\n quit_(code, new ExitStatus(code));\n }\n if (Module[\"preInit\"]) {\n if (typeof Module[\"preInit\"] == \"function\")\n Module[\"preInit\"] = [Module[\"preInit\"]];\n while (Module[\"preInit\"].length > 0) {\n Module[\"preInit\"].pop()();\n }\n }\n run();\n var listenersAdded;\n if (beforeListeners) {\n listenersAdded = { uncaughtException: process.listeners(\"uncaughtException\").filter(function(listener) {\n return !beforeListeners.uncaughtException.indexOf(listener) > -1;\n }), unhandledRejection: process.listeners(\"unhandledRejection\").filter(function(listener) {\n return !beforeListeners.unhandledRejection.indexOf(listener) > -1;\n }) };\n }\n var actualModule;\n if (typeof WasmBackendModule !== \"undefined\") {\n actualModule = WasmBackendModule;\n } else if (typeof WasmBackendModuleThreadedSimd3 !== \"undefined\") {\n actualModule = WasmBackendModuleThreadedSimd3;\n } else {\n throw new Error(\"Could not find wasm module in post.js\");\n }\n if (listenersAdded) {\n var tmpDispose = actualModule[\"_dispose\"];\n actualModule[\"_dispose\"] = function() {\n tmpDispose();\n listenersAdded.uncaughtException.forEach(function(listener) {\n process.removeListener(\"uncaughtException\", listener);\n });\n listenersAdded.unhandledRejection.forEach(function(listener) {\n process.removeListener(\"unhandledRejection\", listener);\n });\n };\n }\n return WasmBackendModuleThreadedSimd3.ready;\n };\n })();\n if (typeof exports === \"object\" && typeof module === \"object\")\n module.exports = WasmBackendModuleThreadedSimd2;\n else if (typeof define === \"function\" && define[\"amd\"])\n define([], function() {\n return WasmBackendModuleThreadedSimd2;\n });\n else if (typeof exports === \"object\")\n exports[\"WasmBackendModuleThreadedSimd\"] = WasmBackendModuleThreadedSimd2;\n }\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.19.0_hek32lflchivueqv5i4vgonghu/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js\nvar require_tfjs_backend_wasm_threaded_simd_worker = __commonJS({\n \"node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.19.0_hek32lflchivueqv5i4vgonghu/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.worker.js\"(exports, module) {\n module.exports.wasmWorkerContents = `\"use strict\";var Module={};var ENVIRONMENT_IS_NODE=typeof process===\"object\"&&typeof process.versions===\"object\"&&typeof process.versions.node===\"string\";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require(\"worker_threads\");var parentPort=nodeWorkerThreads.parentPort;parentPort.on(\"message\",function(data){onmessage({data:data})});var fs=require(\"fs\");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(fs.readFileSync(f,\"utf8\"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(\" \");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+\"\n\");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(\" \");postMessage({cmd:\"alert\",text:text,threadId:Module[\"_pthread_self\"]()})}var err=threadPrintErr;self.alert=threadAlert;Module[\"instantiateWasm\"]=((info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module[\"wasmModule\"],info);receiveInstance(instance);Module[\"wasmModule\"]=null;return instance.exports});self.onmessage=(e=>{try{if(e.data.cmd===\"load\"){Module[\"wasmModule\"]=e.data.wasmModule;Module[\"wasmMemory\"]=e.data.wasmMemory;Module[\"buffer\"]=Module[\"wasmMemory\"].buffer;Module[\"ENVIRONMENT_IS_PTHREAD\"]=true;if(typeof e.data.urlOrBlob===\"string\"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance})}else if(e.data.cmd===\"run\"){Module[\"__performance_now_clock_drift\"]=performance.now()-e.data.time;Module[\"__emscripten_thread_init\"](e.data.threadInfoStruct,0,0,1);Module[\"establishStackSpace\"]();Module[\"PThread\"].receiveObjectTransfer(e.data);Module[\"PThread\"].threadInit();try{var result=Module[\"invokeEntryPoint\"](e.data.start_routine,e.data.arg);if(Module[\"keepRuntimeAlive\"]()){Module[\"PThread\"].setExitStatus(result)}else{Module[\"__emscripten_thread_exit\"](result)}}catch(ex){if(ex!=\"unwind\"){if(ex instanceof Module[\"ExitStatus\"]){if(Module[\"keepRuntimeAlive\"]()){}else{Module[\"__emscripten_thread_exit\"](ex.status)}}else{throw ex}}}}else if(e.data.cmd===\"cancel\"){if(Module[\"_pthread_self\"]()){Module[\"__emscripten_thread_exit\"](-1)}}else if(e.data.target===\"setimmediate\"){}else if(e.data.cmd===\"processThreadQueue\"){if(Module[\"_pthread_self\"]()){Module[\"_emscripten_current_thread_process_queued_calls\"]()}}else if(e.data.cmd===\"processProxyingQueue\"){if(Module[\"_pthread_self\"]()){Module[\"_emscripten_proxy_execute_queue\"](e.data.queue)}}else{err(\"worker.js received unknown command \"+e.data.cmd);err(e.data)}}catch(ex){err(\"worker.js onmessage() captured an uncaught exception: \"+ex);if(ex&&ex.stack)err(ex.stack);if(Module[\"__emscripten_thread_crashed\"]){Module[\"__emscripten_thread_crashed\"]()}throw ex}});`;\n }\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.19.0_hek32lflchivueqv5i4vgonghu/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js\nvar require_tfjs_backend_wasm = __commonJS({\n \"node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.19.0_hek32lflchivueqv5i4vgonghu/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js\"(exports, module) {\n var WasmBackendModule2 = (() => {\n var _scriptDir = typeof document !== \"undefined\" && document.currentScript ? document.currentScript.src : void 0;\n if (typeof __filename !== \"undefined\")\n _scriptDir = _scriptDir || __filename;\n return function(WasmBackendModule3) {\n WasmBackendModule3 = WasmBackendModule3 || {};\n var Module = typeof WasmBackendModule3 !== \"undefined\" ? WasmBackendModule3 : {};\n var readyPromiseResolve, readyPromiseReject;\n Module[\"ready\"] = new Promise(function(resolve, reject) {\n readyPromiseResolve = resolve;\n readyPromiseReject = reject;\n });\n var beforeListeners;\n if (typeof process !== \"undefined\" && process.listeners) {\n beforeListeners = { uncaughtException: process.listeners(\"uncaughtException\"), unhandledRejection: process.listeners(\"unhandledRejection\") };\n }\n var moduleOverrides = Object.assign({}, Module);\n var arguments_ = [];\n var thisProgram = \"./this.program\";\n var quit_ = (status, toThrow) => {\n throw toThrow;\n };\n var ENVIRONMENT_IS_WEB = typeof window === \"object\";\n var ENVIRONMENT_IS_WORKER = typeof importScripts === \"function\";\n var ENVIRONMENT_IS_NODE = typeof process === \"object\" && typeof process.versions === \"object\" && typeof process.versions.node === \"string\";\n var scriptDirectory = \"\";\n function locateFile(path) {\n if (Module[\"locateFile\"]) {\n return Module[\"locateFile\"](path, scriptDirectory);\n }\n return scriptDirectory + path;\n }\n var read_, readAsync, readBinary, setWindowTitle;\n function logExceptionOnExit(e) {\n if (e instanceof ExitStatus)\n return;\n let toLog = e;\n err(\"exiting due to exception: \" + toLog);\n }\n var fs;\n var nodePath;\n var requireNodeFS;\n if (ENVIRONMENT_IS_NODE) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = require_path().dirname(scriptDirectory) + \"/\";\n } else {\n scriptDirectory = __dirname + \"/\";\n }\n requireNodeFS = () => {\n if (!nodePath) {\n fs = require_fs();\n nodePath = require_path();\n }\n };\n read_ = function shell_read(filename, binary) {\n requireNodeFS();\n filename = nodePath[\"normalize\"](filename);\n return fs.readFileSync(filename, binary ? void 0 : \"utf8\");\n };\n readBinary = (filename) => {\n var ret = read_(filename, true);\n if (!ret.buffer) {\n ret = new Uint8Array(ret);\n }\n return ret;\n };\n readAsync = (filename, onload, onerror) => {\n requireNodeFS();\n filename = nodePath[\"normalize\"](filename);\n fs.readFile(filename, function(err2, data) {\n if (err2)\n onerror(err2);\n else\n onload(data.buffer);\n });\n };\n if (process[\"argv\"].length > 1) {\n thisProgram = process[\"argv\"][1].replace(/\\\\/g, \"/\");\n }\n arguments_ = process[\"argv\"].slice(2);\n process[\"on\"](\"uncaughtException\", function(ex) {\n if (!(ex instanceof ExitStatus)) {\n throw ex;\n }\n });\n process[\"on\"](\"unhandledRejection\", function(reason) {\n throw reason;\n });\n quit_ = (status, toThrow) => {\n if (keepRuntimeAlive()) {\n process[\"exitCode\"] = status;\n throw toThrow;\n }\n logExceptionOnExit(toThrow);\n process[\"exit\"](status);\n };\n Module[\"inspect\"] = function() {\n return \"[Emscripten Module object]\";\n };\n } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = self.location.href;\n } else if (typeof document !== \"undefined\" && document.currentScript) {\n scriptDirectory = document.currentScript.src;\n }\n if (_scriptDir) {\n scriptDirectory = _scriptDir;\n }\n if (scriptDirectory.indexOf(\"blob:\") !== 0) {\n scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, \"\").lastIndexOf(\"/\") + 1);\n } else {\n scriptDirectory = \"\";\n }\n {\n read_ = (url) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.send(null);\n return xhr.responseText;\n };\n if (ENVIRONMENT_IS_WORKER) {\n readBinary = (url) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.responseType = \"arraybuffer\";\n xhr.send(null);\n return new Uint8Array(xhr.response);\n };\n }\n readAsync = (url, onload, onerror) => {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, true);\n xhr.responseType = \"arraybuffer\";\n xhr.onload = () => {\n if (xhr.status == 200 || xhr.status == 0 && xhr.response) {\n onload(xhr.response);\n return;\n }\n onerror();\n };\n xhr.onerror = onerror;\n xhr.send(null);\n };\n }\n setWindowTitle = (title) => document.title = title;\n } else {\n }\n var out = Module[\"print\"] || console.log.bind(console);\n var err = Module[\"printErr\"] || console.warn.bind(console);\n Object.assign(Module, moduleOverrides);\n moduleOverrides = null;\n if (Module[\"arguments\"])\n arguments_ = Module[\"arguments\"];\n if (Module[\"thisProgram\"])\n thisProgram = Module[\"thisProgram\"];\n if (Module[\"quit\"])\n quit_ = Module[\"quit\"];\n var POINTER_SIZE = 4;\n function warnOnce(text) {\n if (!warnOnce.shown)\n warnOnce.shown = {};\n if (!warnOnce.shown[text]) {\n warnOnce.shown[text] = 1;\n err(text);\n }\n }\n function convertJsFunctionToWasm(func2, sig) {\n if (typeof WebAssembly.Function === \"function\") {\n var typeNames = { \"i\": \"i32\", \"j\": \"i64\", \"f\": \"f32\", \"d\": \"f64\" };\n var type = { parameters: [], results: sig[0] == \"v\" ? [] : [typeNames[sig[0]]] };\n for (var i = 1; i < sig.length; ++i) {\n type.parameters.push(typeNames[sig[i]]);\n }\n return new WebAssembly.Function(type, func2);\n }\n var typeSection = [1, 0, 1, 96];\n var sigRet = sig.slice(0, 1);\n var sigParam = sig.slice(1);\n var typeCodes = { \"i\": 127, \"j\": 126, \"f\": 125, \"d\": 124 };\n typeSection.push(sigParam.length);\n for (var i = 0; i < sigParam.length; ++i) {\n typeSection.push(typeCodes[sigParam[i]]);\n }\n if (sigRet == \"v\") {\n typeSection.push(0);\n } else {\n typeSection = typeSection.concat([1, typeCodes[sigRet]]);\n }\n typeSection[1] = typeSection.length - 2;\n var bytes = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0].concat(typeSection, [2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0]));\n var module2 = new WebAssembly.Module(bytes);\n var instance = new WebAssembly.Instance(module2, { \"e\": { \"f\": func2 } });\n var wrappedFunc = instance.exports[\"f\"];\n return wrappedFunc;\n }\n var freeTableIndexes = [];\n var functionsInTableMap;\n function getEmptyTableSlot() {\n if (freeTableIndexes.length) {\n return freeTableIndexes.pop();\n }\n try {\n wasmTable.grow(1);\n } catch (err2) {\n if (!(err2 instanceof RangeError)) {\n throw err2;\n }\n throw \"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.\";\n }\n return wasmTable.length - 1;\n }\n function updateTableMap(offset, count2) {\n for (var i = offset; i < offset + count2; i++) {\n var item = getWasmTableEntry(i);\n if (item) {\n functionsInTableMap.set(item, i);\n }\n }\n }\n var tempRet0 = 0;\n var setTempRet0 = (value) => {\n tempRet0 = value;\n };\n var wasmBinary;\n if (Module[\"wasmBinary\"])\n wasmBinary = Module[\"wasmBinary\"];\n var noExitRuntime = Module[\"noExitRuntime\"] || true;\n if (typeof WebAssembly !== \"object\") {\n abort(\"no native wasm support detected\");\n }\n var wasmMemory;\n var ABORT = false;\n var EXITSTATUS;\n function assert3(condition, text) {\n if (!condition) {\n abort(text);\n }\n }\n function getCFunc(ident) {\n var func2 = Module[\"_\" + ident];\n return func2;\n }\n function ccall(ident, returnType, argTypes, args, opts) {\n var toC = { \"string\": function(str) {\n var ret2 = 0;\n if (str !== null && str !== void 0 && str !== 0) {\n var len = (str.length << 2) + 1;\n ret2 = stackAlloc(len);\n stringToUTF8(str, ret2, len);\n }\n return ret2;\n }, \"array\": function(arr) {\n var ret2 = stackAlloc(arr.length);\n writeArrayToMemory(arr, ret2);\n return ret2;\n } };\n function convertReturnValue(ret2) {\n if (returnType === \"string\")\n return UTF8ToString(ret2);\n if (returnType === \"boolean\")\n return Boolean(ret2);\n return ret2;\n }\n var func2 = getCFunc(ident);\n var cArgs = [];\n var stack2 = 0;\n if (args) {\n for (var i = 0; i < args.length; i++) {\n var converter = toC[argTypes[i]];\n if (converter) {\n if (stack2 === 0)\n stack2 = stackSave();\n cArgs[i] = converter(args[i]);\n } else {\n cArgs[i] = args[i];\n }\n }\n }\n var ret = func2.apply(null, cArgs);\n function onDone(ret2) {\n if (stack2 !== 0)\n stackRestore(stack2);\n return convertReturnValue(ret2);\n }\n ret = onDone(ret);\n return ret;\n }\n function cwrap(ident, returnType, argTypes, opts) {\n argTypes = argTypes || [];\n var numericArgs = argTypes.every(function(type) {\n return type === \"number\";\n });\n var numericRet = returnType !== \"string\";\n if (numericRet && numericArgs && !opts) {\n return getCFunc(ident);\n }\n return function() {\n return ccall(ident, returnType, argTypes, arguments, opts);\n };\n }\n var ALLOC_STACK = 1;\n var UTF8Decoder = typeof TextDecoder !== \"undefined\" ? new TextDecoder(\"utf8\") : void 0;\n function UTF8ArrayToString(heap, idx, maxBytesToRead) {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n while (heap[endPtr] && !(endPtr >= endIdx))\n ++endPtr;\n if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {\n return UTF8Decoder.decode(heap.subarray(idx, endPtr));\n } else {\n var str = \"\";\n while (idx < endPtr) {\n var u0 = heap[idx++];\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0);\n continue;\n }\n var u1 = heap[idx++] & 63;\n if ((u0 & 224) == 192) {\n str += String.fromCharCode((u0 & 31) << 6 | u1);\n continue;\n }\n var u2 = heap[idx++] & 63;\n if ((u0 & 240) == 224) {\n u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n } else {\n u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63;\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0);\n } else {\n var ch = u0 - 65536;\n str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n }\n }\n }\n return str;\n }\n function UTF8ToString(ptr, maxBytesToRead) {\n return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : \"\";\n }\n function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\n if (!(maxBytesToWrite > 0))\n return 0;\n var startIdx = outIdx;\n var endIdx = outIdx + maxBytesToWrite - 1;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 55296 && u <= 57343) {\n var u1 = str.charCodeAt(++i);\n u = 65536 + ((u & 1023) << 10) | u1 & 1023;\n }\n if (u <= 127) {\n if (outIdx >= endIdx)\n break;\n heap[outIdx++] = u;\n } else if (u <= 2047) {\n if (outIdx + 1 >= endIdx)\n break;\n heap[outIdx++] = 192 | u >> 6;\n heap[outIdx++] = 128 | u & 63;\n } else if (u <= 65535) {\n if (outIdx + 2 >= endIdx)\n break;\n heap[outIdx++] = 224 | u >> 12;\n heap[outIdx++] = 128 | u >> 6 & 63;\n heap[outIdx++] = 128 | u & 63;\n } else {\n if (outIdx + 3 >= endIdx)\n break;\n heap[outIdx++] = 240 | u >> 18;\n heap[outIdx++] = 128 | u >> 12 & 63;\n heap[outIdx++] = 128 | u >> 6 & 63;\n heap[outIdx++] = 128 | u & 63;\n }\n }\n heap[outIdx] = 0;\n return outIdx - startIdx;\n }\n function stringToUTF8(str, outPtr, maxBytesToWrite) {\n return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);\n }\n function lengthBytesUTF8(str) {\n var len = 0;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 55296 && u <= 57343)\n u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;\n if (u <= 127)\n ++len;\n else if (u <= 2047)\n len += 2;\n else if (u <= 65535)\n len += 3;\n else\n len += 4;\n }\n return len;\n }\n var UTF16Decoder = typeof TextDecoder !== \"undefined\" ? new TextDecoder(\"utf-16le\") : void 0;\n function writeArrayToMemory(array2, buffer3) {\n HEAP8.set(array2, buffer3);\n }\n function writeAsciiToMemory(str, buffer3, dontAddNull) {\n for (var i = 0; i < str.length; ++i) {\n HEAP8[buffer3++ >> 0] = str.charCodeAt(i);\n }\n if (!dontAddNull)\n HEAP8[buffer3 >> 0] = 0;\n }\n function alignUp(x, multiple) {\n if (x % multiple > 0) {\n x += multiple - x % multiple;\n }\n return x;\n }\n var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n function updateGlobalBufferAndViews(buf) {\n buffer2 = buf;\n Module[\"HEAP8\"] = HEAP8 = new Int8Array(buf);\n Module[\"HEAP16\"] = HEAP16 = new Int16Array(buf);\n Module[\"HEAP32\"] = HEAP32 = new Int32Array(buf);\n Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(buf);\n Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(buf);\n Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(buf);\n Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(buf);\n Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(buf);\n }\n var INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 16777216;\n var wasmTable;\n var __ATPRERUN__ = [];\n var __ATINIT__ = [];\n var __ATPOSTRUN__ = [];\n var runtimeInitialized = false;\n var runtimeExited = false;\n var runtimeKeepaliveCounter = 0;\n function keepRuntimeAlive() {\n return noExitRuntime || runtimeKeepaliveCounter > 0;\n }\n function preRun() {\n if (Module[\"preRun\"]) {\n if (typeof Module[\"preRun\"] == \"function\")\n Module[\"preRun\"] = [Module[\"preRun\"]];\n while (Module[\"preRun\"].length) {\n addOnPreRun(Module[\"preRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPRERUN__);\n }\n function initRuntime() {\n runtimeInitialized = true;\n callRuntimeCallbacks(__ATINIT__);\n }\n function exitRuntime() {\n runtimeExited = true;\n }\n function postRun() {\n if (Module[\"postRun\"]) {\n if (typeof Module[\"postRun\"] == \"function\")\n Module[\"postRun\"] = [Module[\"postRun\"]];\n while (Module[\"postRun\"].length) {\n addOnPostRun(Module[\"postRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPOSTRUN__);\n }\n function addOnPreRun(cb) {\n __ATPRERUN__.unshift(cb);\n }\n function addOnInit(cb) {\n __ATINIT__.unshift(cb);\n }\n function addOnPostRun(cb) {\n __ATPOSTRUN__.unshift(cb);\n }\n var runDependencies = 0;\n var runDependencyWatcher = null;\n var dependenciesFulfilled = null;\n function addRunDependency(id) {\n runDependencies++;\n if (Module[\"monitorRunDependencies\"]) {\n Module[\"monitorRunDependencies\"](runDependencies);\n }\n }\n function removeRunDependency(id) {\n runDependencies--;\n if (Module[\"monitorRunDependencies\"]) {\n Module[\"monitorRunDependencies\"](runDependencies);\n }\n if (runDependencies == 0) {\n if (runDependencyWatcher !== null) {\n clearInterval(runDependencyWatcher);\n runDependencyWatcher = null;\n }\n if (dependenciesFulfilled) {\n var callback = dependenciesFulfilled;\n dependenciesFulfilled = null;\n callback();\n }\n }\n }\n Module[\"preloadedImages\"] = {};\n Module[\"preloadedAudios\"] = {};\n function abort(what) {\n {\n if (Module[\"onAbort\"]) {\n Module[\"onAbort\"](what);\n }\n }\n what = \"Aborted(\" + what + \")\";\n err(what);\n ABORT = true;\n EXITSTATUS = 1;\n what += \". Build with -s ASSERTIONS=1 for more info.\";\n var e = new WebAssembly.RuntimeError(what);\n readyPromiseReject(e);\n throw e;\n }\n var dataURIPrefix = \"data:application/octet-stream;base64,\";\n function isDataURI(filename) {\n return filename.startsWith(dataURIPrefix);\n }\n function isFileURI(filename) {\n return filename.startsWith(\"file://\");\n }\n var wasmBinaryFile;\n wasmBinaryFile = \"tfjs-backend-wasm.wasm\";\n if (!isDataURI(wasmBinaryFile)) {\n wasmBinaryFile = locateFile(wasmBinaryFile);\n }\n function getBinary(file) {\n try {\n if (file == wasmBinaryFile && wasmBinary) {\n return new Uint8Array(wasmBinary);\n }\n if (readBinary) {\n return readBinary(file);\n } else {\n throw \"both async and sync fetching of the wasm failed\";\n }\n } catch (err2) {\n abort(err2);\n }\n }\n function getBinaryPromise() {\n if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\n if (typeof fetch === \"function\" && !isFileURI(wasmBinaryFile)) {\n return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(function(response) {\n if (!response[\"ok\"]) {\n throw \"failed to load wasm binary file at '\" + wasmBinaryFile + \"'\";\n }\n return response[\"arrayBuffer\"]();\n }).catch(function() {\n return getBinary(wasmBinaryFile);\n });\n } else {\n if (readAsync) {\n return new Promise(function(resolve, reject) {\n readAsync(wasmBinaryFile, function(response) {\n resolve(new Uint8Array(response));\n }, reject);\n });\n }\n }\n }\n return Promise.resolve().then(function() {\n return getBinary(wasmBinaryFile);\n });\n }\n function createWasm() {\n var info = { \"env\": asmLibraryArg, \"wasi_snapshot_preview1\": asmLibraryArg };\n function receiveInstance(instance, module2) {\n var exports3 = instance.exports;\n Module[\"asm\"] = exports3;\n wasmMemory = Module[\"asm\"][\"memory\"];\n updateGlobalBufferAndViews(wasmMemory.buffer);\n wasmTable = Module[\"asm\"][\"__indirect_function_table\"];\n addOnInit(Module[\"asm\"][\"__wasm_call_ctors\"]);\n removeRunDependency(\"wasm-instantiate\");\n }\n addRunDependency(\"wasm-instantiate\");\n function receiveInstantiationResult(result) {\n receiveInstance(result[\"instance\"]);\n }\n function instantiateArrayBuffer(receiver) {\n return getBinaryPromise().then(function(binary) {\n return WebAssembly.instantiate(binary, info);\n }).then(function(instance) {\n return instance;\n }).then(receiver, function(reason) {\n err(\"failed to asynchronously prepare wasm: \" + reason);\n abort(reason);\n });\n }\n function instantiateAsync() {\n if (!wasmBinary && typeof WebAssembly.instantiateStreaming === \"function\" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === \"function\") {\n return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(function(response) {\n var result = WebAssembly.instantiateStreaming(response, info);\n return result.then(receiveInstantiationResult, function(reason) {\n err(\"wasm streaming compile failed: \" + reason);\n err(\"falling back to ArrayBuffer instantiation\");\n return instantiateArrayBuffer(receiveInstantiationResult);\n });\n });\n } else {\n return instantiateArrayBuffer(receiveInstantiationResult);\n }\n }\n if (Module[\"instantiateWasm\"]) {\n try {\n var exports2 = Module[\"instantiateWasm\"](info, receiveInstance);\n return exports2;\n } catch (e) {\n err(\"Module.instantiateWasm callback failed with error: \" + e);\n return false;\n }\n }\n instantiateAsync().catch(readyPromiseReject);\n return {};\n }\n var tempDouble;\n var tempI64;\n function callRuntimeCallbacks(callbacks2) {\n while (callbacks2.length > 0) {\n var callback = callbacks2.shift();\n if (typeof callback == \"function\") {\n callback(Module);\n continue;\n }\n var func2 = callback.func;\n if (typeof func2 === \"number\") {\n if (callback.arg === void 0) {\n getWasmTableEntry(func2)();\n } else {\n getWasmTableEntry(func2)(callback.arg);\n }\n } else {\n func2(callback.arg === void 0 ? null : callback.arg);\n }\n }\n }\n function demangle(func2) {\n return func2;\n }\n function demangleAll(text) {\n var regex = /\\b_Z[\\w\\d_]+/g;\n return text.replace(regex, function(x) {\n var y = demangle(x);\n return x === y ? x : y + \" [\" + x + \"]\";\n });\n }\n var wasmTableMirror = [];\n function getWasmTableEntry(funcPtr) {\n var func2 = wasmTableMirror[funcPtr];\n if (!func2) {\n if (funcPtr >= wasmTableMirror.length)\n wasmTableMirror.length = funcPtr + 1;\n wasmTableMirror[funcPtr] = func2 = wasmTable.get(funcPtr);\n }\n return func2;\n }\n function jsStackTrace() {\n var error = new Error();\n if (!error.stack) {\n try {\n throw new Error();\n } catch (e) {\n error = e;\n }\n if (!error.stack) {\n return \"(no stack trace available)\";\n }\n }\n return error.stack.toString();\n }\n function setWasmTableEntry(idx, func2) {\n wasmTable.set(idx, func2);\n wasmTableMirror[idx] = func2;\n }\n function _abort() {\n abort(\"\");\n }\n function _emscripten_get_heap_max() {\n return 2147483648;\n }\n function _emscripten_memcpy_big(dest, src, num) {\n HEAPU8.copyWithin(dest, src, src + num);\n }\n function emscripten_realloc_buffer(size) {\n try {\n wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16);\n updateGlobalBufferAndViews(wasmMemory.buffer);\n return 1;\n } catch (e) {\n }\n }\n function _emscripten_resize_heap(requestedSize) {\n var oldSize = HEAPU8.length;\n requestedSize = requestedSize >>> 0;\n var maxHeapSize = _emscripten_get_heap_max();\n if (requestedSize > maxHeapSize) {\n return false;\n }\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\n var replacement = emscripten_realloc_buffer(newSize);\n if (replacement) {\n return true;\n }\n }\n return false;\n }\n var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) {\n var buffer3 = SYSCALLS.buffers[stream];\n if (curr === 0 || curr === 10) {\n (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0));\n buffer3.length = 0;\n } else {\n buffer3.push(curr);\n }\n }, varargs: void 0, get: function() {\n SYSCALLS.varargs += 4;\n var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];\n return ret;\n }, getStr: function(ptr) {\n var ret = UTF8ToString(ptr);\n return ret;\n }, get64: function(low, high) {\n return low;\n } };\n function _fd_close(fd) {\n return 0;\n }\n function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n }\n function _fd_write(fd, iov, iovcnt, pnum) {\n var num = 0;\n for (var i = 0; i < iovcnt; i++) {\n var ptr = HEAP32[iov >> 2];\n var len = HEAP32[iov + 4 >> 2];\n iov += 8;\n for (var j = 0; j < len; j++) {\n SYSCALLS.printChar(fd, HEAPU8[ptr + j]);\n }\n num += len;\n }\n HEAP32[pnum >> 2] = num;\n return 0;\n }\n function _setTempRet0(val) {\n setTempRet0(val);\n }\n var ASSERTIONS = false;\n var asmLibraryArg = { \"abort\": _abort, \"emscripten_get_heap_max\": _emscripten_get_heap_max, \"emscripten_memcpy_big\": _emscripten_memcpy_big, \"emscripten_resize_heap\": _emscripten_resize_heap, \"fd_close\": _fd_close, \"fd_seek\": _fd_seek, \"fd_write\": _fd_write, \"setTempRet0\": _setTempRet0 };\n var asm = createWasm();\n var ___wasm_call_ctors = Module[\"___wasm_call_ctors\"] = function() {\n return (___wasm_call_ctors = Module[\"___wasm_call_ctors\"] = Module[\"asm\"][\"__wasm_call_ctors\"]).apply(null, arguments);\n };\n var _init = Module[\"_init\"] = function() {\n return (_init = Module[\"_init\"] = Module[\"asm\"][\"init\"]).apply(null, arguments);\n };\n var _init_with_threads_count = Module[\"_init_with_threads_count\"] = function() {\n return (_init_with_threads_count = Module[\"_init_with_threads_count\"] = Module[\"asm\"][\"init_with_threads_count\"]).apply(null, arguments);\n };\n var _get_threads_count = Module[\"_get_threads_count\"] = function() {\n return (_get_threads_count = Module[\"_get_threads_count\"] = Module[\"asm\"][\"get_threads_count\"]).apply(null, arguments);\n };\n var _register_tensor = Module[\"_register_tensor\"] = function() {\n return (_register_tensor = Module[\"_register_tensor\"] = Module[\"asm\"][\"register_tensor\"]).apply(null, arguments);\n };\n var _dispose_data = Module[\"_dispose_data\"] = function() {\n return (_dispose_data = Module[\"_dispose_data\"] = Module[\"asm\"][\"dispose_data\"]).apply(null, arguments);\n };\n var _dispose = Module[\"_dispose\"] = function() {\n return (_dispose = Module[\"_dispose\"] = Module[\"asm\"][\"dispose\"]).apply(null, arguments);\n };\n var _Abs = Module[\"_Abs\"] = function() {\n return (_Abs = Module[\"_Abs\"] = Module[\"asm\"][\"Abs\"]).apply(null, arguments);\n };\n var _Add = Module[\"_Add\"] = function() {\n return (_Add = Module[\"_Add\"] = Module[\"asm\"][\"Add\"]).apply(null, arguments);\n };\n var _AddN = Module[\"_AddN\"] = function() {\n return (_AddN = Module[\"_AddN\"] = Module[\"asm\"][\"AddN\"]).apply(null, arguments);\n };\n var _All = Module[\"_All\"] = function() {\n return (_All = Module[\"_All\"] = Module[\"asm\"][\"All\"]).apply(null, arguments);\n };\n var _Any = Module[\"_Any\"] = function() {\n return (_Any = Module[\"_Any\"] = Module[\"asm\"][\"Any\"]).apply(null, arguments);\n };\n var _ArgMax = Module[\"_ArgMax\"] = function() {\n return (_ArgMax = Module[\"_ArgMax\"] = Module[\"asm\"][\"ArgMax\"]).apply(null, arguments);\n };\n var _AvgPool = Module[\"_AvgPool\"] = function() {\n return (_AvgPool = Module[\"_AvgPool\"] = Module[\"asm\"][\"AvgPool\"]).apply(null, arguments);\n };\n var _BatchMatMul = Module[\"_BatchMatMul\"] = function() {\n return (_BatchMatMul = Module[\"_BatchMatMul\"] = Module[\"asm\"][\"BatchMatMul\"]).apply(null, arguments);\n };\n var _Ceil = Module[\"_Ceil\"] = function() {\n return (_Ceil = Module[\"_Ceil\"] = Module[\"asm\"][\"Ceil\"]).apply(null, arguments);\n };\n var _ClipByValue = Module[\"_ClipByValue\"] = function() {\n return (_ClipByValue = Module[\"_ClipByValue\"] = Module[\"asm\"][\"ClipByValue\"]).apply(null, arguments);\n };\n var _Conv2D = Module[\"_Conv2D\"] = function() {\n return (_Conv2D = Module[\"_Conv2D\"] = Module[\"asm\"][\"Conv2D\"]).apply(null, arguments);\n };\n var _Conv2DBackpropInput = Module[\"_Conv2DBackpropInput\"] = function() {\n return (_Conv2DBackpropInput = Module[\"_Conv2DBackpropInput\"] = Module[\"asm\"][\"Conv2DBackpropInput\"]).apply(null, arguments);\n };\n var _Cos = Module[\"_Cos\"] = function() {\n return (_Cos = Module[\"_Cos\"] = Module[\"asm\"][\"Cos\"]).apply(null, arguments);\n };\n var _Cosh = Module[\"_Cosh\"] = function() {\n return (_Cosh = Module[\"_Cosh\"] = Module[\"asm\"][\"Cosh\"]).apply(null, arguments);\n };\n var _CropAndResize = Module[\"_CropAndResize\"] = function() {\n return (_CropAndResize = Module[\"_CropAndResize\"] = Module[\"asm\"][\"CropAndResize\"]).apply(null, arguments);\n };\n var _Cumprod = Module[\"_Cumprod\"] = function() {\n return (_Cumprod = Module[\"_Cumprod\"] = Module[\"asm\"][\"Cumprod\"]).apply(null, arguments);\n };\n var _Cumsum = Module[\"_Cumsum\"] = function() {\n return (_Cumsum = Module[\"_Cumsum\"] = Module[\"asm\"][\"Cumsum\"]).apply(null, arguments);\n };\n var _DepthToSpace = Module[\"_DepthToSpace\"] = function() {\n return (_DepthToSpace = Module[\"_DepthToSpace\"] = Module[\"asm\"][\"DepthToSpace\"]).apply(null, arguments);\n };\n var _DepthwiseConv2dNative = Module[\"_DepthwiseConv2dNative\"] = function() {\n return (_DepthwiseConv2dNative = Module[\"_DepthwiseConv2dNative\"] = Module[\"asm\"][\"DepthwiseConv2dNative\"]).apply(null, arguments);\n };\n var _Elu = Module[\"_Elu\"] = function() {\n return (_Elu = Module[\"_Elu\"] = Module[\"asm\"][\"Elu\"]).apply(null, arguments);\n };\n var _Equal = Module[\"_Equal\"] = function() {\n return (_Equal = Module[\"_Equal\"] = Module[\"asm\"][\"Equal\"]).apply(null, arguments);\n };\n var _Exp = Module[\"_Exp\"] = function() {\n return (_Exp = Module[\"_Exp\"] = Module[\"asm\"][\"Exp\"]).apply(null, arguments);\n };\n var _FlipLeftRight = Module[\"_FlipLeftRight\"] = function() {\n return (_FlipLeftRight = Module[\"_FlipLeftRight\"] = Module[\"asm\"][\"FlipLeftRight\"]).apply(null, arguments);\n };\n var _Floor = Module[\"_Floor\"] = function() {\n return (_Floor = Module[\"_Floor\"] = Module[\"asm\"][\"Floor\"]).apply(null, arguments);\n };\n var _FloorDiv = Module[\"_FloorDiv\"] = function() {\n return (_FloorDiv = Module[\"_FloorDiv\"] = Module[\"asm\"][\"FloorDiv\"]).apply(null, arguments);\n };\n var _FusedBatchNorm = Module[\"_FusedBatchNorm\"] = function() {\n return (_FusedBatchNorm = Module[\"_FusedBatchNorm\"] = Module[\"asm\"][\"FusedBatchNorm\"]).apply(null, arguments);\n };\n var _FusedConv2D = Module[\"_FusedConv2D\"] = function() {\n return (_FusedConv2D = Module[\"_FusedConv2D\"] = Module[\"asm\"][\"FusedConv2D\"]).apply(null, arguments);\n };\n var _FusedDepthwiseConv2D = Module[\"_FusedDepthwiseConv2D\"] = function() {\n return (_FusedDepthwiseConv2D = Module[\"_FusedDepthwiseConv2D\"] = Module[\"asm\"][\"FusedDepthwiseConv2D\"]).apply(null, arguments);\n };\n var _Gather = Module[\"_Gather\"] = function() {\n return (_Gather = Module[\"_Gather\"] = Module[\"asm\"][\"Gather\"]).apply(null, arguments);\n };\n var _GatherNd = Module[\"_GatherNd\"] = function() {\n return (_GatherNd = Module[\"_GatherNd\"] = Module[\"asm\"][\"GatherNd\"]).apply(null, arguments);\n };\n var _Greater = Module[\"_Greater\"] = function() {\n return (_Greater = Module[\"_Greater\"] = Module[\"asm\"][\"Greater\"]).apply(null, arguments);\n };\n var _GreaterEqual = Module[\"_GreaterEqual\"] = function() {\n return (_GreaterEqual = Module[\"_GreaterEqual\"] = Module[\"asm\"][\"GreaterEqual\"]).apply(null, arguments);\n };\n var _LeakyRelu = Module[\"_LeakyRelu\"] = function() {\n return (_LeakyRelu = Module[\"_LeakyRelu\"] = Module[\"asm\"][\"LeakyRelu\"]).apply(null, arguments);\n };\n var _Less = Module[\"_Less\"] = function() {\n return (_Less = Module[\"_Less\"] = Module[\"asm\"][\"Less\"]).apply(null, arguments);\n };\n var _LessEqual = Module[\"_LessEqual\"] = function() {\n return (_LessEqual = Module[\"_LessEqual\"] = Module[\"asm\"][\"LessEqual\"]).apply(null, arguments);\n };\n var _Log = Module[\"_Log\"] = function() {\n return (_Log = Module[\"_Log\"] = Module[\"asm\"][\"Log\"]).apply(null, arguments);\n };\n var _LogicalAnd = Module[\"_LogicalAnd\"] = function() {\n return (_LogicalAnd = Module[\"_LogicalAnd\"] = Module[\"asm\"][\"LogicalAnd\"]).apply(null, arguments);\n };\n var _LogicalNot = Module[\"_LogicalNot\"] = function() {\n return (_LogicalNot = Module[\"_LogicalNot\"] = Module[\"asm\"][\"LogicalNot\"]).apply(null, arguments);\n };\n var _LogicalOr = Module[\"_LogicalOr\"] = function() {\n return (_LogicalOr = Module[\"_LogicalOr\"] = Module[\"asm\"][\"LogicalOr\"]).apply(null, arguments);\n };\n var _LogicalXor = Module[\"_LogicalXor\"] = function() {\n return (_LogicalXor = Module[\"_LogicalXor\"] = Module[\"asm\"][\"LogicalXor\"]).apply(null, arguments);\n };\n var _Max = Module[\"_Max\"] = function() {\n return (_Max = Module[\"_Max\"] = Module[\"asm\"][\"Max\"]).apply(null, arguments);\n };\n var _MaxPool = Module[\"_MaxPool\"] = function() {\n return (_MaxPool = Module[\"_MaxPool\"] = Module[\"asm\"][\"MaxPool\"]).apply(null, arguments);\n };\n var _Maximum = Module[\"_Maximum\"] = function() {\n return (_Maximum = Module[\"_Maximum\"] = Module[\"asm\"][\"Maximum\"]).apply(null, arguments);\n };\n var _Mean = Module[\"_Mean\"] = function() {\n return (_Mean = Module[\"_Mean\"] = Module[\"asm\"][\"Mean\"]).apply(null, arguments);\n };\n var _Min = Module[\"_Min\"] = function() {\n return (_Min = Module[\"_Min\"] = Module[\"asm\"][\"Min\"]).apply(null, arguments);\n };\n var _Minimum = Module[\"_Minimum\"] = function() {\n return (_Minimum = Module[\"_Minimum\"] = Module[\"asm\"][\"Minimum\"]).apply(null, arguments);\n };\n var _MirrorPad = Module[\"_MirrorPad\"] = function() {\n return (_MirrorPad = Module[\"_MirrorPad\"] = Module[\"asm\"][\"MirrorPad\"]).apply(null, arguments);\n };\n var _Multiply = Module[\"_Multiply\"] = function() {\n return (_Multiply = Module[\"_Multiply\"] = Module[\"asm\"][\"Multiply\"]).apply(null, arguments);\n };\n var _Neg = Module[\"_Neg\"] = function() {\n return (_Neg = Module[\"_Neg\"] = Module[\"asm\"][\"Neg\"]).apply(null, arguments);\n };\n var _NonMaxSuppressionV3 = Module[\"_NonMaxSuppressionV3\"] = function() {\n return (_NonMaxSuppressionV3 = Module[\"_NonMaxSuppressionV3\"] = Module[\"asm\"][\"NonMaxSuppressionV3\"]).apply(null, arguments);\n };\n var _NonMaxSuppressionV4 = Module[\"_NonMaxSuppressionV4\"] = function() {\n return (_NonMaxSuppressionV4 = Module[\"_NonMaxSuppressionV4\"] = Module[\"asm\"][\"NonMaxSuppressionV4\"]).apply(null, arguments);\n };\n var _NonMaxSuppressionV5 = Module[\"_NonMaxSuppressionV5\"] = function() {\n return (_NonMaxSuppressionV5 = Module[\"_NonMaxSuppressionV5\"] = Module[\"asm\"][\"NonMaxSuppressionV5\"]).apply(null, arguments);\n };\n var _NotEqual = Module[\"_NotEqual\"] = function() {\n return (_NotEqual = Module[\"_NotEqual\"] = Module[\"asm\"][\"NotEqual\"]).apply(null, arguments);\n };\n var _OneHot = Module[\"_OneHot\"] = function() {\n return (_OneHot = Module[\"_OneHot\"] = Module[\"asm\"][\"OneHot\"]).apply(null, arguments);\n };\n var _PadV2 = Module[\"_PadV2\"] = function() {\n return (_PadV2 = Module[\"_PadV2\"] = Module[\"asm\"][\"PadV2\"]).apply(null, arguments);\n };\n var _Pow = Module[\"_Pow\"] = function() {\n return (_Pow = Module[\"_Pow\"] = Module[\"asm\"][\"Pow\"]).apply(null, arguments);\n };\n var _Prelu = Module[\"_Prelu\"] = function() {\n return (_Prelu = Module[\"_Prelu\"] = Module[\"asm\"][\"Prelu\"]).apply(null, arguments);\n };\n var _Prod = Module[\"_Prod\"] = function() {\n return (_Prod = Module[\"_Prod\"] = Module[\"asm\"][\"Prod\"]).apply(null, arguments);\n };\n var _RealDiv = Module[\"_RealDiv\"] = function() {\n return (_RealDiv = Module[\"_RealDiv\"] = Module[\"asm\"][\"RealDiv\"]).apply(null, arguments);\n };\n var _Relu = Module[\"_Relu\"] = function() {\n return (_Relu = Module[\"_Relu\"] = Module[\"asm\"][\"Relu\"]).apply(null, arguments);\n };\n var _Relu6 = Module[\"_Relu6\"] = function() {\n return (_Relu6 = Module[\"_Relu6\"] = Module[\"asm\"][\"Relu6\"]).apply(null, arguments);\n };\n var _ResizeBilinear = Module[\"_ResizeBilinear\"] = function() {\n return (_ResizeBilinear = Module[\"_ResizeBilinear\"] = Module[\"asm\"][\"ResizeBilinear\"]).apply(null, arguments);\n };\n var _ResizeNearestNeighbor = Module[\"_ResizeNearestNeighbor\"] = function() {\n return (_ResizeNearestNeighbor = Module[\"_ResizeNearestNeighbor\"] = Module[\"asm\"][\"ResizeNearestNeighbor\"]).apply(null, arguments);\n };\n var _Reverse = Module[\"_Reverse\"] = function() {\n return (_Reverse = Module[\"_Reverse\"] = Module[\"asm\"][\"Reverse\"]).apply(null, arguments);\n };\n var _RotateWithOffset = Module[\"_RotateWithOffset\"] = function() {\n return (_RotateWithOffset = Module[\"_RotateWithOffset\"] = Module[\"asm\"][\"RotateWithOffset\"]).apply(null, arguments);\n };\n var _Round = Module[\"_Round\"] = function() {\n return (_Round = Module[\"_Round\"] = Module[\"asm\"][\"Round\"]).apply(null, arguments);\n };\n var _Rsqrt = Module[\"_Rsqrt\"] = function() {\n return (_Rsqrt = Module[\"_Rsqrt\"] = Module[\"asm\"][\"Rsqrt\"]).apply(null, arguments);\n };\n var _ScatterNd = Module[\"_ScatterNd\"] = function() {\n return (_ScatterNd = Module[\"_ScatterNd\"] = Module[\"asm\"][\"ScatterNd\"]).apply(null, arguments);\n };\n var _SelectV2 = Module[\"_SelectV2\"] = function() {\n return (_SelectV2 = Module[\"_SelectV2\"] = Module[\"asm\"][\"SelectV2\"]).apply(null, arguments);\n };\n var _Sigmoid = Module[\"_Sigmoid\"] = function() {\n return (_Sigmoid = Module[\"_Sigmoid\"] = Module[\"asm\"][\"Sigmoid\"]).apply(null, arguments);\n };\n var _Sin = Module[\"_Sin\"] = function() {\n return (_Sin = Module[\"_Sin\"] = Module[\"asm\"][\"Sin\"]).apply(null, arguments);\n };\n var _Softmax = Module[\"_Softmax\"] = function() {\n return (_Softmax = Module[\"_Softmax\"] = Module[\"asm\"][\"Softmax\"]).apply(null, arguments);\n };\n var _SparseFillEmptyRows = Module[\"_SparseFillEmptyRows\"] = function() {\n return (_SparseFillEmptyRows = Module[\"_SparseFillEmptyRows\"] = Module[\"asm\"][\"SparseFillEmptyRows\"]).apply(null, arguments);\n };\n var _SparseReshape = Module[\"_SparseReshape\"] = function() {\n return (_SparseReshape = Module[\"_SparseReshape\"] = Module[\"asm\"][\"SparseReshape\"]).apply(null, arguments);\n };\n var _SparseSegmentReduction = Module[\"_SparseSegmentReduction\"] = function() {\n return (_SparseSegmentReduction = Module[\"_SparseSegmentReduction\"] = Module[\"asm\"][\"SparseSegmentReduction\"]).apply(null, arguments);\n };\n var _Sqrt = Module[\"_Sqrt\"] = function() {\n return (_Sqrt = Module[\"_Sqrt\"] = Module[\"asm\"][\"Sqrt\"]).apply(null, arguments);\n };\n var _Square = Module[\"_Square\"] = function() {\n return (_Square = Module[\"_Square\"] = Module[\"asm\"][\"Square\"]).apply(null, arguments);\n };\n var _SquaredDifference = Module[\"_SquaredDifference\"] = function() {\n return (_SquaredDifference = Module[\"_SquaredDifference\"] = Module[\"asm\"][\"SquaredDifference\"]).apply(null, arguments);\n };\n var _Step = Module[\"_Step\"] = function() {\n return (_Step = Module[\"_Step\"] = Module[\"asm\"][\"Step\"]).apply(null, arguments);\n };\n var _StridedSlice = Module[\"_StridedSlice\"] = function() {\n return (_StridedSlice = Module[\"_StridedSlice\"] = Module[\"asm\"][\"StridedSlice\"]).apply(null, arguments);\n };\n var _Sub = Module[\"_Sub\"] = function() {\n return (_Sub = Module[\"_Sub\"] = Module[\"asm\"][\"Sub\"]).apply(null, arguments);\n };\n var _Sum = Module[\"_Sum\"] = function() {\n return (_Sum = Module[\"_Sum\"] = Module[\"asm\"][\"Sum\"]).apply(null, arguments);\n };\n var _Tan = Module[\"_Tan\"] = function() {\n return (_Tan = Module[\"_Tan\"] = Module[\"asm\"][\"Tan\"]).apply(null, arguments);\n };\n var _Tanh = Module[\"_Tanh\"] = function() {\n return (_Tanh = Module[\"_Tanh\"] = Module[\"asm\"][\"Tanh\"]).apply(null, arguments);\n };\n var _Tile = Module[\"_Tile\"] = function() {\n return (_Tile = Module[\"_Tile\"] = Module[\"asm\"][\"Tile\"]).apply(null, arguments);\n };\n var _TopK = Module[\"_TopK\"] = function() {\n return (_TopK = Module[\"_TopK\"] = Module[\"asm\"][\"TopK\"]).apply(null, arguments);\n };\n var _Transform = Module[\"_Transform\"] = function() {\n return (_Transform = Module[\"_Transform\"] = Module[\"asm\"][\"Transform\"]).apply(null, arguments);\n };\n var _Transpose = Module[\"_Transpose\"] = function() {\n return (_Transpose = Module[\"_Transpose\"] = Module[\"asm\"][\"Transpose\"]).apply(null, arguments);\n };\n var __FusedMatMul = Module[\"__FusedMatMul\"] = function() {\n return (__FusedMatMul = Module[\"__FusedMatMul\"] = Module[\"asm\"][\"_FusedMatMul\"]).apply(null, arguments);\n };\n var _malloc = Module[\"_malloc\"] = function() {\n return (_malloc = Module[\"_malloc\"] = Module[\"asm\"][\"malloc\"]).apply(null, arguments);\n };\n var _free = Module[\"_free\"] = function() {\n return (_free = Module[\"_free\"] = Module[\"asm\"][\"free\"]).apply(null, arguments);\n };\n var ___errno_location = Module[\"___errno_location\"] = function() {\n return (___errno_location = Module[\"___errno_location\"] = Module[\"asm\"][\"__errno_location\"]).apply(null, arguments);\n };\n var _emscripten_main_thread_process_queued_calls = Module[\"_emscripten_main_thread_process_queued_calls\"] = function() {\n return (_emscripten_main_thread_process_queued_calls = Module[\"_emscripten_main_thread_process_queued_calls\"] = Module[\"asm\"][\"emscripten_main_thread_process_queued_calls\"]).apply(null, arguments);\n };\n var stackSave = Module[\"stackSave\"] = function() {\n return (stackSave = Module[\"stackSave\"] = Module[\"asm\"][\"stackSave\"]).apply(null, arguments);\n };\n var stackRestore = Module[\"stackRestore\"] = function() {\n return (stackRestore = Module[\"stackRestore\"] = Module[\"asm\"][\"stackRestore\"]).apply(null, arguments);\n };\n var stackAlloc = Module[\"stackAlloc\"] = function() {\n return (stackAlloc = Module[\"stackAlloc\"] = Module[\"asm\"][\"stackAlloc\"]).apply(null, arguments);\n };\n var dynCall_iijjiiii = Module[\"dynCall_iijjiiii\"] = function() {\n return (dynCall_iijjiiii = Module[\"dynCall_iijjiiii\"] = Module[\"asm\"][\"dynCall_iijjiiii\"]).apply(null, arguments);\n };\n var dynCall_jiji = Module[\"dynCall_jiji\"] = function() {\n return (dynCall_jiji = Module[\"dynCall_jiji\"] = Module[\"asm\"][\"dynCall_jiji\"]).apply(null, arguments);\n };\n Module[\"cwrap\"] = cwrap;\n var calledRun;\n function ExitStatus(status) {\n this.name = \"ExitStatus\";\n this.message = \"Program terminated with exit(\" + status + \")\";\n this.status = status;\n }\n dependenciesFulfilled = function runCaller() {\n if (!calledRun)\n run();\n if (!calledRun)\n dependenciesFulfilled = runCaller;\n };\n function run(args) {\n args = args || arguments_;\n if (runDependencies > 0) {\n return;\n }\n preRun();\n if (runDependencies > 0) {\n return;\n }\n function doRun() {\n if (calledRun)\n return;\n calledRun = true;\n Module[\"calledRun\"] = true;\n if (ABORT)\n return;\n initRuntime();\n readyPromiseResolve(Module);\n if (Module[\"onRuntimeInitialized\"])\n Module[\"onRuntimeInitialized\"]();\n postRun();\n }\n if (Module[\"setStatus\"]) {\n Module[\"setStatus\"](\"Running...\");\n setTimeout(function() {\n setTimeout(function() {\n Module[\"setStatus\"](\"\");\n }, 1);\n doRun();\n }, 1);\n } else {\n doRun();\n }\n }\n Module[\"run\"] = run;\n function procExit(code) {\n EXITSTATUS = code;\n if (!keepRuntimeAlive()) {\n if (Module[\"onExit\"])\n Module[\"onExit\"](code);\n ABORT = true;\n }\n quit_(code, new ExitStatus(code));\n }\n if (Module[\"preInit\"]) {\n if (typeof Module[\"preInit\"] == \"function\")\n Module[\"preInit\"] = [Module[\"preInit\"]];\n while (Module[\"preInit\"].length > 0) {\n Module[\"preInit\"].pop()();\n }\n }\n run();\n var listenersAdded;\n if (beforeListeners) {\n listenersAdded = { uncaughtException: process.listeners(\"uncaughtException\").filter(function(listener) {\n return !beforeListeners.uncaughtException.indexOf(listener) > -1;\n }), unhandledRejection: process.listeners(\"unhandledRejection\").filter(function(listener) {\n return !beforeListeners.unhandledRejection.indexOf(listener) > -1;\n }) };\n }\n var actualModule;\n if (typeof WasmBackendModule3 !== \"undefined\") {\n actualModule = WasmBackendModule3;\n } else if (typeof WasmBackendModuleThreadedSimd !== \"undefined\") {\n actualModule = WasmBackendModuleThreadedSimd;\n } else {\n throw new Error(\"Could not find wasm module in post.js\");\n }\n if (listenersAdded) {\n var tmpDispose = actualModule[\"_dispose\"];\n actualModule[\"_dispose\"] = function() {\n tmpDispose();\n listenersAdded.uncaughtException.forEach(function(listener) {\n process.removeListener(\"uncaughtException\", listener);\n });\n listenersAdded.unhandledRejection.forEach(function(listener) {\n process.removeListener(\"unhandledRejection\", listener);\n });\n };\n }\n return WasmBackendModule3.ready;\n };\n })();\n if (typeof exports === \"object\" && typeof module === \"object\")\n module.exports = WasmBackendModule2;\n else if (typeof define === \"function\" && define[\"amd\"])\n define([], function() {\n return WasmBackendModule2;\n });\n else if (typeof exports === \"object\")\n exports[\"WasmBackendModule\"] = WasmBackendModule2;\n }\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/backends/backend.js\nvar EPSILON_FLOAT32 = 1e-7;\nvar EPSILON_FLOAT16 = 1e-4;\nvar DataStorage = class {\n constructor(backend2, dataMover) {\n this.backend = backend2;\n this.dataMover = dataMover;\n this.data = /* @__PURE__ */ new WeakMap();\n this.dataIdsCount = 0;\n }\n get(dataId) {\n if (!this.data.has(dataId)) {\n this.dataMover.moveData(this.backend, dataId);\n }\n return this.data.get(dataId);\n }\n set(dataId, value) {\n this.dataIdsCount++;\n this.data.set(dataId, value);\n }\n has(dataId) {\n return this.data.has(dataId);\n }\n delete(dataId) {\n this.dataIdsCount--;\n return this.data.delete(dataId);\n }\n numDataIds() {\n return this.dataIdsCount;\n }\n};\nvar KernelBackend = class {\n refCount(dataId) {\n return notYetImplemented(\"refCount\");\n }\n incRef(dataId) {\n return notYetImplemented(\"incRef\");\n }\n timerAvailable() {\n return true;\n }\n time(f) {\n return notYetImplemented(\"time\");\n }\n read(dataId) {\n return notYetImplemented(\"read\");\n }\n readSync(dataId) {\n return notYetImplemented(\"readSync\");\n }\n readToGPU(dataId, options) {\n return notYetImplemented(\"readToGPU\");\n }\n numDataIds() {\n return notYetImplemented(\"numDataIds\");\n }\n disposeData(dataId, force) {\n return notYetImplemented(\"disposeData\");\n }\n write(values, shape, dtype) {\n return notYetImplemented(\"write\");\n }\n move(dataId, values, shape, dtype, refCount) {\n return notYetImplemented(\"move\");\n }\n memory() {\n return notYetImplemented(\"memory\");\n }\n floatPrecision() {\n return notYetImplemented(\"floatPrecision\");\n }\n epsilon() {\n return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16;\n }\n dispose() {\n return notYetImplemented(\"dispose\");\n }\n};\nfunction notYetImplemented(kernelName) {\n 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`);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/util_base.js\nfunction shuffle(array2) {\n let counter = array2.length;\n let index = 0;\n while (counter > 0) {\n index = Math.random() * counter | 0;\n counter--;\n swap(array2, counter, index);\n }\n}\nfunction shuffleCombo(array2, array22) {\n if (array2.length !== array22.length) {\n throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`);\n }\n let counter = array2.length;\n let index = 0;\n while (counter > 0) {\n index = Math.random() * counter | 0;\n counter--;\n swap(array2, counter, index);\n swap(array22, counter, index);\n }\n}\nfunction clamp(min7, x, max7) {\n return Math.max(min7, Math.min(x, max7));\n}\nfunction nearestLargerEven(val) {\n return val % 2 === 0 ? val : val + 1;\n}\nfunction swap(object, left, right) {\n const temp = object[left];\n object[left] = object[right];\n object[right] = temp;\n}\nfunction sum(arr) {\n let sum7 = 0;\n for (let i = 0; i < arr.length; i++) {\n sum7 += arr[i];\n }\n return sum7;\n}\nfunction randUniform(a, b) {\n const r = Math.random();\n return b * r + (1 - r) * a;\n}\nfunction distSquared(a, b) {\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n const diff = Number(a[i]) - Number(b[i]);\n result += diff * diff;\n }\n return result;\n}\nfunction assert(expr, msg) {\n if (!expr) {\n throw new Error(typeof msg === \"string\" ? msg : msg());\n }\n}\nfunction assertShapesMatch(shapeA, shapeB, errorMessagePrefix = \"\") {\n assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`);\n}\nfunction assertNonNull(a) {\n assert(a != null, () => `The input to the tensor constructor must be a non-null value.`);\n}\nfunction flatten(arr, result = [], skipTypedArray = false) {\n if (result == null) {\n result = [];\n }\n if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) {\n for (let i = 0; i < arr.length; ++i) {\n flatten(arr[i], result, skipTypedArray);\n }\n } else {\n result.push(arr);\n }\n return result;\n}\nfunction sizeFromShape(shape) {\n if (shape.length === 0) {\n return 1;\n }\n let size = shape[0];\n for (let i = 1; i < shape.length; i++) {\n size *= shape[i];\n }\n return size;\n}\nfunction isScalarShape(shape) {\n return shape.length === 0;\n}\nfunction arraysEqual(n1, n2) {\n if (n1 === n2) {\n return true;\n }\n if (n1 == null || n2 == null) {\n return false;\n }\n if (n1.length !== n2.length) {\n return false;\n }\n for (let i = 0; i < n1.length; i++) {\n if (n1[i] !== n2[i]) {\n return false;\n }\n }\n return true;\n}\nfunction isInt(a) {\n return a % 1 === 0;\n}\nfunction tanh(x) {\n if (Math.tanh != null) {\n return Math.tanh(x);\n }\n if (x === Infinity) {\n return 1;\n } else if (x === -Infinity) {\n return -1;\n } else {\n const e2x = Math.exp(2 * x);\n return (e2x - 1) / (e2x + 1);\n }\n}\nfunction sizeToSquarishShape(size) {\n const width = Math.ceil(Math.sqrt(size));\n return [width, Math.ceil(size / width)];\n}\nfunction createShuffledIndices(n) {\n const shuffledIndices = new Uint32Array(n);\n for (let i = 0; i < n; ++i) {\n shuffledIndices[i] = i;\n }\n shuffle(shuffledIndices);\n return shuffledIndices;\n}\nfunction rightPad(a, size) {\n if (size <= a.length) {\n return a;\n }\n return a + \" \".repeat(size - a.length);\n}\nfunction repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) {\n return new Promise((resolve, reject) => {\n let tryCount = 0;\n const tryFn = () => {\n if (checkFn()) {\n resolve();\n return;\n }\n tryCount++;\n const nextBackoff = delayFn(tryCount);\n if (maxCounter != null && tryCount >= maxCounter) {\n reject();\n return;\n }\n setTimeout(tryFn, nextBackoff);\n };\n tryFn();\n });\n}\nfunction inferFromImplicitShape(shape, size) {\n let shapeProd = 1;\n let implicitIdx = -1;\n for (let i = 0; i < shape.length; ++i) {\n if (shape[i] >= 0) {\n shapeProd *= shape[i];\n } else if (shape[i] === -1) {\n if (implicitIdx !== -1) {\n throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`);\n }\n implicitIdx = i;\n } else if (shape[i] < 0) {\n throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`);\n }\n }\n if (implicitIdx === -1) {\n if (size > 0 && size !== shapeProd) {\n throw Error(`Size(${size}) must match the product of shape ${shape}`);\n }\n return shape;\n }\n if (shapeProd === 0) {\n throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`);\n }\n if (size % shapeProd !== 0) {\n throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`);\n }\n const newShape = shape.slice();\n newShape[implicitIdx] = size / shapeProd;\n return newShape;\n}\nfunction parseAxisParam(axis, shape) {\n const rank = shape.length;\n axis = axis == null ? shape.map((s, i) => i) : [].concat(axis);\n assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`);\n assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`);\n return axis.map((a) => a < 0 ? rank + a : a);\n}\nfunction squeezeShape(shape, axis) {\n const newShape = [];\n const keptDims = [];\n const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0;\n const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort();\n let j = 0;\n for (let i = 0; i < shape.length; ++i) {\n if (axes != null) {\n if (axes[j] === i && shape[i] !== 1) {\n throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`);\n }\n if ((axes[j] == null || axes[j] > i) && shape[i] === 1) {\n newShape.push(shape[i]);\n keptDims.push(i);\n }\n if (axes[j] <= i) {\n j++;\n }\n }\n if (shape[i] !== 1) {\n newShape.push(shape[i]);\n keptDims.push(i);\n }\n }\n return { newShape, keptDims };\n}\nfunction getTypedArrayFromDType(dtype, size) {\n let values = null;\n if (dtype == null || dtype === \"float32\") {\n values = new Float32Array(size);\n } else if (dtype === \"int32\") {\n values = new Int32Array(size);\n } else if (dtype === \"bool\") {\n values = new Uint8Array(size);\n } else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n return values;\n}\nfunction getArrayFromDType(dtype, size) {\n let values = null;\n if (dtype == null || dtype === \"float32\") {\n values = new Float32Array(size);\n } else if (dtype === \"int32\") {\n values = new Int32Array(size);\n } else if (dtype === \"bool\") {\n values = new Uint8Array(size);\n } else if (dtype === \"string\") {\n values = new Array(size);\n } else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n return values;\n}\nfunction checkConversionForErrors(vals, dtype) {\n for (let i = 0; i < vals.length; i++) {\n const num = vals[i];\n if (isNaN(num) || !isFinite(num)) {\n throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`);\n }\n }\n}\nfunction isValidDtype(dtype) {\n return dtype === \"bool\" || dtype === \"complex64\" || dtype === \"float32\" || dtype === \"int32\" || dtype === \"string\";\n}\nfunction hasEncodingLoss(oldType, newType) {\n if (newType === \"complex64\") {\n return false;\n }\n if (newType === \"float32\" && oldType !== \"complex64\") {\n return false;\n }\n if (newType === \"int32\" && oldType !== \"float32\" && oldType !== \"complex64\") {\n return false;\n }\n if (newType === \"bool\" && oldType === \"bool\") {\n return false;\n }\n return true;\n}\nfunction isTypedArray(a) {\n return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array || a instanceof Uint8ClampedArray;\n}\nfunction bytesPerElement(dtype) {\n if (dtype === \"float32\" || dtype === \"int32\") {\n return 4;\n } else if (dtype === \"complex64\") {\n return 8;\n } else if (dtype === \"bool\") {\n return 1;\n } else {\n throw new Error(`Unknown dtype ${dtype}`);\n }\n}\nfunction bytesFromStringArray(arr) {\n if (arr == null) {\n return 0;\n }\n let bytes = 0;\n arr.forEach((x) => bytes += x.length);\n return bytes;\n}\nfunction isString(value) {\n return typeof value === \"string\" || value instanceof String;\n}\nfunction isBoolean(value) {\n return typeof value === \"boolean\";\n}\nfunction isNumber(value) {\n return typeof value === \"number\";\n}\nfunction inferDtype(values) {\n if (Array.isArray(values)) {\n return inferDtype(values[0]);\n }\n if (values instanceof Float32Array) {\n return \"float32\";\n } else if (values instanceof Int32Array || values instanceof Uint8Array || values instanceof Uint8ClampedArray) {\n return \"int32\";\n } else if (isNumber(values)) {\n return \"float32\";\n } else if (isString(values)) {\n return \"string\";\n } else if (isBoolean(values)) {\n return \"bool\";\n }\n return \"float32\";\n}\nfunction isFunction(f) {\n return !!(f && f.constructor && f.call && f.apply);\n}\nfunction nearestDivisor(size, start) {\n for (let i = start; i < size; ++i) {\n if (size % i === 0) {\n return i;\n }\n }\n return size;\n}\nfunction computeStrides(shape) {\n const rank = shape.length;\n if (rank < 2) {\n return [];\n }\n const strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n return strides;\n}\nfunction createNestedArray(offset, shape, a, isComplex = false) {\n const ret = new Array();\n if (shape.length === 1) {\n const d = shape[0] * (isComplex ? 2 : 1);\n for (let i = 0; i < d; i++) {\n ret[i] = a[offset + i];\n }\n } else {\n const d = shape[0];\n const rest = shape.slice(1);\n const len = rest.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1);\n for (let i = 0; i < d; i++) {\n ret[i] = createNestedArray(offset + i * len, rest, a, isComplex);\n }\n }\n return ret;\n}\nfunction toNestedArray(shape, a, isComplex = false) {\n if (shape.length === 0) {\n return a[0];\n }\n const size = shape.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1);\n if (size === 0) {\n return [];\n }\n if (size !== a.length) {\n throw new Error(`[${shape}] does not match the input size ${a.length}${isComplex ? \" for a complex tensor\" : \"\"}.`);\n }\n return createNestedArray(0, shape, a, isComplex);\n}\nfunction makeOnesTypedArray(size, dtype) {\n const array2 = makeZerosTypedArray(size, dtype);\n for (let i = 0; i < array2.length; i++) {\n array2[i] = 1;\n }\n return array2;\n}\nfunction makeZerosTypedArray(size, dtype) {\n if (dtype == null || dtype === \"float32\" || dtype === \"complex64\") {\n return new Float32Array(size);\n } else if (dtype === \"int32\") {\n return new Int32Array(size);\n } else if (dtype === \"bool\") {\n return new Uint8Array(size);\n } else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n}\nfunction makeZerosNestedTypedArray(shape, dtype) {\n const size = shape.reduce((prev, curr) => prev * curr, 1);\n if (dtype == null || dtype === \"float32\") {\n return toNestedArray(shape, new Float32Array(size));\n } else if (dtype === \"int32\") {\n return toNestedArray(shape, new Int32Array(size));\n } else if (dtype === \"bool\") {\n return toNestedArray(shape, new Uint8Array(size));\n } else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n}\nfunction assertNonNegativeIntegerDimensions(shape) {\n shape.forEach((dimSize) => {\n assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`);\n });\n}\nfunction locToIndex(locs, rank, strides) {\n if (rank === 0) {\n return 0;\n } else if (rank === 1) {\n return locs[0];\n }\n let index = locs[locs.length - 1];\n for (let i = 0; i < locs.length - 1; ++i) {\n index += strides[i] * locs[i];\n }\n return index;\n}\nfunction indexToLoc(index, rank, strides) {\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [index];\n }\n const locs = new Array(rank);\n for (let i = 0; i < locs.length - 1; ++i) {\n locs[i] = Math.floor(index / strides[i]);\n index -= locs[i] * strides[i];\n }\n locs[locs.length - 1] = index;\n return locs;\n}\nfunction isPromise(object) {\n return object && object.then && typeof object.then === \"function\";\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/environment.js\nvar TENSORFLOWJS_FLAGS_PREFIX = \"tfjsflags\";\nvar Environment = class {\n constructor(global2) {\n this.global = global2;\n this.flags = {};\n this.flagRegistry = {};\n this.urlFlags = {};\n this.getQueryParams = getQueryParams;\n this.populateURLFlags();\n }\n setPlatform(platformName, platform) {\n if (this.platform != null) {\n if (!(env().getBool(\"IS_TEST\") || env().getBool(\"PROD\"))) {\n console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platformName}.`);\n }\n }\n this.platformName = platformName;\n this.platform = platform;\n }\n registerFlag(flagName, evaluationFn, setHook) {\n this.flagRegistry[flagName] = { evaluationFn, setHook };\n if (this.urlFlags[flagName] != null) {\n const flagValue = this.urlFlags[flagName];\n if (!(env().getBool(\"IS_TEST\") || env().getBool(\"PROD\"))) {\n console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`);\n }\n this.set(flagName, flagValue);\n }\n }\n async getAsync(flagName) {\n if (flagName in this.flags) {\n return this.flags[flagName];\n }\n this.flags[flagName] = await this.evaluateFlag(flagName);\n return this.flags[flagName];\n }\n get(flagName) {\n if (flagName in this.flags) {\n return this.flags[flagName];\n }\n const flagValue = this.evaluateFlag(flagName);\n if (isPromise(flagValue)) {\n throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`);\n }\n this.flags[flagName] = flagValue;\n return this.flags[flagName];\n }\n getNumber(flagName) {\n return this.get(flagName);\n }\n getBool(flagName) {\n return this.get(flagName);\n }\n getFlags() {\n return this.flags;\n }\n get features() {\n return this.flags;\n }\n set(flagName, value) {\n if (this.flagRegistry[flagName] == null) {\n throw new Error(`Cannot set flag ${flagName} as it has not been registered.`);\n }\n this.flags[flagName] = value;\n if (this.flagRegistry[flagName].setHook != null) {\n this.flagRegistry[flagName].setHook(value);\n }\n }\n evaluateFlag(flagName) {\n if (this.flagRegistry[flagName] == null) {\n throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`);\n }\n return this.flagRegistry[flagName].evaluationFn();\n }\n setFlags(flags) {\n this.flags = Object.assign({}, flags);\n }\n reset() {\n this.flags = {};\n this.urlFlags = {};\n this.populateURLFlags();\n }\n populateURLFlags() {\n if (typeof this.global === \"undefined\" || typeof this.global.location === \"undefined\" || typeof this.global.location.search === \"undefined\") {\n return;\n }\n const urlParams = this.getQueryParams(this.global.location.search);\n if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) {\n const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(\",\");\n keyValues.forEach((keyValue) => {\n const [key, value] = keyValue.split(\":\");\n this.urlFlags[key] = parseValue(key, value);\n });\n }\n }\n};\nfunction getQueryParams(queryString) {\n const params = {};\n queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => {\n decodeParam(params, t[0], t[1]);\n return t.join(\"=\");\n });\n return params;\n}\nfunction decodeParam(params, name, value) {\n params[decodeURIComponent(name)] = decodeURIComponent(value || \"\");\n}\nfunction parseValue(flagName, value) {\n value = value.toLowerCase();\n if (value === \"true\" || value === \"false\") {\n return value === \"true\";\n } else if (`${+value}` === value) {\n return +value;\n }\n throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`);\n}\nfunction env() {\n return ENV;\n}\nvar ENV = null;\nfunction setEnvironmentGlobal(environment) {\n ENV = environment;\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/global_util.js\nvar globalNameSpace;\nfunction getGlobalNamespace() {\n if (globalNameSpace == null) {\n let ns;\n if (typeof window !== \"undefined\") {\n ns = window;\n } else if (typeof global !== \"undefined\") {\n ns = global;\n } else if (typeof process !== \"undefined\") {\n ns = process;\n } else if (typeof self !== \"undefined\") {\n ns = self;\n } else {\n throw new Error(\"Could not find a global object\");\n }\n globalNameSpace = ns;\n }\n return globalNameSpace;\n}\nfunction getGlobalMap() {\n const ns = getGlobalNamespace();\n if (ns._tfGlobals == null) {\n ns._tfGlobals = /* @__PURE__ */ new Map();\n }\n return ns._tfGlobals;\n}\nfunction getGlobal(key, init2) {\n const globalMap = getGlobalMap();\n if (globalMap.has(key)) {\n return globalMap.get(key);\n } else {\n const singleton = init2();\n globalMap.set(key, singleton);\n return globalMap.get(key);\n }\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/kernel_names.js\nvar Abs = \"Abs\";\nvar Acos = \"Acos\";\nvar Acosh = \"Acosh\";\nvar Add = \"Add\";\nvar AddN = \"AddN\";\nvar All = \"All\";\nvar Any = \"Any\";\nvar ArgMax = \"ArgMax\";\nvar ArgMin = \"ArgMin\";\nvar Asin = \"Asin\";\nvar Asinh = \"Asinh\";\nvar Atan = \"Atan\";\nvar Atanh = \"Atanh\";\nvar Atan2 = \"Atan2\";\nvar AvgPool = \"AvgPool\";\nvar AvgPoolGrad = \"AvgPoolGrad\";\nvar AvgPool3D = \"AvgPool3D\";\nvar AvgPool3DGrad = \"AvgPool3DGrad\";\nvar BatchMatMul = \"BatchMatMul\";\nvar BatchToSpaceND = \"BatchToSpaceND\";\nvar Bincount = \"Bincount\";\nvar BroadcastTo = \"BroadcastTo\";\nvar BroadcastArgs = \"BroadcastArgs\";\nvar Cast = \"Cast\";\nvar Ceil = \"Ceil\";\nvar ClipByValue = \"ClipByValue\";\nvar Complex = \"Complex\";\nvar ComplexAbs = \"ComplexAbs\";\nvar Concat = \"Concat\";\nvar Conv2D = \"Conv2D\";\nvar Conv2DBackpropFilter = \"Conv2DBackpropFilter\";\nvar Conv2DBackpropInput = \"Conv2DBackpropInput\";\nvar Conv3D = \"Conv3D\";\nvar Conv3DBackpropFilterV2 = \"Conv3DBackpropFilterV2\";\nvar Conv3DBackpropInputV2 = \"Conv3DBackpropInputV2\";\nvar Cos = \"Cos\";\nvar Cosh = \"Cosh\";\nvar Cumprod = \"Cumprod\";\nvar Cumsum = \"Cumsum\";\nvar CropAndResize = \"CropAndResize\";\nvar DenseBincount = \"DenseBincount\";\nvar DepthToSpace = \"DepthToSpace\";\nvar DepthwiseConv2dNative = \"DepthwiseConv2dNative\";\nvar DepthwiseConv2dNativeBackpropFilter = \"DepthwiseConv2dNativeBackpropFilter\";\nvar DepthwiseConv2dNativeBackpropInput = \"DepthwiseConv2dNativeBackpropInput\";\nvar Diag = \"Diag\";\nvar Dilation2D = \"Dilation2D\";\nvar Dilation2DBackpropInput = \"Dilation2DBackpropInput\";\nvar Dilation2DBackpropFilter = \"Dilation2DBackpropFilter\";\nvar RealDiv = \"RealDiv\";\nvar Einsum = \"Einsum\";\nvar Elu = \"Elu\";\nvar EluGrad = \"EluGrad\";\nvar Erf = \"Erf\";\nvar Equal = \"Equal\";\nvar Exp = \"Exp\";\nvar ExpandDims = \"ExpandDims\";\nvar Expm1 = \"Expm1\";\nvar FFT = \"FFT\";\nvar Fill = \"Fill\";\nvar FlipLeftRight = \"FlipLeftRight\";\nvar Floor = \"Floor\";\nvar FloorDiv = \"FloorDiv\";\nvar FusedBatchNorm = \"FusedBatchNorm\";\nvar GatherV2 = \"GatherV2\";\nvar GatherNd = \"GatherNd\";\nvar Greater = \"Greater\";\nvar GreaterEqual = \"GreaterEqual\";\nvar Identity = \"Identity\";\nvar IFFT = \"IFFT\";\nvar Imag = \"Imag\";\nvar IsFinite = \"IsFinite\";\nvar IsInf = \"IsInf\";\nvar IsNan = \"IsNan\";\nvar LeakyRelu = \"LeakyRelu\";\nvar Less = \"Less\";\nvar LessEqual = \"LessEqual\";\nvar LinSpace = \"LinSpace\";\nvar Log = \"Log\";\nvar Log1p = \"Log1p\";\nvar LogicalAnd = \"LogicalAnd\";\nvar LogicalNot = \"LogicalNot\";\nvar LogicalOr = \"LogicalOr\";\nvar LogicalXor = \"LogicalXor\";\nvar LogSoftmax = \"LogSoftmax\";\nvar LowerBound = \"LowerBound\";\nvar LRN = \"LRN\";\nvar LRNGrad = \"LRNGrad\";\nvar Max = \"Max\";\nvar Maximum = \"Maximum\";\nvar MaxPool = \"MaxPool\";\nvar MaxPoolGrad = \"MaxPoolGrad\";\nvar MaxPool3D = \"MaxPool3D\";\nvar MaxPool3DGrad = \"MaxPool3DGrad\";\nvar MaxPoolWithArgmax = \"MaxPoolWithArgmax\";\nvar Mean = \"Mean\";\nvar Min = \"Min\";\nvar Minimum = \"Minimum\";\nvar MirrorPad = \"MirrorPad\";\nvar Mod = \"Mod\";\nvar Multinomial = \"Multinomial\";\nvar Multiply = \"Multiply\";\nvar Neg = \"Neg\";\nvar NotEqual = \"NotEqual\";\nvar NonMaxSuppressionV3 = \"NonMaxSuppressionV3\";\nvar NonMaxSuppressionV4 = \"NonMaxSuppressionV4\";\nvar NonMaxSuppressionV5 = \"NonMaxSuppressionV5\";\nvar OnesLike = \"OnesLike\";\nvar OneHot = \"OneHot\";\nvar Pack = \"Pack\";\nvar PadV2 = \"PadV2\";\nvar Pool = \"Pool\";\nvar Pow = \"Pow\";\nvar Prelu = \"Prelu\";\nvar Prod = \"Prod\";\nvar Range = \"Range\";\nvar Real = \"Real\";\nvar Reciprocal = \"Reciprocal\";\nvar Relu = \"Relu\";\nvar Reshape = \"Reshape\";\nvar ResizeNearestNeighbor = \"ResizeNearestNeighbor\";\nvar ResizeNearestNeighborGrad = \"ResizeNearestNeighborGrad\";\nvar ResizeBilinear = \"ResizeBilinear\";\nvar ResizeBilinearGrad = \"ResizeBilinearGrad\";\nvar Relu6 = \"Relu6\";\nvar Reverse = \"Reverse\";\nvar Round = \"Round\";\nvar Rsqrt = \"Rsqrt\";\nvar ScatterNd = \"ScatterNd\";\nvar SearchSorted = \"SearchSorted\";\nvar Select = \"Select\";\nvar Selu = \"Selu\";\nvar Slice = \"Slice\";\nvar Sin = \"Sin\";\nvar Sinh = \"Sinh\";\nvar Sign = \"Sign\";\nvar Sigmoid = \"Sigmoid\";\nvar Softplus = \"Softplus\";\nvar Sqrt = \"Sqrt\";\nvar Sum = \"Sum\";\nvar SpaceToBatchND = \"SpaceToBatchND\";\nvar SplitV = \"SplitV\";\nvar Softmax = \"Softmax\";\nvar SparseFillEmptyRows = \"SparseFillEmptyRows\";\nvar SparseReshape = \"SparseReshape\";\nvar SparseSegmentMean = \"SparseSegmentMean\";\nvar SparseSegmentSum = \"SparseSegmentSum\";\nvar SparseToDense = \"SparseToDense\";\nvar SquaredDifference = \"SquaredDifference\";\nvar Square = \"Square\";\nvar StridedSlice = \"StridedSlice\";\nvar StringNGrams = \"StringNGrams\";\nvar StringSplit = \"StringSplit\";\nvar StringToHashBucketFast = \"StringToHashBucketFast\";\nvar Sub = \"Sub\";\nvar Tan = \"Tan\";\nvar Tanh = \"Tanh\";\nvar Tile = \"Tile\";\nvar TopK = \"TopK\";\nvar Transform = \"Transform\";\nvar Transpose = \"Transpose\";\nvar Unique = \"Unique\";\nvar Unpack = \"Unpack\";\nvar UnsortedSegmentSum = \"UnsortedSegmentSum\";\nvar UpperBound = \"UpperBound\";\nvar ZerosLike = \"ZerosLike\";\nvar Step = \"Step\";\nvar FromPixels = \"FromPixels\";\nvar RotateWithOffset = \"RotateWithOffset\";\nvar _FusedMatMul = \"_FusedMatMul\";\nvar FusedConv2D = \"FusedConv2D\";\nvar FusedDepthwiseConv2D = \"FusedDepthwiseConv2D\";\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/log.js\nfunction warn(...msg) {\n if (!(env().getBool(\"IS_TEST\") || env().getBool(\"PROD\"))) {\n console.warn(...msg);\n }\n}\nfunction log(...msg) {\n if (!(env().getBool(\"IS_TEST\") || env().getBool(\"PROD\"))) {\n console.log(...msg);\n }\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js\nvar kernelRegistry = getGlobal(\"kernelRegistry\", () => /* @__PURE__ */ new Map());\nvar gradRegistry = getGlobal(\"gradRegistry\", () => /* @__PURE__ */ new Map());\nfunction getKernel(kernelName, backendName) {\n const key = makeKey(kernelName, backendName);\n return kernelRegistry.get(key);\n}\nfunction getGradient(kernelName) {\n return gradRegistry.get(kernelName);\n}\nfunction getKernelsForBackend(backendName) {\n const it = kernelRegistry.entries();\n const result = [];\n while (true) {\n const { done, value } = it.next();\n if (done) {\n break;\n }\n const [key, config] = value;\n const [backend2] = key.split(\"_\");\n if (backend2 === backendName) {\n result.push(config);\n }\n }\n return result;\n}\nfunction registerKernel(config) {\n const { kernelName, backendName } = config;\n const key = makeKey(kernelName, backendName);\n if (kernelRegistry.has(key)) {\n warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`);\n }\n kernelRegistry.set(key, config);\n}\nfunction registerGradient(config) {\n const { kernelName } = config;\n if (gradRegistry.has(kernelName)) {\n if (env().getBool(\"DEBUG\")) {\n warn(`Overriding the gradient for '${kernelName}'`);\n }\n }\n gradRegistry.set(kernelName, config);\n}\nfunction unregisterKernel(kernelName, backendName) {\n const key = makeKey(kernelName, backendName);\n if (!kernelRegistry.has(key)) {\n throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`);\n }\n kernelRegistry.delete(key);\n}\nfunction unregisterGradient(kernelName) {\n if (!gradRegistry.has(kernelName)) {\n throw new Error(`The gradient '${kernelName}' for backend is not registered`);\n }\n gradRegistry.delete(kernelName);\n}\nfunction copyRegisteredKernels(registeredBackendName, newBackendName) {\n const kernels = getKernelsForBackend(registeredBackendName);\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName });\n registerKernel(newKernelConfig);\n });\n}\nfunction makeKey(kernelName, backendName) {\n return `${backendName}_${kernelName}`;\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/util.js\nvar util_exports = {};\n__export(util_exports, {\n arraysEqual: () => arraysEqual,\n assert: () => assert,\n assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions,\n assertNonNull: () => assertNonNull,\n assertShapesMatch: () => assertShapesMatch,\n bytesFromStringArray: () => bytesFromStringArray,\n bytesPerElement: () => bytesPerElement,\n checkConversionForErrors: () => checkConversionForErrors,\n clamp: () => clamp,\n computeStrides: () => computeStrides,\n createScalarValue: () => createScalarValue,\n createShuffledIndices: () => createShuffledIndices,\n decodeString: () => decodeString,\n distSquared: () => distSquared,\n encodeString: () => encodeString,\n fetch: () => fetch3,\n fingerPrint64: () => fingerPrint64,\n flatten: () => flatten,\n getArrayFromDType: () => getArrayFromDType,\n getTypedArrayFromDType: () => getTypedArrayFromDType,\n hasEncodingLoss: () => hasEncodingLoss,\n hexToLong: () => hexToLong,\n indexToLoc: () => indexToLoc,\n inferDtype: () => inferDtype,\n inferFromImplicitShape: () => inferFromImplicitShape,\n isBoolean: () => isBoolean,\n isFunction: () => isFunction,\n isInt: () => isInt,\n isNumber: () => isNumber,\n isPromise: () => isPromise,\n isScalarShape: () => isScalarShape,\n isString: () => isString,\n isTypedArray: () => isTypedArray,\n isValidDtype: () => isValidDtype,\n locToIndex: () => locToIndex,\n makeOnesTypedArray: () => makeOnesTypedArray,\n makeZerosNestedTypedArray: () => makeZerosNestedTypedArray,\n makeZerosTypedArray: () => makeZerosTypedArray,\n nearestDivisor: () => nearestDivisor,\n nearestLargerEven: () => nearestLargerEven,\n now: () => now,\n parseAxisParam: () => parseAxisParam,\n randUniform: () => randUniform,\n repeatedTry: () => repeatedTry,\n rightPad: () => rightPad,\n shuffle: () => shuffle,\n shuffleCombo: () => shuffleCombo,\n sizeFromShape: () => sizeFromShape,\n sizeToSquarishShape: () => sizeToSquarishShape,\n squeezeShape: () => squeezeShape,\n sum: () => sum,\n swap: () => swap,\n tanh: () => tanh,\n toNestedArray: () => toNestedArray,\n toTypedArray: () => toTypedArray\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/hash_util.js\nvar LongExports = __toESM(require_long());\nvar Long = LongExports.default || LongExports;\nfunction hexToLong(hex) {\n return Long.fromString(hex, true, 16);\n}\nvar k0 = hexToLong(\"c3a5c85c97cb3127\");\nvar k1 = hexToLong(\"b492b66fbe98f273\");\nvar k2 = hexToLong(\"9ae16a3b2f90404f\");\nfunction shiftMix(val) {\n return val.xor(val.shru(47));\n}\nfunction fetch2(s, offset, numBytes) {\n const bytes = s.slice(offset, offset + numBytes);\n return Long.fromBytes(Array.from(bytes), true, true);\n}\nfunction fetch64(s, offset) {\n return fetch2(s, offset, 8);\n}\nfunction fetch32(s, offset) {\n return fetch2(s, offset, 4);\n}\nfunction rotate64(val, shift) {\n return shift === 0 ? val : val.shru(shift).or(val.shl(64 - shift));\n}\nfunction hashLen16(u, v, mul2 = hexToLong(\"9ddfea08eb382d69\")) {\n let a = u.xor(v).mul(mul2);\n a = a.xor(a.shru(47));\n let b = v.xor(a).mul(mul2);\n b = b.xor(b.shru(47));\n b = b.mul(mul2);\n return b;\n}\nfunction weakHashLen32WithSeeds(w, x, y, z, a, b) {\n a = a.add(w);\n b = rotate64(b.add(a).add(z), 21);\n const c = a;\n a = a.add(x);\n a = a.add(y);\n b = b.add(rotate64(a, 44));\n return [a.add(z), b.add(c)];\n}\nfunction weakHashLen32WithSeedsStr(s, offset, a, b) {\n return weakHashLen32WithSeeds(fetch64(s, offset), fetch64(s, offset + 8), fetch64(s, offset + 16), fetch64(s, offset + 24), a, b);\n}\nfunction hashLen0to16(s, len = s.length) {\n if (len >= 8) {\n const mul2 = k2.add(len * 2);\n const a = fetch64(s, 0).add(k2);\n const b = fetch64(s, len - 8);\n const c = rotate64(b, 37).mul(mul2).add(a);\n const d = rotate64(a, 25).add(b).mul(mul2);\n return hashLen16(c, d, mul2);\n }\n if (len >= 4) {\n const mul2 = k2.add(len * 2);\n const a = fetch32(s, 0);\n return hashLen16(a.shl(3).add(len), fetch32(s, len - 4), mul2);\n }\n if (len > 0) {\n const a = s[0];\n const b = s[len >> 1];\n const c = s[len - 1];\n const y = a + (b << 8);\n const z = len + (c << 2);\n return shiftMix(k2.mul(y).xor(k0.mul(z))).mul(k2);\n }\n return k2;\n}\nfunction hashLen17to32(s, len = s.length) {\n const mul2 = k2.add(len * 2);\n const a = fetch64(s, 0).mul(k1);\n const b = fetch64(s, 8);\n const c = fetch64(s, len - 8).mul(mul2);\n const d = fetch64(s, len - 16).mul(k2);\n return hashLen16(rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d), a.add(rotate64(b.add(k2), 18)).add(c), mul2);\n}\nfunction hashLen33to64(s, len = s.length) {\n const mul2 = k2.add(len * 2);\n const a = fetch64(s, 0).mul(k2);\n const b = fetch64(s, 8);\n const c = fetch64(s, len - 8).mul(mul2);\n const d = fetch64(s, len - 16).mul(k2);\n const y = rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d);\n const z = hashLen16(y, a.add(rotate64(b.add(k2), 18)).add(c), mul2);\n const e = fetch64(s, 16).mul(mul2);\n const f = fetch64(s, 24);\n const g = y.add(fetch64(s, len - 32)).mul(mul2);\n const h = z.add(fetch64(s, len - 24)).mul(mul2);\n return hashLen16(rotate64(e.add(f), 43).add(rotate64(g, 30)).add(h), e.add(rotate64(f.add(a), 18)).add(g), mul2);\n}\nfunction fingerPrint64(s, len = s.length) {\n const seed = Long.fromNumber(81, true);\n if (len <= 32) {\n if (len <= 16) {\n return hashLen0to16(s, len);\n } else {\n return hashLen17to32(s, len);\n }\n } else if (len <= 64) {\n return hashLen33to64(s, len);\n }\n let x = seed;\n let y = seed.mul(k1).add(113);\n let z = shiftMix(y.mul(k2).add(113)).mul(k2);\n let v = [Long.UZERO, Long.UZERO];\n let w = [Long.UZERO, Long.UZERO];\n x = x.mul(k2).add(fetch64(s, 0));\n let offset = 0;\n const end = (len - 1 >> 6) * 64;\n const last64 = end + (len - 1 & 63) - 63;\n do {\n x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(k1);\n y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(k1);\n x = x.xor(w[1]);\n y = y.add(v[0]).add(fetch64(s, offset + 40));\n z = rotate64(z.add(w[0]), 33).mul(k1);\n v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(k1), x.add(w[0]));\n w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16)));\n [z, x] = [x, z];\n offset += 64;\n } while (offset !== end);\n const mul2 = k1.add(z.and(255).shl(1));\n offset = last64;\n w[0] = w[0].add(len - 1 & 63);\n v[0] = v[0].add(w[0]);\n w[0] = w[0].add(v[0]);\n x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(mul2);\n y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(mul2);\n x = x.xor(w[1].mul(9));\n y = y.add(v[0].mul(9).add(fetch64(s, offset + 40)));\n z = rotate64(z.add(w[0]), 33).mul(mul2);\n v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(mul2), x.add(w[0]));\n w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16)));\n [z, x] = [x, z];\n return hashLen16(hashLen16(v[0], w[0], mul2).add(shiftMix(y).mul(k0)).add(z), hashLen16(v[1], w[1], mul2).add(x), mul2);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/util.js\nfunction createScalarValue(value, dtype) {\n if (dtype === \"string\") {\n return encodeString(value);\n }\n return toTypedArray([value], dtype);\n}\nfunction noConversionNeeded(a, dtype) {\n return a instanceof Float32Array && dtype === \"float32\" || a instanceof Int32Array && dtype === \"int32\" || a instanceof Uint8Array && dtype === \"bool\";\n}\nfunction toTypedArray(a, dtype) {\n if (dtype === \"string\") {\n throw new Error(\"Cannot convert a string[] to a TypedArray\");\n }\n if (Array.isArray(a)) {\n a = flatten(a);\n }\n if (env().getBool(\"DEBUG\")) {\n checkConversionForErrors(a, dtype);\n }\n if (noConversionNeeded(a, dtype)) {\n return a;\n }\n if (dtype == null || dtype === \"float32\" || dtype === \"complex64\") {\n return new Float32Array(a);\n } else if (dtype === \"int32\") {\n return new Int32Array(a);\n } else if (dtype === \"bool\") {\n const bool = new Uint8Array(a.length);\n for (let i = 0; i < bool.length; ++i) {\n if (Math.round(a[i]) !== 0) {\n bool[i] = 1;\n }\n }\n return bool;\n } else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n}\nfunction now() {\n return env().platform.now();\n}\nfunction fetch3(path, requestInits) {\n return env().platform.fetch(path, requestInits);\n}\nfunction encodeString(s, encoding = \"utf-8\") {\n encoding = encoding || \"utf-8\";\n return env().platform.encode(s, encoding);\n}\nfunction decodeString(bytes, encoding = \"utf-8\") {\n encoding = encoding || \"utf-8\";\n return env().platform.decode(bytes, encoding);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/profiler.js\nvar Profiler = class {\n constructor(backendTimer, logger) {\n this.backendTimer = backendTimer;\n this.logger = logger;\n if (logger == null) {\n this.logger = new Logger();\n }\n }\n profileKernel(kernelName, inputs, f) {\n let outputs;\n const holdResultWrapperFn = () => {\n outputs = f();\n };\n let timer;\n const start = now();\n if (this.backendTimer.timerAvailable()) {\n timer = this.backendTimer.time(holdResultWrapperFn);\n } else {\n holdResultWrapperFn();\n for (const output of outputs) {\n output.dataSync();\n }\n timer = Promise.resolve({ kernelMs: now() - start });\n }\n if (env().getBool(\"CHECK_COMPUTATION_FOR_ERRORS\")) {\n for (let i = 0; i < outputs.length; i++) {\n const output = outputs[i];\n output.data().then((tensorVals) => {\n checkComputationForErrors(tensorVals, output.dtype, kernelName);\n });\n }\n }\n const kernelProfile = {\n kernelName,\n outputs,\n inputs,\n timeMs: timer.then((timing) => timing.kernelMs),\n extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : \"\")\n };\n return kernelProfile;\n }\n logKernelProfile(kernelProfile) {\n const { kernelName, outputs, timeMs, inputs, extraInfo } = kernelProfile;\n outputs.forEach((result) => {\n Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => {\n this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]);\n });\n });\n }\n};\nfunction checkComputationForErrors(vals, dtype, kernelName) {\n if (dtype !== \"float32\") {\n return false;\n }\n for (let i = 0; i < vals.length; i++) {\n const num = vals[i];\n if (isNaN(num) || !isFinite(num)) {\n console.warn(`Found ${num} in the result of '${kernelName}'`);\n return true;\n }\n }\n return false;\n}\nvar Logger = class {\n logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) {\n const time2 = typeof timeMs === \"number\" ? rightPad(`${timeMs}ms`, 9) : timeMs[\"error\"];\n const paddedName = rightPad(name, 25);\n const rank = result.rank;\n const size = result.size;\n const shape = rightPad(result.shape.toString(), 14);\n let inputShapesDescription = \"\";\n for (const name2 in inputs) {\n const input2 = inputs[name2];\n if (input2 != null) {\n const inputShape = input2.shape || result.shape;\n const inputRank = inputShape.length;\n inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : \"\"} `;\n }\n }\n console.log(`%c${paddedName}\t%c${time2}\t%c${rank}D ${shape}\t%c${size}\t%c${inputShapesDescription}\t%c${extraInfo}`, \"font-weight:bold\", \"color:red\", \"color:blue\", \"color: orange\", \"color: green\", \"color: steelblue\");\n }\n};\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/tape.js\nfunction getFilteredNodesXToY(tape, xs, y) {\n const tensorsFromX = {};\n const nodesFromX = {};\n for (let i = 0; i < xs.length; i++) {\n tensorsFromX[xs[i].id] = true;\n }\n for (let i = 0; i < tape.length; i++) {\n const node = tape[i];\n const nodeInputs = node.inputs;\n for (const inputName in nodeInputs) {\n const input2 = nodeInputs[inputName];\n let anyInputFromX = false;\n for (let j = 0; j < xs.length; j++) {\n if (tensorsFromX[input2.id]) {\n node.outputs.forEach((output) => tensorsFromX[output.id] = true);\n anyInputFromX = true;\n nodesFromX[node.id] = true;\n break;\n }\n }\n if (anyInputFromX) {\n break;\n }\n }\n }\n const tensorsLeadToY = {};\n tensorsLeadToY[y.id] = true;\n const nodesToY = {};\n for (let i = tape.length - 1; i >= 0; i--) {\n const node = tape[i];\n const nodeInputs = node.inputs;\n for (let j = 0; j < node.outputs.length; j++) {\n if (tensorsLeadToY[node.outputs[j].id]) {\n for (const inputName in nodeInputs) {\n tensorsLeadToY[nodeInputs[inputName].id] = true;\n nodesToY[node.id] = true;\n }\n break;\n }\n }\n }\n const filteredTape = [];\n for (let i = 0; i < tape.length; i++) {\n const node = tape[i];\n if (nodesFromX[node.id] && nodesToY[node.id]) {\n const prunedInputs = {};\n for (const inputName in node.inputs) {\n const nodeInput = node.inputs[inputName];\n if (tensorsFromX[nodeInput.id]) {\n prunedInputs[inputName] = nodeInput;\n }\n }\n const prunedNode = Object.assign({}, node);\n prunedNode.inputs = prunedInputs;\n prunedNode.outputs = node.outputs;\n filteredTape.push(prunedNode);\n }\n }\n return filteredTape;\n}\nfunction backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) {\n for (let i = filteredTape.length - 1; i >= 0; i--) {\n const node = filteredTape[i];\n const dys = [];\n node.outputs.forEach((o) => {\n const gradTensor = tensorAccumulatedGradientMap[o.id];\n if (gradTensor != null) {\n dys.push(gradTensor);\n } else {\n dys.push(null);\n }\n });\n if (node.gradient == null) {\n throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`);\n }\n const inputGradients = node.gradient(dys);\n for (const inputName in node.inputs) {\n if (!(inputName in inputGradients)) {\n throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`);\n }\n const dx = tidy2(() => inputGradients[inputName]());\n if (dx.dtype !== \"float32\") {\n throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`);\n }\n const x = node.inputs[inputName];\n if (!arraysEqual(dx.shape, x.shape)) {\n 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}'`);\n }\n if (tensorAccumulatedGradientMap[x.id] == null) {\n tensorAccumulatedGradientMap[x.id] = dx;\n } else {\n const curGradient = tensorAccumulatedGradientMap[x.id];\n tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx);\n curGradient.dispose();\n }\n }\n }\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/tensor_format.js\nvar FORMAT_LIMIT_NUM_VALS = 20;\nvar FORMAT_NUM_FIRST_LAST_VALS = 3;\nvar FORMAT_NUM_SIG_DIGITS = 7;\nfunction tensorToString(vals, shape, dtype, verbose) {\n const strides = computeStrides(shape);\n const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides);\n const rank = shape.length;\n const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol);\n const lines = [\"Tensor\"];\n if (verbose) {\n lines.push(` dtype: ${dtype}`);\n lines.push(` rank: ${rank}`);\n lines.push(` shape: [${shape}]`);\n lines.push(` values:`);\n }\n lines.push(valsLines.map((l) => \" \" + l).join(\"\\n\"));\n return lines.join(\"\\n\");\n}\nfunction computeMaxSizePerColumn(vals, shape, dtype, strides) {\n const n = sizeFromShape(shape);\n const numCols = strides[strides.length - 1];\n const padPerCol = new Array(numCols).fill(0);\n const rank = shape.length;\n const valuesOrTuples = dtype === \"complex64\" ? createComplexTuples(vals) : vals;\n if (rank > 1) {\n for (let row = 0; row < n / numCols; row++) {\n const offset = row * numCols;\n for (let j = 0; j < numCols; j++) {\n padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length);\n }\n }\n }\n return padPerCol;\n}\nfunction valToString(val, pad3, dtype) {\n let valStr;\n if (Array.isArray(val)) {\n valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`;\n } else if (isString(val)) {\n valStr = `'${val}'`;\n } else if (dtype === \"bool\") {\n valStr = boolNumToString(val);\n } else {\n valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString();\n }\n return rightPad(valStr, pad3);\n}\nfunction boolNumToString(v) {\n return v === 0 ? \"false\" : \"true\";\n}\nfunction subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) {\n const storagePerElement = dtype === \"complex64\" ? 2 : 1;\n const size = shape[0];\n const rank = shape.length;\n if (rank === 0) {\n if (dtype === \"complex64\") {\n const complexTuple = createComplexTuples(vals);\n return [valToString(complexTuple[0], 0, dtype)];\n }\n if (dtype === \"bool\") {\n return [boolNumToString(vals[0])];\n }\n return [vals[0].toString()];\n }\n if (rank === 1) {\n if (size > FORMAT_LIMIT_NUM_VALS) {\n const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement;\n let firstVals = Array.from(vals.slice(0, firstValsSize));\n let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement));\n if (dtype === \"complex64\") {\n firstVals = createComplexTuples(firstVals);\n lastVals = createComplexTuples(lastVals);\n }\n return [\n \"[\" + 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(\", \") + \"]\"\n ];\n }\n const displayVals = dtype === \"complex64\" ? createComplexTuples(vals) : Array.from(vals);\n return [\n \"[\" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(\", \") + \"]\"\n ];\n }\n const subshape = shape.slice(1);\n const substrides = strides.slice(1);\n const stride = strides[0] * storagePerElement;\n const lines = [];\n if (size > FORMAT_LIMIT_NUM_VALS) {\n for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) {\n const start = i * stride;\n const end = start + stride;\n lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false));\n }\n lines.push(\"...\");\n for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) {\n const start = i * stride;\n const end = start + stride;\n lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1));\n }\n } else {\n for (let i = 0; i < size; i++) {\n const start = i * stride;\n const end = start + stride;\n lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1));\n }\n }\n const sep = rank === 2 ? \",\" : \"\";\n lines[0] = \"[\" + lines[0] + sep;\n for (let i = 1; i < lines.length - 1; i++) {\n lines[i] = \" \" + lines[i] + sep;\n }\n let newLineSep = \",\\n\";\n for (let i = 2; i < rank; i++) {\n newLineSep += \"\\n\";\n }\n lines[lines.length - 1] = \" \" + lines[lines.length - 1] + \"]\" + (isLast ? \"\" : newLineSep);\n return lines;\n}\nfunction createComplexTuples(vals) {\n const complexTuples = [];\n for (let i = 0; i < vals.length; i += 2) {\n complexTuples.push([vals[i], vals[i + 1]]);\n }\n return complexTuples;\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/tensor.js\nvar TensorBuffer = class {\n constructor(shape, dtype, values) {\n this.dtype = dtype;\n this.shape = shape.slice();\n this.size = sizeFromShape(shape);\n if (values != null) {\n const n = values.length;\n assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`);\n }\n if (dtype === \"complex64\") {\n 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).`);\n }\n this.values = values || getArrayFromDType(dtype, this.size);\n this.strides = computeStrides(shape);\n }\n set(value, ...locs) {\n if (locs.length === 0) {\n locs = [0];\n }\n assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`);\n const index = this.locToIndex(locs);\n this.values[index] = value;\n }\n get(...locs) {\n if (locs.length === 0) {\n locs = [0];\n }\n let i = 0;\n for (const loc of locs) {\n if (loc < 0 || loc >= this.shape[i]) {\n const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`;\n throw new Error(msg);\n }\n i++;\n }\n let index = locs[locs.length - 1];\n for (let i2 = 0; i2 < locs.length - 1; ++i2) {\n index += this.strides[i2] * locs[i2];\n }\n return this.values[index];\n }\n locToIndex(locs) {\n if (this.rank === 0) {\n return 0;\n } else if (this.rank === 1) {\n return locs[0];\n }\n let index = locs[locs.length - 1];\n for (let i = 0; i < locs.length - 1; ++i) {\n index += this.strides[i] * locs[i];\n }\n return index;\n }\n indexToLoc(index) {\n if (this.rank === 0) {\n return [];\n } else if (this.rank === 1) {\n return [index];\n }\n const locs = new Array(this.shape.length);\n for (let i = 0; i < locs.length - 1; ++i) {\n locs[i] = Math.floor(index / this.strides[i]);\n index -= locs[i] * this.strides[i];\n }\n locs[locs.length - 1] = index;\n return locs;\n }\n get rank() {\n return this.shape.length;\n }\n toTensor() {\n return trackerFn().makeTensor(this.values, this.shape, this.dtype);\n }\n};\nvar trackerFn = null;\nvar opHandler = null;\nvar deprecationWarningFn = null;\nfunction setTensorTracker(fn) {\n trackerFn = fn;\n}\nfunction setOpHandler(handler) {\n opHandler = handler;\n}\nfunction setDeprecationWarningFn(fn) {\n deprecationWarningFn = fn;\n}\nvar Tensor = class {\n constructor(shape, dtype, dataId, id) {\n this.kept = false;\n this.isDisposedInternal = false;\n this.shape = shape.slice();\n this.dtype = dtype || \"float32\";\n this.size = sizeFromShape(shape);\n this.strides = computeStrides(shape);\n this.dataId = dataId;\n this.id = id;\n this.rankType = this.rank < 5 ? this.rank.toString() : \"higher\";\n }\n get rank() {\n return this.shape.length;\n }\n async buffer() {\n const vals = await this.data();\n return opHandler.buffer(this.shape, this.dtype, vals);\n }\n bufferSync() {\n return opHandler.buffer(this.shape, this.dtype, this.dataSync());\n }\n async array() {\n const vals = await this.data();\n return toNestedArray(this.shape, vals, this.dtype === \"complex64\");\n }\n arraySync() {\n return toNestedArray(this.shape, this.dataSync(), this.dtype === \"complex64\");\n }\n async data() {\n this.throwIfDisposed();\n const data = trackerFn().read(this.dataId);\n if (this.dtype === \"string\") {\n const bytes = await data;\n try {\n return bytes.map((b) => decodeString(b));\n } catch (_a) {\n throw new Error(\"Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().\");\n }\n }\n return data;\n }\n dataToGPU(options) {\n this.throwIfDisposed();\n return trackerFn().readToGPU(this.dataId, options);\n }\n dataSync() {\n this.throwIfDisposed();\n const data = trackerFn().readSync(this.dataId);\n if (this.dtype === \"string\") {\n try {\n return data.map((b) => decodeString(b));\n } catch (_a) {\n throw new Error(\"Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().\");\n }\n }\n return data;\n }\n async bytes() {\n this.throwIfDisposed();\n const data = await trackerFn().read(this.dataId);\n if (this.dtype === \"string\") {\n return data;\n } else {\n return new Uint8Array(data.buffer);\n }\n }\n dispose() {\n if (this.isDisposed) {\n return;\n }\n trackerFn().disposeTensor(this);\n this.isDisposedInternal = true;\n }\n get isDisposed() {\n return this.isDisposedInternal;\n }\n throwIfDisposed() {\n if (this.isDisposed) {\n throw new Error(`Tensor is disposed.`);\n }\n }\n print(verbose = false) {\n return opHandler.print(this, verbose);\n }\n clone() {\n this.throwIfDisposed();\n return opHandler.clone(this);\n }\n toString(verbose = false) {\n const vals = this.dataSync();\n return tensorToString(vals, this.shape, this.dtype, verbose);\n }\n cast(dtype) {\n this.throwIfDisposed();\n return opHandler.cast(this, dtype);\n }\n variable(trainable = true, name, dtype) {\n this.throwIfDisposed();\n return trackerFn().makeVariable(this, trainable, name, dtype);\n }\n};\nObject.defineProperty(Tensor, Symbol.hasInstance, {\n value: (instance) => {\n return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null;\n }\n});\nfunction getGlobalTensorClass() {\n return getGlobal(\"Tensor\", () => {\n return Tensor;\n });\n}\ngetGlobalTensorClass();\nvar Variable = class extends Tensor {\n constructor(initialValue, trainable, name, tensorId) {\n super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId);\n this.trainable = trainable;\n this.name = name;\n }\n assign(newValue) {\n if (newValue.dtype !== this.dtype) {\n throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`);\n }\n if (!arraysEqual(newValue.shape, this.shape)) {\n throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`);\n }\n trackerFn().disposeTensor(this);\n this.dataId = newValue.dataId;\n trackerFn().incRef(this, null);\n }\n dispose() {\n trackerFn().disposeVariable(this);\n this.isDisposedInternal = true;\n }\n};\nObject.defineProperty(Variable, Symbol.hasInstance, {\n value: (instance) => {\n return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function;\n }\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/tensor_util.js\nvar tensor_util_exports = {};\n__export(tensor_util_exports, {\n assertTypesMatch: () => assertTypesMatch,\n getTensorsInContainer: () => getTensorsInContainer,\n isTensorInList: () => isTensorInList,\n makeTypesMatch: () => makeTypesMatch\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/types.js\nvar Rank;\n(function(Rank2) {\n Rank2[\"R0\"] = \"R0\";\n Rank2[\"R1\"] = \"R1\";\n Rank2[\"R2\"] = \"R2\";\n Rank2[\"R3\"] = \"R3\";\n Rank2[\"R4\"] = \"R4\";\n Rank2[\"R5\"] = \"R5\";\n Rank2[\"R6\"] = \"R6\";\n})(Rank || (Rank = {}));\nvar UpcastInt32AndMap;\n(function(UpcastInt32AndMap2) {\n UpcastInt32AndMap2[\"float32\"] = \"float32\";\n UpcastInt32AndMap2[\"int32\"] = \"int32\";\n UpcastInt32AndMap2[\"bool\"] = \"int32\";\n UpcastInt32AndMap2[\"complex64\"] = \"complex64\";\n})(UpcastInt32AndMap || (UpcastInt32AndMap = {}));\nvar UpcastBoolAndMap;\n(function(UpcastBoolAndMap2) {\n UpcastBoolAndMap2[\"float32\"] = \"float32\";\n UpcastBoolAndMap2[\"int32\"] = \"int32\";\n UpcastBoolAndMap2[\"bool\"] = \"bool\";\n UpcastBoolAndMap2[\"complex64\"] = \"complex64\";\n})(UpcastBoolAndMap || (UpcastBoolAndMap = {}));\nvar UpcastFloat32AndMap;\n(function(UpcastFloat32AndMap2) {\n UpcastFloat32AndMap2[\"float32\"] = \"float32\";\n UpcastFloat32AndMap2[\"int32\"] = \"float32\";\n UpcastFloat32AndMap2[\"bool\"] = \"float32\";\n UpcastFloat32AndMap2[\"complex64\"] = \"complex64\";\n})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {}));\nvar UpcastComplex64AndMap;\n(function(UpcastComplex64AndMap2) {\n UpcastComplex64AndMap2[\"float32\"] = \"complex64\";\n UpcastComplex64AndMap2[\"int32\"] = \"complex64\";\n UpcastComplex64AndMap2[\"bool\"] = \"complex64\";\n UpcastComplex64AndMap2[\"complex64\"] = \"complex64\";\n})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {}));\nvar upcastTypeMap = {\n \"float32\": UpcastFloat32AndMap,\n \"int32\": UpcastInt32AndMap,\n \"bool\": UpcastBoolAndMap,\n \"complex64\": UpcastComplex64AndMap\n};\nfunction upcastType(typeA, typeB) {\n if (typeA === \"string\" || typeB === \"string\") {\n if (typeA === \"string\" && typeB === \"string\") {\n return \"string\";\n }\n throw new Error(`Can not upcast ${typeA} with ${typeB}`);\n }\n return upcastTypeMap[typeA][typeB];\n}\nfunction sumOutType(type) {\n return upcastType(type, \"int32\");\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/tensor_util.js\nfunction makeTypesMatch(a, b) {\n if (a.dtype === b.dtype) {\n return [a, b];\n }\n const dtype = upcastType(a.dtype, b.dtype);\n return [a.cast(dtype), b.cast(dtype)];\n}\nfunction assertTypesMatch(a, b) {\n assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`);\n}\nfunction isTensorInList(tensor2, tensorList) {\n return tensorList.some((x) => x.id === tensor2.id);\n}\nfunction getTensorsInContainer(result) {\n const list = [];\n const seen = /* @__PURE__ */ new Set();\n walkTensorContainer(result, list, seen);\n return list;\n}\nfunction walkTensorContainer(container, list, seen) {\n if (container == null) {\n return;\n }\n if (container instanceof Tensor) {\n list.push(container);\n return;\n }\n if (!isIterable(container)) {\n return;\n }\n const iterable = container;\n for (const k in iterable) {\n const val = iterable[k];\n if (!seen.has(val)) {\n seen.add(val);\n walkTensorContainer(val, list, seen);\n }\n }\n}\nfunction isIterable(obj) {\n return Array.isArray(obj) || typeof obj === \"object\";\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/engine.js\nfunction isRegisteredKernelInvocation(kernelInvocation) {\n return kernelInvocation.kernelName != null;\n}\nvar EngineState = class {\n constructor() {\n this.registeredVariables = {};\n this.nextTapeNodeId = 0;\n this.numBytes = 0;\n this.numTensors = 0;\n this.numStringTensors = 0;\n this.numDataBuffers = 0;\n this.gradientDepth = 0;\n this.kernelDepth = 0;\n this.scopeStack = [];\n this.numDataMovesStack = [];\n this.nextScopeId = 0;\n this.tensorInfo = /* @__PURE__ */ new WeakMap();\n this.profiling = false;\n this.activeProfile = {\n newBytes: 0,\n newTensors: 0,\n peakBytes: 0,\n kernels: [],\n result: null,\n get kernelNames() {\n return Array.from(new Set(this.kernels.map((k) => k.name)));\n }\n };\n }\n dispose() {\n for (const variableName in this.registeredVariables) {\n this.registeredVariables[variableName].dispose();\n }\n }\n};\nvar Engine = class {\n constructor(ENV8) {\n this.ENV = ENV8;\n this.registry = {};\n this.registryFactory = {};\n this.pendingBackendInitId = 0;\n this.state = new EngineState();\n }\n async ready() {\n if (this.pendingBackendInit != null) {\n return this.pendingBackendInit.then(() => {\n });\n }\n if (this.backendInstance != null) {\n return;\n }\n const sortedBackends = this.getSortedBackends();\n for (let i = 0; i < sortedBackends.length; i++) {\n const backendName = sortedBackends[i];\n const success = await this.initializeBackend(backendName).success;\n if (success) {\n await this.setBackend(backendName);\n return;\n }\n }\n throw new Error(`Could not initialize any backends, all backend initializations failed.`);\n }\n get backend() {\n if (this.pendingBackendInit != null) {\n 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`);\n }\n if (this.backendInstance == null) {\n const { name, asyncInit } = this.initializeBackendsAndReturnBest();\n if (asyncInit) {\n throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`);\n }\n this.setBackend(name);\n }\n return this.backendInstance;\n }\n backendNames() {\n return Object.keys(this.registryFactory);\n }\n findBackend(backendName) {\n if (!(backendName in this.registry)) {\n if (backendName in this.registryFactory) {\n const { asyncInit } = this.initializeBackend(backendName);\n if (asyncInit) {\n return null;\n }\n } else {\n return null;\n }\n }\n return this.registry[backendName];\n }\n findBackendFactory(backendName) {\n if (!(backendName in this.registryFactory)) {\n return null;\n }\n return this.registryFactory[backendName].factory;\n }\n registerBackend(backendName, factory, priority = 1) {\n if (backendName in this.registryFactory) {\n warn(`${backendName} backend was already registered. Reusing existing backend factory.`);\n return false;\n }\n this.registryFactory[backendName] = { factory, priority };\n return true;\n }\n async setBackend(backendName) {\n if (this.registryFactory[backendName] == null) {\n throw new Error(`Backend name '${backendName}' not found in registry`);\n }\n this.backendName = backendName;\n if (this.registry[backendName] == null) {\n this.backendInstance = null;\n const { success, asyncInit } = this.initializeBackend(backendName);\n const result = asyncInit ? await success : success;\n if (!result) {\n return false;\n }\n }\n this.backendInstance = this.registry[backendName];\n this.setupRegisteredKernels();\n this.profiler = new Profiler(this.backendInstance);\n return true;\n }\n setupRegisteredKernels() {\n const kernels = getKernelsForBackend(this.backendName);\n kernels.forEach((kernel) => {\n if (kernel.setupFunc != null) {\n kernel.setupFunc(this.backendInstance);\n }\n });\n }\n disposeRegisteredKernels(backendName) {\n const kernels = getKernelsForBackend(backendName);\n kernels.forEach((kernel) => {\n if (kernel.disposeFunc != null) {\n kernel.disposeFunc(this.registry[backendName]);\n }\n });\n }\n initializeBackend(backendName) {\n const registryFactoryEntry = this.registryFactory[backendName];\n if (registryFactoryEntry == null) {\n throw new Error(`Cannot initialize backend ${backendName}, no registration found.`);\n }\n try {\n const backend2 = registryFactoryEntry.factory();\n if (backend2 && !(backend2 instanceof KernelBackend) && typeof backend2.then === \"function\") {\n const promiseId = ++this.pendingBackendInitId;\n const success = backend2.then((backendInstance) => {\n if (promiseId < this.pendingBackendInitId) {\n return false;\n }\n this.registry[backendName] = backendInstance;\n this.pendingBackendInit = null;\n return true;\n }).catch((err) => {\n if (promiseId < this.pendingBackendInitId) {\n return false;\n }\n this.pendingBackendInit = null;\n warn(`Initialization of backend ${backendName} failed`);\n warn(err.stack || err.message);\n return false;\n });\n this.pendingBackendInit = success;\n return { success, asyncInit: true };\n } else {\n this.registry[backendName] = backend2;\n return { success: true, asyncInit: false };\n }\n } catch (err) {\n warn(`Initialization of backend ${backendName} failed`);\n warn(err.stack || err.message);\n return { success: false, asyncInit: false };\n }\n }\n removeBackend(backendName) {\n if (!(backendName in this.registryFactory)) {\n throw new Error(`${backendName} backend not found in registry`);\n }\n if (this.backendName === backendName && this.pendingBackendInit != null) {\n this.pendingBackendInitId++;\n }\n if (backendName in this.registry) {\n this.disposeRegisteredKernels(backendName);\n this.registry[backendName].dispose();\n delete this.registry[backendName];\n }\n delete this.registryFactory[backendName];\n if (this.backendName === backendName) {\n this.pendingBackendInit = null;\n this.backendName = null;\n this.backendInstance = null;\n }\n }\n getSortedBackends() {\n if (Object.keys(this.registryFactory).length === 0) {\n throw new Error(\"No backend found in registry.\");\n }\n return Object.keys(this.registryFactory).sort((a, b) => {\n return this.registryFactory[b].priority - this.registryFactory[a].priority;\n });\n }\n initializeBackendsAndReturnBest() {\n const sortedBackends = this.getSortedBackends();\n for (let i = 0; i < sortedBackends.length; i++) {\n const backendName = sortedBackends[i];\n const { success, asyncInit } = this.initializeBackend(backendName);\n if (asyncInit || success) {\n return { name: backendName, asyncInit };\n }\n }\n throw new Error(`Could not initialize any backends, all backend initializations failed.`);\n }\n moveData(backend2, dataId) {\n const info = this.state.tensorInfo.get(dataId);\n const srcBackend = info.backend;\n const values = this.readSync(dataId);\n const refCount = srcBackend.refCount(dataId);\n srcBackend.disposeData(dataId, true);\n info.backend = backend2;\n backend2.move(dataId, values, info.shape, info.dtype, refCount);\n if (this.shouldCheckForMemLeaks()) {\n this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++;\n }\n }\n tidy(nameOrFn, fn) {\n let name = null;\n if (fn == null) {\n if (typeof nameOrFn !== \"function\") {\n throw new Error(\"Please provide a function to tidy()\");\n }\n fn = nameOrFn;\n } else {\n if (typeof nameOrFn !== \"string\" && !(nameOrFn instanceof String)) {\n throw new Error(\"When calling with two arguments, the first argument to tidy() must be a string\");\n }\n if (typeof fn !== \"function\") {\n throw new Error(\"When calling with two arguments, the 2nd argument to tidy() must be a function\");\n }\n name = nameOrFn;\n }\n let result;\n return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => {\n result = fn();\n if (result instanceof Promise) {\n console.error(\"Cannot return a Promise inside of tidy.\");\n }\n return result;\n });\n }\n scopedRun(start, end, f) {\n start();\n try {\n const res = f();\n end();\n return res;\n } catch (ex) {\n end();\n throw ex;\n }\n }\n nextTensorId() {\n return Engine.nextTensorId++;\n }\n nextVariableId() {\n return Engine.nextVariableId++;\n }\n clone(x) {\n const y = ENGINE.runKernel(Identity, { x });\n const inputs = { x };\n const grad2 = (dy) => ({\n x: () => {\n const dtype = \"float32\";\n const gradInputs = { x: dy };\n const attrs = { dtype };\n return ENGINE.runKernel(\n Cast,\n gradInputs,\n attrs\n );\n }\n });\n const saved = [];\n this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {});\n return y;\n }\n runKernel(kernelName, inputs, attrs) {\n if (this.backendName == null) {\n this.backend;\n }\n const hasKernel = getKernel(kernelName, this.backendName) != null;\n if (!hasKernel) {\n throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`);\n }\n return this.runKernelFunc({ kernelName, inputs, attrs });\n }\n shouldCheckForMemLeaks() {\n return this.ENV.getBool(\"IS_TEST\");\n }\n checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) {\n const numDataIdsAfter = this.backend.numDataIds();\n let numOutputDataIds = 0;\n outInfos.forEach((info) => {\n numOutputDataIds += info.dtype === \"complex64\" ? 3 : 1;\n });\n const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1];\n const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves;\n if (dataIdsLeaked > 0) {\n throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`);\n }\n }\n runKernelFunc(kernelParams) {\n let outputs;\n let saved = [];\n const isTapeOn = this.isTapeOn();\n const startingBytecount = this.state.numBytes;\n const startingNumTensors = this.state.numTensors;\n if (this.shouldCheckForMemLeaks()) {\n this.state.numDataMovesStack.push(0);\n }\n let kernelFunc3;\n if (this.backendName == null) {\n this.backend;\n }\n let out;\n const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : \"\";\n if (isRegisteredKernelInvocation(kernelParams)) {\n const { kernelName, inputs: inputs2, attrs: attrs2 } = kernelParams;\n if (this.backendName == null) {\n this.backend;\n }\n const kernel = getKernel(kernelName, this.backendName);\n assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`);\n kernelFunc3 = () => {\n const numDataIdsBefore = this.backend.numDataIds();\n out = kernel.kernelFunc({ inputs: inputs2, attrs: attrs2, backend: this.backend });\n const outInfos = Array.isArray(out) ? out : [out];\n if (this.shouldCheckForMemLeaks()) {\n this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos);\n }\n const outTensors = outInfos.map((outInfo) => {\n if (outInfo.rank != null) {\n return outInfo;\n }\n return this.makeTensorFromTensorInfo(outInfo);\n });\n if (isTapeOn) {\n const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors);\n saved = this.saveTensorsForBackwardMode(tensorsToSave);\n }\n return outTensors;\n };\n } else {\n const { forwardFunc } = kernelParams;\n const saveFunc = (tensors) => {\n if (!isTapeOn) {\n return;\n }\n saved = tensors.map((tensor2) => this.keep(this.clone(tensor2)));\n };\n kernelFunc3 = () => {\n const numDataIdsBefore = this.backend.numDataIds();\n out = this.tidy(() => forwardFunc(this.backend, saveFunc));\n const outs = Array.isArray(out) ? out : [out];\n if (this.shouldCheckForMemLeaks()) {\n this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs);\n }\n return outs;\n };\n }\n const { inputs, attrs } = kernelParams;\n const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc;\n let kernelProfile;\n this.scopedRun(\n () => this.state.kernelDepth++,\n () => this.state.kernelDepth--,\n () => {\n if (!this.ENV.getBool(\"DEBUG\") && !this.state.profiling) {\n outputs = kernelFunc3();\n } else {\n kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3());\n if (this.ENV.getBool(\"DEBUG\")) {\n this.profiler.logKernelProfile(kernelProfile);\n }\n outputs = kernelProfile.outputs;\n }\n }\n );\n if (isTapeOn) {\n this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs);\n }\n if (this.state.profiling) {\n this.state.activeProfile.kernels.push({\n name: kernelOrScopeName,\n bytesAdded: this.state.numBytes - startingBytecount,\n totalBytesSnapshot: this.state.numBytes,\n tensorsAdded: this.state.numTensors - startingNumTensors,\n totalTensorsSnapshot: this.state.numTensors,\n inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null),\n outputShapes: outputs.map((item) => item.shape),\n kernelTimeMs: kernelProfile.timeMs,\n extraInfo: kernelProfile.extraInfo\n });\n }\n return Array.isArray(out) ? outputs : outputs[0];\n }\n saveTensorsForBackwardMode(tensors) {\n const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2)));\n return saved;\n }\n getTensorsForGradient(kernelName, inputs, outputs) {\n const gradConfig = getGradient(kernelName);\n if (gradConfig != null) {\n const inputsToSave = gradConfig.inputsToSave || [];\n const outputsToSave = gradConfig.outputsToSave || [];\n let inputTensorsToSave;\n if (gradConfig.saveAllInputs) {\n assert(Array.isArray(inputs), () => \"saveAllInputs is true, expected inputs to be an array.\");\n inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]);\n } else {\n inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]);\n }\n const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]);\n return inputTensorsToSave.concat(outputTensorsToSave);\n }\n return [];\n }\n makeTensor(values, shape, dtype, backend2) {\n if (values == null) {\n throw new Error(\"Values passed to engine.makeTensor() are null\");\n }\n dtype = dtype || \"float32\";\n backend2 = backend2 || this.backend;\n let backendVals = values;\n if (dtype === \"string\" && isString(values[0])) {\n backendVals = values.map((d) => encodeString(d));\n }\n const dataId = backend2.write(backendVals, shape, dtype);\n const t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n this.trackTensor(t, backend2);\n if (dtype === \"string\") {\n const info = this.state.tensorInfo.get(dataId);\n const newBytes = bytesFromStringArray(backendVals);\n this.state.numBytes += newBytes - info.bytes;\n info.bytes = newBytes;\n }\n return t;\n }\n makeTensorFromDataId(dataId, shape, dtype, backend2) {\n dtype = dtype || \"float32\";\n const tensorInfo = { dataId, shape, dtype };\n return this.makeTensorFromTensorInfo(tensorInfo, backend2);\n }\n makeTensorFromTensorInfo(tensorInfo, backend2) {\n const { dataId, shape, dtype } = tensorInfo;\n const t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n this.trackTensor(t, backend2);\n return t;\n }\n makeVariable(initialValue, trainable = true, name, dtype) {\n name = name || this.nextVariableId().toString();\n if (dtype != null && dtype !== initialValue.dtype) {\n initialValue = initialValue.cast(dtype);\n }\n const v = new Variable(initialValue, trainable, name, this.nextTensorId());\n if (this.state.registeredVariables[v.name] != null) {\n throw new Error(`Variable with name ${v.name} was already registered`);\n }\n this.state.registeredVariables[v.name] = v;\n this.incRef(v, this.backend);\n return v;\n }\n trackTensor(a, backend2) {\n this.state.numTensors++;\n if (a.dtype === \"string\") {\n this.state.numStringTensors++;\n }\n let bytes = 0;\n if (a.dtype !== \"complex64\" && a.dtype !== \"string\") {\n bytes = a.size * bytesPerElement(a.dtype);\n }\n this.state.numBytes += bytes;\n if (!this.state.tensorInfo.has(a.dataId)) {\n this.state.numDataBuffers++;\n this.state.tensorInfo.set(a.dataId, {\n backend: backend2 || this.backend,\n dtype: a.dtype,\n shape: a.shape,\n bytes\n });\n }\n if (!(a instanceof Variable)) {\n this.track(a);\n }\n }\n incRef(a, backend2) {\n this.trackTensor(a, backend2);\n this.backend.incRef(a.dataId);\n }\n removeDataId(dataId, backend2) {\n if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend2) {\n this.state.tensorInfo.delete(dataId);\n this.state.numDataBuffers--;\n }\n }\n disposeTensor(a) {\n if (!this.state.tensorInfo.has(a.dataId)) {\n return;\n }\n const info = this.state.tensorInfo.get(a.dataId);\n this.state.numTensors--;\n if (a.dtype === \"string\") {\n this.state.numStringTensors--;\n this.state.numBytes -= info.bytes;\n }\n if (a.dtype !== \"complex64\" && a.dtype !== \"string\") {\n const bytes = a.size * bytesPerElement(a.dtype);\n this.state.numBytes -= bytes;\n }\n if (info.backend.disposeData(a.dataId)) {\n this.removeDataId(a.dataId, info.backend);\n }\n }\n disposeVariables() {\n for (const varName in this.state.registeredVariables) {\n const v = this.state.registeredVariables[varName];\n this.disposeVariable(v);\n }\n }\n disposeVariable(v) {\n this.disposeTensor(v);\n if (this.state.registeredVariables[v.name] != null) {\n delete this.state.registeredVariables[v.name];\n }\n }\n memory() {\n const info = this.backend.memory();\n info.numTensors = this.state.numTensors;\n info.numDataBuffers = this.state.numDataBuffers;\n info.numBytes = this.state.numBytes;\n if (this.state.numStringTensors > 0) {\n info.unreliable = true;\n if (info.reasons == null) {\n info.reasons = [];\n }\n info.reasons.push(\"Memory usage by string tensors is approximate (2 bytes per character)\");\n }\n return info;\n }\n async profile(query) {\n this.state.profiling = true;\n const startBytes = this.state.numBytes;\n const startNumTensors = this.state.numTensors;\n this.state.activeProfile.kernels = [];\n this.state.activeProfile.result = await query();\n this.state.profiling = false;\n this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot));\n this.state.activeProfile.newBytes = this.state.numBytes - startBytes;\n this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors;\n for (const kernel of this.state.activeProfile.kernels) {\n kernel.kernelTimeMs = await kernel.kernelTimeMs;\n kernel.extraInfo = await kernel.extraInfo;\n }\n return this.state.activeProfile;\n }\n isTapeOn() {\n return this.state.gradientDepth > 0 && this.state.kernelDepth === 0;\n }\n addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) {\n const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved };\n const gradConfig = getGradient(kernelName);\n if (gradConfig != null) {\n gradientsFunc = gradConfig.gradFunc;\n }\n if (gradientsFunc != null) {\n tapeNode.gradient = (dys) => {\n dys = dys.map((dy, i) => {\n if (dy == null) {\n const output = outputs[i];\n const vals = makeZerosTypedArray(output.size, output.dtype);\n return this.makeTensor(vals, output.shape, output.dtype);\n }\n return dy;\n });\n return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs);\n };\n }\n this.state.activeTape.push(tapeNode);\n }\n keep(result) {\n result.kept = true;\n return result;\n }\n startTape() {\n if (this.state.gradientDepth === 0) {\n this.state.activeTape = [];\n }\n this.state.gradientDepth++;\n }\n endTape() {\n this.state.gradientDepth--;\n }\n startScope(name) {\n const scopeInfo = {\n track: [],\n name: \"unnamed scope\",\n id: this.state.nextScopeId++\n };\n if (name) {\n scopeInfo.name = name;\n }\n this.state.scopeStack.push(scopeInfo);\n this.state.activeScope = scopeInfo;\n }\n endScope(result) {\n const tensorsToTrackInParent = getTensorsInContainer(result);\n const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id));\n for (let i = 0; i < this.state.activeScope.track.length; i++) {\n const tensor2 = this.state.activeScope.track[i];\n if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) {\n tensor2.dispose();\n }\n }\n const oldScope = this.state.scopeStack.pop();\n this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1];\n tensorsToTrackInParent.forEach((tensor2) => {\n if (!tensor2.kept && tensor2.scopeId === oldScope.id) {\n this.track(tensor2);\n }\n });\n }\n gradients(f, xs, dy, allowNoGradients = false) {\n assert(xs.length > 0, () => \"gradients() received an empty list of xs.\");\n if (dy != null && dy.dtype !== \"float32\") {\n throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`);\n }\n const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy(\"forward\", f));\n assert(y instanceof Tensor, () => \"The result y returned by f() must be a tensor.\");\n const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y);\n if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) {\n 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.\");\n }\n return this.tidy(\"backward\", () => {\n const accumulatedGradientMap = {};\n accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy;\n backpropagateGradients(\n accumulatedGradientMap,\n filteredTape,\n (f2) => this.tidy(f2),\n add\n );\n const grads2 = xs.map((x) => accumulatedGradientMap[x.id]);\n if (this.state.gradientDepth === 0) {\n this.state.activeTape.forEach((node) => {\n for (const tensor2 of node.saved) {\n tensor2.dispose();\n }\n });\n this.state.activeTape = null;\n }\n return { value: y, grads: grads2 };\n });\n }\n customGrad(f) {\n assert(isFunction(f), () => \"The f passed in customGrad(f) must be a function.\");\n return (...inputs) => {\n assert(inputs.every((t) => t instanceof Tensor), () => \"The args passed in customGrad(f)(x1, x2,...) must all be tensors\");\n let res;\n const inputMap = {};\n inputs.forEach((input2, i) => {\n inputMap[i] = input2;\n });\n const forwardFunc = (_, save) => {\n res = f(...[...inputs, save]);\n assert(res.value instanceof Tensor, () => \"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor\");\n assert(isFunction(res.gradFunc), () => \"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.\");\n return res.value;\n };\n const backwardsFunc = (dy, saved) => {\n const gradRes = res.gradFunc(dy, saved);\n const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes];\n 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(...).\");\n 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.\");\n const gradMap = {};\n grads2.forEach((grad2, i) => {\n gradMap[i] = () => grad2;\n });\n return gradMap;\n };\n return this.runKernelFunc({\n forwardFunc,\n backwardsFunc,\n inputs: inputMap\n });\n };\n }\n readSync(dataId) {\n const info = this.state.tensorInfo.get(dataId);\n return info.backend.readSync(dataId);\n }\n read(dataId) {\n const info = this.state.tensorInfo.get(dataId);\n return info.backend.read(dataId);\n }\n readToGPU(dataId, options) {\n const info = this.state.tensorInfo.get(dataId);\n return info.backend.readToGPU(dataId, options);\n }\n async time(query) {\n const start = now();\n const timingInfo = await this.backend.time(query);\n timingInfo.wallMs = now() - start;\n return timingInfo;\n }\n track(result) {\n if (this.state.activeScope != null) {\n result.scopeId = this.state.activeScope.id;\n this.state.activeScope.track.push(result);\n }\n return result;\n }\n get registeredVariables() {\n return this.state.registeredVariables;\n }\n reset() {\n this.pendingBackendInitId++;\n this.state.dispose();\n this.ENV.reset();\n this.state = new EngineState();\n for (const backendName in this.registry) {\n this.disposeRegisteredKernels(backendName);\n this.registry[backendName].dispose();\n delete this.registry[backendName];\n }\n this.backendName = null;\n this.backendInstance = null;\n this.pendingBackendInit = null;\n }\n};\nEngine.nextTensorId = 0;\nEngine.nextVariableId = 0;\nfunction ones(shape) {\n const values = makeOnesTypedArray(sizeFromShape(shape), \"float32\");\n return ENGINE.makeTensor(values, shape, \"float32\");\n}\nfunction getOrMakeEngine() {\n const ns = getGlobalNamespace();\n if (ns._tfengine == null) {\n const environment = new Environment(ns);\n ns._tfengine = new Engine(environment);\n }\n setEnvironmentGlobal(ns._tfengine.ENV);\n setTensorTracker(() => ns._tfengine);\n return ns._tfengine;\n}\nvar ENGINE = getOrMakeEngine();\nfunction add(a, b) {\n const inputs = { a, b };\n return ENGINE.runKernel(Add, inputs);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/device_util.js\nvar device_util_exports = {};\n__export(device_util_exports, {\n isBrowser: () => isBrowser,\n isMobile: () => isMobile,\n mockIsMobile: () => mockIsMobile\n});\nfunction _isNavigatorDefined() {\n return typeof navigator !== \"undefined\" && navigator != null;\n}\nvar isMobileMockValue;\nfunction mockIsMobile(value) {\n isMobileMockValue = value;\n}\nfunction isMobile(nav) {\n if (isMobileMockValue !== void 0) {\n return isMobileMockValue;\n }\n if (nav || _isNavigatorDefined()) {\n if (!nav) {\n nav = navigator;\n }\n if (nav.product === \"ReactNative\") {\n return true;\n }\n const a = nav.userAgent || nav.vendor || (typeof window !== \"undefined\" ? window.opera : \"\");\n if (!a) {\n const navAny = nav;\n return navAny.userAgentData && navAny.userAgentData.mobile;\n }\n 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));\n }\n return false;\n}\nfunction isBrowser() {\n return typeof window !== \"undefined\" && window.document != null || typeof WorkerGlobalScope !== \"undefined\";\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/flags.js\nvar ENV2 = env();\nENV2.registerFlag(\"DEBUG\", () => false, (debugValue) => {\n if (debugValue) {\n 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.\");\n }\n});\nENV2.registerFlag(\"IS_BROWSER\", () => isBrowser());\nENV2.registerFlag(\"IS_NODE\", () => typeof process !== \"undefined\" && typeof process.versions !== \"undefined\" && typeof process.versions.node !== \"undefined\");\nENV2.registerFlag(\"IS_CHROME\", () => typeof navigator !== \"undefined\" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor));\nENV2.registerFlag(\"PROD\", () => false);\nENV2.registerFlag(\"TENSORLIKE_CHECK_SHAPE_CONSISTENCY\", () => ENV2.getBool(\"DEBUG\"));\nENV2.registerFlag(\"DEPRECATION_WARNINGS_ENABLED\", () => true);\nENV2.registerFlag(\"IS_TEST\", () => false);\nENV2.registerFlag(\"CHECK_COMPUTATION_FOR_ERRORS\", () => true);\nENV2.registerFlag(\"WRAP_TO_IMAGEBITMAP\", () => false);\nENV2.registerFlag(\"ENGINE_COMPILE_ONLY\", () => false);\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js\nfunction inferShape(val, dtype) {\n let firstElem = val;\n if (isTypedArray(val)) {\n return dtype === \"string\" ? [] : [val.length];\n }\n if (!Array.isArray(val)) {\n return [];\n }\n const shape = [];\n while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== \"string\") {\n shape.push(firstElem.length);\n firstElem = firstElem[0];\n }\n if (Array.isArray(val) && env().getBool(\"TENSORLIKE_CHECK_SHAPE_CONSISTENCY\")) {\n deepAssertShapeConsistency(val, shape, []);\n }\n return shape;\n}\nfunction deepAssertShapeConsistency(val, shape, indices) {\n indices = indices || [];\n if (!Array.isArray(val) && !isTypedArray(val)) {\n assert(shape.length === 0, () => `Element arr[${indices.join(\"][\")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`);\n return;\n }\n assert(shape.length > 0, () => `Element arr[${indices.join(\"][\")}] should be a primitive, but is an array of ${val.length} elements`);\n assert(val.length === shape[0], () => `Element arr[${indices.join(\"][\")}] should have ${shape[0]} elements, but has ${val.length} elements`);\n const subShape = shape.slice(1);\n for (let i = 0; i < val.length; ++i) {\n deepAssertShapeConsistency(val[i], subShape, indices.concat(i));\n }\n}\nfunction assertDtype(expectedDtype, actualDType, argName, functionName) {\n if (expectedDtype === \"string_or_numeric\") {\n return;\n }\n if (expectedDtype == null) {\n throw new Error(`Expected dtype cannot be null.`);\n }\n if (expectedDtype !== \"numeric\" && expectedDtype !== actualDType || expectedDtype === \"numeric\" && actualDType === \"string\") {\n throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`);\n }\n}\nfunction convertToTensor(x, argName, functionName, parseAsDtype = \"numeric\") {\n if (x instanceof Tensor) {\n assertDtype(parseAsDtype, x.dtype, argName, functionName);\n return x;\n }\n let inferredDtype = inferDtype(x);\n if (inferredDtype !== \"string\" && [\"bool\", \"int32\", \"float32\"].indexOf(parseAsDtype) >= 0) {\n inferredDtype = parseAsDtype;\n }\n assertDtype(parseAsDtype, inferredDtype, argName, functionName);\n if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== \"number\" && typeof x !== \"boolean\" && typeof x !== \"string\") {\n const type = x == null ? \"null\" : x.constructor.name;\n throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`);\n }\n const inferredShape = inferShape(x, inferredDtype);\n if (!isTypedArray(x) && !Array.isArray(x)) {\n x = [x];\n }\n const skipTypedArray = true;\n const values = inferredDtype !== \"string\" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray);\n return ENGINE.makeTensor(values, inferredShape, inferredDtype);\n}\nfunction convertToTensorArray(arg, argName, functionName, parseAsDtype = \"numeric\") {\n if (!Array.isArray(arg)) {\n throw new Error(`Argument ${argName} passed to ${functionName} must be a \\`Tensor[]\\` or \\`TensorLike[]\\``);\n }\n const tensors = arg;\n return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype));\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/operation.js\nvar OP_SCOPE_SUFFIX = \"__op\";\nfunction op(f) {\n const keys = Object.keys(f);\n if (keys.length !== 1) {\n throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`);\n }\n let opName = keys[0];\n const fn = f[opName];\n if (opName.endsWith(\"_\")) {\n opName = opName.substring(0, opName.length - 1);\n }\n opName = opName + OP_SCOPE_SUFFIX;\n const f2 = (...args) => {\n ENGINE.startScope(opName);\n try {\n const result = fn(...args);\n if (isPromise(result)) {\n console.error(\"Cannot return a Promise inside of tidy.\");\n }\n ENGINE.endScope(result);\n return result;\n } catch (ex) {\n ENGINE.endScope(null);\n throw ex;\n }\n };\n Object.defineProperty(f2, \"name\", { value: opName, configurable: true });\n return f2;\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/complex.js\nfunction complex_(real5, imag5) {\n const $real = convertToTensor(real5, \"real\", \"complex\");\n const $imag = convertToTensor(imag5, \"imag\", \"complex\");\n assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`);\n const inputs = { real: $real, imag: $imag };\n return ENGINE.runKernel(Complex, inputs);\n}\nvar complex = op({ complex_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js\nfunction makeTensor(values, shape, inferredShape, dtype) {\n if (dtype == null) {\n dtype = inferDtype(values);\n }\n if (dtype === \"complex64\") {\n throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`);\n }\n if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== \"number\" && typeof values !== \"boolean\" && typeof values !== \"string\") {\n throw new Error(\"values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray\");\n }\n if (shape != null) {\n assertNonNegativeIntegerDimensions(shape);\n const providedSize = sizeFromShape(shape);\n const inferredSize = sizeFromShape(inferredShape);\n assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`);\n for (let i = 0; i < inferredShape.length; ++i) {\n const inferred = inferredShape[i];\n const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true;\n assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `);\n }\n }\n if (!isTypedArray(values) && !Array.isArray(values)) {\n values = [values];\n }\n shape = shape || inferredShape;\n values = dtype !== \"string\" ? toTypedArray(values, dtype) : flatten(values, [], true);\n return ENGINE.makeTensor(values, shape, dtype);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js\nfunction tensor(values, shape, dtype) {\n const inferredShape = inferShape(values, dtype);\n return makeTensor(values, shape, inferredShape, dtype);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/types.js\nvar DTYPE_VALUE_SIZE_MAP = {\n \"float32\": 4,\n \"float16\": 2,\n \"int32\": 4,\n \"uint16\": 2,\n \"uint8\": 1,\n \"bool\": 1,\n \"complex64\": 8\n};\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js\nvar NUM_BYTES_STRING_LENGTH = 4;\nasync function encodeWeights(tensors, group) {\n const specs = [];\n const dataPromises = [];\n const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors);\n for (let i = 0; i < names.length; ++i) {\n const name = names[i];\n const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name];\n if (t.dtype !== \"float32\" && t.dtype !== \"int32\" && t.dtype !== \"bool\" && t.dtype !== \"string\" && t.dtype !== \"complex64\") {\n throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`);\n }\n const spec = { name, shape: t.shape, dtype: t.dtype };\n if (t.dtype === \"string\") {\n const utf8bytes = new Promise(async (resolve) => {\n const vals = await t.bytes();\n const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length;\n const bytes = new Uint8Array(totalNumBytes);\n let offset = 0;\n for (let i2 = 0; i2 < vals.length; i2++) {\n const val = vals[i2];\n const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer);\n bytes.set(bytesOfLength, offset);\n offset += NUM_BYTES_STRING_LENGTH;\n bytes.set(val, offset);\n offset += val.length;\n }\n resolve(bytes);\n });\n dataPromises.push(utf8bytes);\n } else {\n dataPromises.push(t.data());\n }\n if (group != null) {\n spec.group = group;\n }\n specs.push(spec);\n }\n const tensorValues = await Promise.all(dataPromises);\n return { data: concatenateTypedArrays(tensorValues), specs };\n}\nfunction decodeWeights(buffer2, specs) {\n const out = {};\n let float16Decode;\n let offset = 0;\n for (const spec of specs) {\n const name = spec.name;\n const dtype = spec.dtype;\n const shape = spec.shape;\n const size = sizeFromShape(shape);\n let values;\n if (\"quantization\" in spec) {\n const quantization = spec.quantization;\n if (quantization.dtype === \"uint8\" || quantization.dtype === \"uint16\") {\n if (!(\"min\" in quantization && \"scale\" in quantization)) {\n throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`);\n }\n } else if (quantization.dtype === \"float16\") {\n if (dtype !== \"float32\") {\n throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`);\n }\n } else {\n throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`);\n }\n const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype];\n const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor);\n const quantizedArray = quantization.dtype === \"uint8\" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer);\n if (dtype === \"float32\") {\n if (quantization.dtype === \"uint8\" || quantization.dtype === \"uint16\") {\n values = new Float32Array(quantizedArray.length);\n for (let i = 0; i < quantizedArray.length; i++) {\n const v = quantizedArray[i];\n values[i] = v * quantization.scale + quantization.min;\n }\n } else if (quantization.dtype === \"float16\") {\n if (float16Decode === void 0) {\n float16Decode = getFloat16Decoder();\n }\n values = float16Decode(quantizedArray);\n } else {\n throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`);\n }\n } else if (dtype === \"int32\") {\n if (quantization.dtype !== \"uint8\" && quantization.dtype !== \"uint16\") {\n throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`);\n }\n values = new Int32Array(quantizedArray.length);\n for (let i = 0; i < quantizedArray.length; i++) {\n const v = quantizedArray[i];\n values[i] = Math.round(v * quantization.scale + quantization.min);\n }\n } else {\n throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`);\n }\n offset += size * quantizationSizeFactor;\n } else if (dtype === \"string\") {\n const size2 = sizeFromShape(spec.shape);\n values = [];\n for (let i = 0; i < size2; i++) {\n const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0];\n offset += NUM_BYTES_STRING_LENGTH;\n const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength));\n values.push(bytes);\n offset += byteLength;\n }\n } else {\n const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype];\n const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor);\n if (dtype === \"float32\") {\n values = new Float32Array(byteBuffer);\n } else if (dtype === \"int32\") {\n values = new Int32Array(byteBuffer);\n } else if (dtype === \"bool\") {\n values = new Uint8Array(byteBuffer);\n } else if (dtype === \"complex64\") {\n values = new Float32Array(byteBuffer);\n const real5 = new Float32Array(values.length / 2);\n const image2 = new Float32Array(values.length / 2);\n for (let i = 0; i < real5.length; i++) {\n real5[i] = values[i * 2];\n image2[i] = values[i * 2 + 1];\n }\n const realTensor = tensor(real5, shape, \"float32\");\n const imageTensor = tensor(image2, shape, \"float32\");\n out[name] = complex(realTensor, imageTensor);\n realTensor.dispose();\n imageTensor.dispose();\n } else {\n throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`);\n }\n offset += size * dtypeFactor;\n }\n if (dtype !== \"complex64\") {\n out[name] = tensor(values, shape, dtype);\n }\n }\n return out;\n}\nfunction concatenateTypedArrays(xs) {\n if (xs === null) {\n throw new Error(`Invalid input value: ${JSON.stringify(xs)}`);\n }\n let totalByteLength = 0;\n const normalizedXs = [];\n xs.forEach((x) => {\n totalByteLength += x.byteLength;\n normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x));\n if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) {\n throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`);\n }\n });\n const y = new Uint8Array(totalByteLength);\n let offset = 0;\n normalizedXs.forEach((x) => {\n y.set(new Uint8Array(x.buffer), offset);\n offset += x.byteLength;\n });\n return y.buffer;\n}\nvar useNodeBuffer = typeof Buffer !== \"undefined\" && (typeof Blob === \"undefined\" || typeof atob === \"undefined\" || typeof btoa === \"undefined\");\nfunction stringByteLength(str) {\n if (useNodeBuffer) {\n return Buffer.byteLength(str);\n }\n return new Blob([str]).size;\n}\nfunction arrayBufferToBase64String(buffer2) {\n if (useNodeBuffer) {\n return Buffer.from(buffer2).toString(\"base64\");\n }\n const buf = new Uint8Array(buffer2);\n let s = \"\";\n for (let i = 0, l = buf.length; i < l; i++) {\n s += String.fromCharCode(buf[i]);\n }\n return btoa(s);\n}\nfunction base64StringToArrayBuffer(str) {\n if (useNodeBuffer) {\n const buf = Buffer.from(str, \"base64\");\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n }\n const s = atob(str);\n const buffer2 = new Uint8Array(s.length);\n for (let i = 0; i < s.length; ++i) {\n buffer2.set([s.charCodeAt(i)], i);\n }\n return buffer2.buffer;\n}\nfunction concatenateArrayBuffers(buffers) {\n if (buffers.length === 1) {\n return buffers[0];\n }\n let totalByteLength = 0;\n buffers.forEach((buffer2) => {\n totalByteLength += buffer2.byteLength;\n });\n const temp = new Uint8Array(totalByteLength);\n let offset = 0;\n buffers.forEach((buffer2) => {\n temp.set(new Uint8Array(buffer2), offset);\n offset += buffer2.byteLength;\n });\n return temp.buffer;\n}\nfunction basename(path) {\n const SEPARATOR = \"/\";\n path = path.trim();\n while (path.endsWith(SEPARATOR)) {\n path = path.slice(0, path.length - 1);\n }\n const items = path.split(SEPARATOR);\n return items[items.length - 1];\n}\nfunction getModelJSONForModelArtifacts(artifacts, manifest) {\n const result = {\n modelTopology: artifacts.modelTopology,\n format: artifacts.format,\n generatedBy: artifacts.generatedBy,\n convertedBy: artifacts.convertedBy,\n weightsManifest: manifest\n };\n if (artifacts.signature != null) {\n result.signature = artifacts.signature;\n }\n if (artifacts.userDefinedMetadata != null) {\n result.userDefinedMetadata = artifacts.userDefinedMetadata;\n }\n if (artifacts.modelInitializer != null) {\n result.modelInitializer = artifacts.modelInitializer;\n }\n if (artifacts.trainingConfig != null) {\n result.trainingConfig = artifacts.trainingConfig;\n }\n return result;\n}\nasync function getModelArtifactsForJSON(modelJSON, loadWeights2) {\n const modelArtifacts = {\n modelTopology: modelJSON.modelTopology,\n format: modelJSON.format,\n generatedBy: modelJSON.generatedBy,\n convertedBy: modelJSON.convertedBy\n };\n if (modelJSON.trainingConfig != null) {\n modelArtifacts.trainingConfig = modelJSON.trainingConfig;\n }\n if (modelJSON.weightsManifest != null) {\n const [weightSpecs, weightData] = await loadWeights2(modelJSON.weightsManifest);\n modelArtifacts.weightSpecs = weightSpecs;\n modelArtifacts.weightData = weightData;\n }\n if (modelJSON.signature != null) {\n modelArtifacts.signature = modelJSON.signature;\n }\n if (modelJSON.userDefinedMetadata != null) {\n modelArtifacts.userDefinedMetadata = modelJSON.userDefinedMetadata;\n }\n if (modelJSON.modelInitializer != null) {\n modelArtifacts.modelInitializer = modelJSON.modelInitializer;\n }\n return modelArtifacts;\n}\nfunction getModelArtifactsInfoForJSON(modelArtifacts) {\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error(\"Expected JSON model topology, received ArrayBuffer.\");\n }\n return {\n dateSaved: new Date(),\n modelTopologyType: \"JSON\",\n modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)),\n weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)),\n weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength\n };\n}\nfunction computeFloat16MantisaTable() {\n const convertMantissa = (i) => {\n let m = i << 13;\n let e = 0;\n while ((m & 8388608) === 0) {\n e -= 8388608;\n m <<= 1;\n }\n m &= ~8388608;\n e += 947912704;\n return m | e;\n };\n const mantisaTable = new Uint32Array(2048);\n mantisaTable[0] = 0;\n for (let i = 1; i < 1024; i++) {\n mantisaTable[i] = convertMantissa(i);\n }\n for (let i = 1024; i < 2048; i++) {\n mantisaTable[i] = 939524096 + (i - 1024 << 13);\n }\n return mantisaTable;\n}\nfunction computeFloat16ExponentTable() {\n const exponentTable = new Uint32Array(64);\n exponentTable[0] = 0;\n exponentTable[31] = 1199570944;\n exponentTable[32] = 2147483648;\n exponentTable[63] = 3347054592;\n for (let i = 1; i < 31; i++) {\n exponentTable[i] = i << 23;\n }\n for (let i = 33; i < 63; i++) {\n exponentTable[i] = 2147483648 + (i - 32 << 23);\n }\n return exponentTable;\n}\nfunction computeFloat16OffsetTable() {\n const offsetTable = new Uint32Array(64);\n for (let i = 0; i < 64; i++) {\n offsetTable[i] = 1024;\n }\n offsetTable[0] = offsetTable[32] = 0;\n return offsetTable;\n}\nfunction getFloat16Decoder() {\n const mantisaTable = computeFloat16MantisaTable();\n const exponentTable = computeFloat16ExponentTable();\n const offsetTable = computeFloat16OffsetTable();\n return (quantizedArray) => {\n const buffer2 = new ArrayBuffer(4 * quantizedArray.length);\n const bufferUint32View = new Uint32Array(buffer2);\n for (let index = 0; index < quantizedArray.length; index++) {\n const float16Bits = quantizedArray[index];\n const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10];\n bufferUint32View[index] = float32Bits;\n }\n return new Float32Array(buffer2);\n };\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js\nvar IORouterRegistry = class {\n constructor() {\n this.saveRouters = [];\n this.loadRouters = [];\n }\n static getInstance() {\n if (IORouterRegistry.instance == null) {\n IORouterRegistry.instance = new IORouterRegistry();\n }\n return IORouterRegistry.instance;\n }\n static registerSaveRouter(saveRouter) {\n IORouterRegistry.getInstance().saveRouters.push(saveRouter);\n }\n static registerLoadRouter(loadRouter) {\n IORouterRegistry.getInstance().loadRouters.push(loadRouter);\n }\n static getSaveHandlers(url) {\n return IORouterRegistry.getHandlers(url, \"save\");\n }\n static getLoadHandlers(url, loadOptions) {\n return IORouterRegistry.getHandlers(url, \"load\", loadOptions);\n }\n static getHandlers(url, handlerType, loadOptions) {\n const validHandlers = [];\n const routers = handlerType === \"load\" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters;\n routers.forEach((router) => {\n const handler = router(url, loadOptions);\n if (handler !== null) {\n validHandlers.push(handler);\n }\n });\n return validHandlers;\n }\n};\nvar registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter);\nvar registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter);\nvar getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url);\nvar getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions);\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js\nvar DATABASE_NAME = \"tensorflowjs\";\nvar DATABASE_VERSION = 1;\nvar MODEL_STORE_NAME = \"models_store\";\nvar INFO_STORE_NAME = \"model_info_store\";\nfunction getIndexedDBFactory() {\n if (!env().getBool(\"IS_BROWSER\")) {\n throw new Error(\"Failed to obtain IndexedDB factory because the current environmentis not a web browser.\");\n }\n const theWindow = typeof window === \"undefined\" ? self : window;\n const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB;\n if (factory == null) {\n throw new Error(\"The current browser does not appear to support IndexedDB.\");\n }\n return factory;\n}\nfunction setUpDatabase(openRequest) {\n const db = openRequest.result;\n db.createObjectStore(MODEL_STORE_NAME, { keyPath: \"modelPath\" });\n db.createObjectStore(INFO_STORE_NAME, { keyPath: \"modelPath\" });\n}\nvar BrowserIndexedDB = class {\n constructor(modelPath) {\n this.indexedDB = getIndexedDBFactory();\n if (modelPath == null || !modelPath) {\n throw new Error(\"For IndexedDB, modelPath must not be null, undefined or empty.\");\n }\n this.modelPath = modelPath;\n }\n async save(modelArtifacts) {\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error(\"BrowserLocalStorage.save() does not support saving model topology in binary formats yet.\");\n }\n return this.databaseAction(this.modelPath, modelArtifacts);\n }\n async load() {\n return this.databaseAction(this.modelPath);\n }\n databaseAction(modelPath, modelArtifacts) {\n return new Promise((resolve, reject) => {\n const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n openRequest.onsuccess = () => {\n const db = openRequest.result;\n if (modelArtifacts == null) {\n const modelTx = db.transaction(MODEL_STORE_NAME, \"readonly\");\n const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n const getRequest = modelStore.get(this.modelPath);\n getRequest.onsuccess = () => {\n if (getRequest.result == null) {\n db.close();\n return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));\n } else {\n resolve(getRequest.result.modelArtifacts);\n }\n };\n getRequest.onerror = (error) => {\n db.close();\n return reject(getRequest.error);\n };\n modelTx.oncomplete = () => db.close();\n } else {\n const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n const infoTx = db.transaction(INFO_STORE_NAME, \"readwrite\");\n let infoStore = infoTx.objectStore(INFO_STORE_NAME);\n const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo });\n let modelTx;\n putInfoRequest.onsuccess = () => {\n modelTx = db.transaction(MODEL_STORE_NAME, \"readwrite\");\n const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n const putModelRequest = modelStore.put({\n modelPath: this.modelPath,\n modelArtifacts,\n modelArtifactsInfo\n });\n putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo });\n putModelRequest.onerror = (error) => {\n infoStore = infoTx.objectStore(INFO_STORE_NAME);\n const deleteInfoRequest = infoStore.delete(this.modelPath);\n deleteInfoRequest.onsuccess = () => {\n db.close();\n return reject(putModelRequest.error);\n };\n deleteInfoRequest.onerror = (error2) => {\n db.close();\n return reject(putModelRequest.error);\n };\n };\n };\n putInfoRequest.onerror = (error) => {\n db.close();\n return reject(putInfoRequest.error);\n };\n infoTx.oncomplete = () => {\n if (modelTx == null) {\n db.close();\n } else {\n modelTx.oncomplete = () => db.close();\n }\n };\n }\n };\n openRequest.onerror = (error) => reject(openRequest.error);\n });\n }\n};\nBrowserIndexedDB.URL_SCHEME = \"indexeddb://\";\nvar indexedDBRouter = (url) => {\n if (!env().getBool(\"IS_BROWSER\")) {\n return null;\n } else {\n if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) {\n return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length));\n } else {\n return null;\n }\n }\n};\nIORouterRegistry.registerSaveRouter(indexedDBRouter);\nIORouterRegistry.registerLoadRouter(indexedDBRouter);\nfunction browserIndexedDB(modelPath) {\n return new BrowserIndexedDB(modelPath);\n}\nfunction maybeStripScheme(key) {\n return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key;\n}\nvar BrowserIndexedDBManager = class {\n constructor() {\n this.indexedDB = getIndexedDBFactory();\n }\n async listModels() {\n return new Promise((resolve, reject) => {\n const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n openRequest.onsuccess = () => {\n const db = openRequest.result;\n const tx = db.transaction(INFO_STORE_NAME, \"readonly\");\n const store = tx.objectStore(INFO_STORE_NAME);\n const getAllInfoRequest = store.getAll();\n getAllInfoRequest.onsuccess = () => {\n const out = {};\n for (const item of getAllInfoRequest.result) {\n out[item.modelPath] = item.modelArtifactsInfo;\n }\n resolve(out);\n };\n getAllInfoRequest.onerror = (error) => {\n db.close();\n return reject(getAllInfoRequest.error);\n };\n tx.oncomplete = () => db.close();\n };\n openRequest.onerror = (error) => reject(openRequest.error);\n });\n }\n async removeModel(path) {\n path = maybeStripScheme(path);\n return new Promise((resolve, reject) => {\n const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n openRequest.onsuccess = () => {\n const db = openRequest.result;\n const infoTx = db.transaction(INFO_STORE_NAME, \"readwrite\");\n const infoStore = infoTx.objectStore(INFO_STORE_NAME);\n const getInfoRequest = infoStore.get(path);\n let modelTx;\n getInfoRequest.onsuccess = () => {\n if (getInfoRequest.result == null) {\n db.close();\n return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`));\n } else {\n const deleteInfoRequest = infoStore.delete(path);\n const deleteModelData = () => {\n modelTx = db.transaction(MODEL_STORE_NAME, \"readwrite\");\n const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n const deleteModelRequest = modelStore.delete(path);\n deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo);\n deleteModelRequest.onerror = (error) => reject(getInfoRequest.error);\n };\n deleteInfoRequest.onsuccess = deleteModelData;\n deleteInfoRequest.onerror = (error) => {\n deleteModelData();\n db.close();\n return reject(getInfoRequest.error);\n };\n }\n };\n getInfoRequest.onerror = (error) => {\n db.close();\n return reject(getInfoRequest.error);\n };\n infoTx.oncomplete = () => {\n if (modelTx == null) {\n db.close();\n } else {\n modelTx.oncomplete = () => db.close();\n }\n };\n };\n openRequest.onerror = (error) => reject(openRequest.error);\n });\n }\n};\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js\nvar PATH_SEPARATOR = \"/\";\nvar PATH_PREFIX = \"tensorflowjs_models\";\nvar INFO_SUFFIX = \"info\";\nvar MODEL_TOPOLOGY_SUFFIX = \"model_topology\";\nvar WEIGHT_SPECS_SUFFIX = \"weight_specs\";\nvar WEIGHT_DATA_SUFFIX = \"weight_data\";\nvar MODEL_METADATA_SUFFIX = \"model_metadata\";\nfunction getModelKeys(path) {\n return {\n info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR),\n topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR),\n weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR),\n weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR),\n modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR)\n };\n}\nfunction removeItems(keys) {\n for (const key of Object.values(keys)) {\n window.localStorage.removeItem(key);\n }\n}\nfunction getModelPathFromKey(key) {\n const items = key.split(PATH_SEPARATOR);\n if (items.length < 3) {\n throw new Error(`Invalid key format: ${key}`);\n }\n return items.slice(1, items.length - 1).join(PATH_SEPARATOR);\n}\nfunction maybeStripScheme2(key) {\n return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key;\n}\nvar BrowserLocalStorage = class {\n constructor(modelPath) {\n if (!env().getBool(\"IS_BROWSER\") || typeof window === \"undefined\" || typeof window.localStorage === \"undefined\") {\n throw new Error(\"The current environment does not support local storage.\");\n }\n this.LS = window.localStorage;\n if (modelPath == null || !modelPath) {\n throw new Error(\"For local storage, modelPath must not be null, undefined or empty.\");\n }\n this.modelPath = modelPath;\n this.keys = getModelKeys(this.modelPath);\n }\n async save(modelArtifacts) {\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error(\"BrowserLocalStorage.save() does not support saving model topology in binary formats yet.\");\n } else {\n const topology = JSON.stringify(modelArtifacts.modelTopology);\n const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs);\n const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n try {\n this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo));\n this.LS.setItem(this.keys.topology, topology);\n this.LS.setItem(this.keys.weightSpecs, weightSpecs);\n this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData));\n const metadata = {\n format: modelArtifacts.format,\n generatedBy: modelArtifacts.generatedBy,\n convertedBy: modelArtifacts.convertedBy,\n signature: modelArtifacts.signature != null ? modelArtifacts.signature : void 0,\n userDefinedMetadata: modelArtifacts.userDefinedMetadata != null ? modelArtifacts.userDefinedMetadata : void 0,\n modelInitializer: modelArtifacts.modelInitializer != null ? modelArtifacts.modelInitializer : void 0,\n trainingConfig: modelArtifacts.trainingConfig != null ? modelArtifacts.trainingConfig : void 0\n };\n this.LS.setItem(this.keys.modelMetadata, JSON.stringify(metadata));\n return { modelArtifactsInfo };\n } catch (err) {\n removeItems(this.keys);\n 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}.`);\n }\n }\n }\n async load() {\n const info = JSON.parse(this.LS.getItem(this.keys.info));\n if (info == null) {\n throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);\n }\n if (info.modelTopologyType !== \"JSON\") {\n throw new Error(\"BrowserLocalStorage does not support loading non-JSON model topology yet.\");\n }\n const out = {};\n const topology = JSON.parse(this.LS.getItem(this.keys.topology));\n if (topology == null) {\n throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);\n }\n out.modelTopology = topology;\n const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs));\n if (weightSpecs == null) {\n throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);\n }\n out.weightSpecs = weightSpecs;\n const metadataString = this.LS.getItem(this.keys.modelMetadata);\n if (metadataString != null) {\n const metadata = JSON.parse(metadataString);\n out.format = metadata.format;\n out.generatedBy = metadata.generatedBy;\n out.convertedBy = metadata.convertedBy;\n if (metadata.signature != null) {\n out.signature = metadata.signature;\n }\n if (metadata.userDefinedMetadata != null) {\n out.userDefinedMetadata = metadata.userDefinedMetadata;\n }\n if (metadata.modelInitializer != null) {\n out.modelInitializer = metadata.modelInitializer;\n }\n if (metadata.trainingConfig != null) {\n out.trainingConfig = metadata.trainingConfig;\n }\n }\n const weightDataBase64 = this.LS.getItem(this.keys.weightData);\n if (weightDataBase64 == null) {\n throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);\n }\n out.weightData = base64StringToArrayBuffer(weightDataBase64);\n return out;\n }\n};\nBrowserLocalStorage.URL_SCHEME = \"localstorage://\";\nvar localStorageRouter = (url) => {\n if (!env().getBool(\"IS_BROWSER\")) {\n return null;\n } else {\n if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) {\n return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length));\n } else {\n return null;\n }\n }\n};\nIORouterRegistry.registerSaveRouter(localStorageRouter);\nIORouterRegistry.registerLoadRouter(localStorageRouter);\nfunction browserLocalStorage(modelPath) {\n return new BrowserLocalStorage(modelPath);\n}\nvar BrowserLocalStorageManager = class {\n constructor() {\n assert(env().getBool(\"IS_BROWSER\"), () => \"Current environment is not a web browser\");\n assert(typeof window === \"undefined\" || typeof window.localStorage !== \"undefined\", () => \"Current browser does not appear to support localStorage\");\n this.LS = window.localStorage;\n }\n async listModels() {\n const out = {};\n const prefix = PATH_PREFIX + PATH_SEPARATOR;\n const suffix = PATH_SEPARATOR + INFO_SUFFIX;\n for (let i = 0; i < this.LS.length; ++i) {\n const key = this.LS.key(i);\n if (key.startsWith(prefix) && key.endsWith(suffix)) {\n const modelPath = getModelPathFromKey(key);\n out[modelPath] = JSON.parse(this.LS.getItem(key));\n }\n }\n return out;\n }\n async removeModel(path) {\n path = maybeStripScheme2(path);\n const keys = getModelKeys(path);\n if (this.LS.getItem(keys.info) == null) {\n throw new Error(`Cannot find model at path '${path}'`);\n }\n const info = JSON.parse(this.LS.getItem(keys.info));\n removeItems(keys);\n return info;\n }\n};\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/model_management.js\nvar URL_SCHEME_SUFFIX = \"://\";\nvar ModelStoreManagerRegistry = class {\n constructor() {\n this.managers = {};\n }\n static getInstance() {\n if (ModelStoreManagerRegistry.instance == null) {\n ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry();\n }\n return ModelStoreManagerRegistry.instance;\n }\n static registerManager(scheme, manager) {\n assert(scheme != null, () => \"scheme must not be undefined or null.\");\n if (scheme.endsWith(URL_SCHEME_SUFFIX)) {\n scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX));\n }\n assert(scheme.length > 0, () => \"scheme must not be an empty string.\");\n const registry = ModelStoreManagerRegistry.getInstance();\n assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`);\n registry.managers[scheme] = manager;\n }\n static getManager(scheme) {\n const manager = ModelStoreManagerRegistry.getInstance().managers[scheme];\n if (manager == null) {\n throw new Error(`Cannot find model manager for scheme '${scheme}'`);\n }\n return manager;\n }\n static getSchemes() {\n return Object.keys(ModelStoreManagerRegistry.getInstance().managers);\n }\n};\nfunction parseURL(url) {\n if (url.indexOf(URL_SCHEME_SUFFIX) === -1) {\n throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(\",\")}`);\n }\n return {\n scheme: url.split(URL_SCHEME_SUFFIX)[0],\n path: url.split(URL_SCHEME_SUFFIX)[1]\n };\n}\nasync function cloneModelInternal(sourceURL, destURL, deleteSource = false) {\n assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`);\n const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL);\n assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`);\n assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`);\n const loadHandler = loadHandlers[0];\n const saveHandlers = IORouterRegistry.getSaveHandlers(destURL);\n assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`);\n assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`);\n const saveHandler = saveHandlers[0];\n const sourceScheme = parseURL(sourceURL).scheme;\n const sourcePath = parseURL(sourceURL).path;\n const sameMedium = sourceScheme === parseURL(sourceURL).scheme;\n const modelArtifacts = await loadHandler.load();\n if (deleteSource && sameMedium) {\n await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath);\n }\n const saveResult = await saveHandler.save(modelArtifacts);\n if (deleteSource && !sameMedium) {\n await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath);\n }\n return saveResult.modelArtifactsInfo;\n}\nasync function listModels() {\n const schemes = ModelStoreManagerRegistry.getSchemes();\n const out = {};\n for (const scheme of schemes) {\n const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels();\n for (const path in schemeOut) {\n const url = scheme + URL_SCHEME_SUFFIX + path;\n out[url] = schemeOut[path];\n }\n }\n return out;\n}\nasync function removeModel(url) {\n const schemeAndPath = parseURL(url);\n const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme);\n return manager.removeModel(schemeAndPath.path);\n}\nasync function copyModel(sourceURL, destURL) {\n const deleteSource = false;\n return cloneModelInternal(sourceURL, destURL, deleteSource);\n}\nasync function moveModel(sourceURL, destURL) {\n const deleteSource = true;\n return cloneModelInternal(sourceURL, destURL, deleteSource);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js\nvar PlatformBrowser = class {\n fetch(path, init2) {\n return fetch(path, init2);\n }\n now() {\n return performance.now();\n }\n encode(text, encoding) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`);\n }\n if (this.textEncoder == null) {\n this.textEncoder = new TextEncoder();\n }\n return this.textEncoder.encode(text);\n }\n decode(bytes, encoding) {\n return new TextDecoder(encoding).decode(bytes);\n }\n};\nif (env().get(\"IS_BROWSER\")) {\n env().setPlatform(\"browser\", new PlatformBrowser());\n try {\n ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager());\n } catch (err) {\n }\n try {\n ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager());\n } catch (err) {\n }\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js\nvar getNodeFetch = {\n importFetch: () => require_browser()\n};\nvar systemFetch;\nvar PlatformNode = class {\n constructor() {\n this.util = require_util();\n this.textEncoder = new this.util.TextEncoder();\n }\n fetch(path, requestInits) {\n if (env().global.fetch != null) {\n return env().global.fetch(path, requestInits);\n }\n if (systemFetch == null) {\n systemFetch = getNodeFetch.importFetch();\n }\n return systemFetch(path, requestInits);\n }\n now() {\n const time2 = process.hrtime();\n return time2[0] * 1e3 + time2[1] / 1e6;\n }\n encode(text, encoding) {\n if (encoding !== \"utf-8\" && encoding !== \"utf8\") {\n throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`);\n }\n return this.textEncoder.encode(text);\n }\n decode(bytes, encoding) {\n if (bytes.length === 0) {\n return \"\";\n }\n return new this.util.TextDecoder(encoding).decode(bytes);\n }\n};\nif (env().get(\"IS_NODE\") && !env().get(\"IS_BROWSER\")) {\n env().setPlatform(\"node\", new PlatformNode());\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js\nfunction buffer(shape, dtype = \"float32\", values) {\n dtype = dtype || \"float32\";\n assertNonNegativeIntegerDimensions(shape);\n return new TensorBuffer(shape, dtype, values);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/cast.js\nfunction cast_(x, dtype) {\n const $x = convertToTensor(x, \"x\", \"cast\");\n if (!isValidDtype(dtype)) {\n throw new Error(`Failed to cast to unknown dtype ${dtype}`);\n }\n if (dtype === \"string\" && $x.dtype !== \"string\" || dtype !== \"string\" && $x.dtype === \"string\") {\n throw new Error(\"Only strings can be casted to strings\");\n }\n const inputs = { x: $x };\n const attrs = { dtype };\n return ENGINE.runKernel(Cast, inputs, attrs);\n}\nvar cast = op({ cast_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/clone.js\nfunction clone_(x) {\n const $x = convertToTensor(x, \"x\", \"clone\", \"string_or_numeric\");\n const inputs = { x: $x };\n return ENGINE.runKernel(Identity, inputs);\n}\nvar clone = op({ clone_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/print.js\nfunction print(x, verbose = false) {\n console.log(x.toString(verbose));\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js\ngetOrMakeEngine();\nvar opHandler2 = {\n buffer,\n cast,\n clone,\n print\n};\nsetOpHandler(opHandler2);\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/io.js\nvar io_exports = {};\n__export(io_exports, {\n browserFiles: () => browserFiles,\n browserHTTPRequest: () => browserHTTPRequest,\n concatenateArrayBuffers: () => concatenateArrayBuffers,\n copyModel: () => copyModel,\n decodeWeights: () => decodeWeights,\n encodeWeights: () => encodeWeights,\n fromMemory: () => fromMemory,\n fromMemorySync: () => fromMemorySync,\n getLoadHandlers: () => getLoadHandlers,\n getModelArtifactsForJSON: () => getModelArtifactsForJSON,\n getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON,\n getSaveHandlers: () => getSaveHandlers,\n http: () => http,\n isHTTPScheme: () => isHTTPScheme,\n listModels: () => listModels,\n loadWeights: () => loadWeights,\n moveModel: () => moveModel,\n registerLoadRouter: () => registerLoadRouter,\n registerSaveRouter: () => registerSaveRouter,\n removeModel: () => removeModel,\n weightsLoaderFactory: () => weightsLoaderFactory,\n withSaveHandler: () => withSaveHandler,\n withSaveHandlerSync: () => withSaveHandlerSync\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js\nvar DEFAULT_FILE_NAME_PREFIX = \"model\";\nvar DEFAULT_JSON_EXTENSION_NAME = \".json\";\nvar DEFAULT_WEIGHT_DATA_EXTENSION_NAME = \".weights.bin\";\nfunction defer(f) {\n return new Promise((resolve) => setTimeout(resolve)).then(f);\n}\nvar BrowserDownloads = class {\n constructor(fileNamePrefix) {\n if (!env().getBool(\"IS_BROWSER\")) {\n throw new Error(\"browserDownloads() cannot proceed because the current environment is not a browser.\");\n }\n if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) {\n fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length);\n }\n if (fileNamePrefix == null || fileNamePrefix.length === 0) {\n fileNamePrefix = DEFAULT_FILE_NAME_PREFIX;\n }\n this.modelJsonFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME;\n this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME;\n }\n async save(modelArtifacts) {\n if (typeof document === \"undefined\") {\n throw new Error(\"Browser downloads are not supported in this environment since `document` is not present\");\n }\n const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: \"application/octet-stream\" }));\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error(\"BrowserDownloads.save() does not support saving model topology in binary formats yet.\");\n } else {\n const weightsManifest = [{\n paths: [\"./\" + this.weightDataFileName],\n weights: modelArtifacts.weightSpecs\n }];\n const modelJSON = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest);\n const modelJsonURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelJSON)], { type: \"application/json\" }));\n const jsonAnchor = this.modelJsonAnchor == null ? document.createElement(\"a\") : this.modelJsonAnchor;\n jsonAnchor.download = this.modelJsonFileName;\n jsonAnchor.href = modelJsonURL;\n await defer(() => jsonAnchor.dispatchEvent(new MouseEvent(\"click\")));\n if (modelArtifacts.weightData != null) {\n const weightDataAnchor = this.weightDataAnchor == null ? document.createElement(\"a\") : this.weightDataAnchor;\n weightDataAnchor.download = this.weightDataFileName;\n weightDataAnchor.href = weightsURL;\n await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent(\"click\")));\n }\n return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) };\n }\n }\n};\nBrowserDownloads.URL_SCHEME = \"downloads://\";\nvar BrowserFiles = class {\n constructor(files) {\n if (files == null || files.length < 1) {\n throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`);\n }\n this.jsonFile = files[0];\n this.weightsFiles = files.slice(1);\n }\n async load() {\n return new Promise((resolve, reject) => {\n const jsonReader = new FileReader();\n jsonReader.onload = (event) => {\n const modelJSON = JSON.parse(event.target.result);\n const modelTopology = modelJSON.modelTopology;\n if (modelTopology == null) {\n reject(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));\n return;\n }\n const weightsManifest = modelJSON.weightsManifest;\n if (weightsManifest == null) {\n reject(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));\n return;\n }\n if (this.weightsFiles.length === 0) {\n resolve({ modelTopology });\n return;\n }\n const modelArtifactsPromise = getModelArtifactsForJSON(modelJSON, (weightsManifest2) => this.loadWeights(weightsManifest2));\n resolve(modelArtifactsPromise);\n };\n jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`);\n jsonReader.readAsText(this.jsonFile);\n });\n }\n loadWeights(weightsManifest) {\n const weightSpecs = [];\n const paths = [];\n for (const entry of weightsManifest) {\n weightSpecs.push(...entry.weights);\n paths.push(...entry.paths);\n }\n const pathToFile = this.checkManifestAndWeightFiles(weightsManifest);\n const promises = paths.map((path) => this.loadWeightsFile(path, pathToFile[path]));\n return Promise.all(promises).then((buffers) => [weightSpecs, concatenateArrayBuffers(buffers)]);\n }\n loadWeightsFile(path, file) {\n return new Promise((resolve, reject) => {\n const weightFileReader = new FileReader();\n weightFileReader.onload = (event) => {\n const weightData = event.target.result;\n resolve(weightData);\n };\n weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`);\n weightFileReader.readAsArrayBuffer(file);\n });\n }\n checkManifestAndWeightFiles(manifest) {\n const basenames = [];\n const fileNames = this.weightsFiles.map((file) => basename(file.name));\n const pathToFile = {};\n for (const group of manifest) {\n group.paths.forEach((path) => {\n const pathBasename = basename(path);\n if (basenames.indexOf(pathBasename) !== -1) {\n throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`);\n }\n basenames.push(pathBasename);\n if (fileNames.indexOf(pathBasename) === -1) {\n throw new Error(`Weight file with basename '${pathBasename}' is not provided.`);\n } else {\n pathToFile[path] = this.weightsFiles[fileNames.indexOf(pathBasename)];\n }\n });\n }\n if (basenames.length !== this.weightsFiles.length) {\n throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${this.weightsFiles.length}).`);\n }\n return pathToFile;\n }\n};\nvar browserDownloadsRouter = (url) => {\n if (!env().getBool(\"IS_BROWSER\")) {\n return null;\n } else {\n if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) {\n return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length));\n } else {\n return null;\n }\n }\n};\nIORouterRegistry.registerSaveRouter(browserDownloadsRouter);\nfunction browserDownloads(fileNamePrefix = \"model\") {\n return new BrowserDownloads(fileNamePrefix);\n}\nfunction browserFiles(files) {\n return new BrowserFiles(files);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/progress.js\nfunction monitorPromisesProgress(promises, onProgress, startFraction, endFraction) {\n checkPromises(promises);\n startFraction = startFraction == null ? 0 : startFraction;\n endFraction = endFraction == null ? 1 : endFraction;\n checkFraction(startFraction, endFraction);\n let resolvedPromise = 0;\n const registerMonitor = (promise) => {\n promise.then((value) => {\n const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction);\n onProgress(fraction);\n return value;\n });\n return promise;\n };\n function checkPromises(promises2) {\n assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => \"promises must be a none empty array\");\n }\n function checkFraction(startFraction2, endFraction2) {\n assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`);\n assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`);\n assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`);\n }\n return Promise.all(promises.map(registerMonitor));\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js\nasync function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) {\n if (loadOptions == null) {\n loadOptions = {};\n }\n const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc;\n const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true }));\n const fetchStartFraction = 0;\n const fetchEndFraction = 0.5;\n const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction);\n const bufferPromises = responses.map((response) => response.arrayBuffer());\n const bufferStartFraction = 0.5;\n const bufferEndFraction = 1;\n const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction);\n return buffers;\n}\nasync function loadWeights(manifest, filePathPrefix = \"\", weightNames, requestInit) {\n const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit });\n const loadWeights2 = weightsLoaderFactory(fetchWeights);\n return loadWeights2(manifest, filePathPrefix, weightNames);\n}\nfunction weightsLoaderFactory(fetchWeightsFunction) {\n return async (manifest, filePathPrefix = \"\", weightNames) => {\n const groupIndicesToFetchMap = manifest.map(() => false);\n const groupWeightsToFetch = {};\n const weightsFound = weightNames != null ? weightNames.map(() => false) : [];\n const allManifestWeightNames = [];\n manifest.forEach((manifestGroupConfig, groupIndex) => {\n let groupOffset = 0;\n manifestGroupConfig.weights.forEach((weightsEntry) => {\n const rawDtype = \"quantization\" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype;\n const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape);\n const enqueueWeightsForFetchingFn = () => {\n groupIndicesToFetchMap[groupIndex] = true;\n if (groupWeightsToFetch[groupIndex] == null) {\n groupWeightsToFetch[groupIndex] = [];\n }\n groupWeightsToFetch[groupIndex].push({\n manifestEntry: weightsEntry,\n groupOffset,\n sizeBytes: weightsBytes\n });\n };\n if (weightNames != null) {\n weightNames.forEach((weightName, weightIndex) => {\n if (weightName === weightsEntry.name) {\n enqueueWeightsForFetchingFn();\n weightsFound[weightIndex] = true;\n }\n });\n } else {\n enqueueWeightsForFetchingFn();\n }\n allManifestWeightNames.push(weightsEntry.name);\n groupOffset += weightsBytes;\n });\n });\n if (!weightsFound.every((found) => found)) {\n const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]);\n throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(\", \")}. \nManifest JSON has weights with names: ${allManifestWeightNames.join(\", \")}.`);\n }\n const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => {\n if (shouldFetch) {\n accumulator.push(i);\n }\n return accumulator;\n }, []);\n const fetchUrls = [];\n groupIndicesToFetch.forEach((i) => {\n manifest[i].paths.forEach((filepath) => {\n const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith(\"/\") ? \"/\" : \"\") + filepath;\n fetchUrls.push(fetchUrl);\n });\n });\n const buffers = await fetchWeightsFunction(fetchUrls);\n const weightsTensorMap = {};\n let bufferIndexOffset = 0;\n groupIndicesToFetch.forEach((i) => {\n const numBuffers = manifest[i].paths.length;\n let groupBytes = 0;\n for (let i2 = 0; i2 < numBuffers; i2++) {\n groupBytes += buffers[bufferIndexOffset + i2].byteLength;\n }\n const groupBuffer = new ArrayBuffer(groupBytes);\n const groupByteBuffer = new Uint8Array(groupBuffer);\n let groupBufferOffset = 0;\n for (let i2 = 0; i2 < numBuffers; i2++) {\n const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]);\n groupByteBuffer.set(buffer2, groupBufferOffset);\n groupBufferOffset += buffer2.byteLength;\n }\n const weightsEntries = groupWeightsToFetch[i];\n weightsEntries.forEach((weightsEntry) => {\n const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes);\n const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]);\n for (const name in nameToTensorMap) {\n weightsTensorMap[name] = nameToTensorMap[name];\n }\n });\n bufferIndexOffset += numBuffers;\n });\n return weightsTensorMap;\n };\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/http.js\nvar OCTET_STREAM_MIME_TYPE = \"application/octet-stream\";\nvar JSON_TYPE = \"application/json\";\nvar HTTPRequest = class {\n constructor(path, loadOptions) {\n this.DEFAULT_METHOD = \"POST\";\n if (loadOptions == null) {\n loadOptions = {};\n }\n this.weightPathPrefix = loadOptions.weightPathPrefix;\n this.onProgress = loadOptions.onProgress;\n this.weightUrlConverter = loadOptions.weightUrlConverter;\n if (loadOptions.fetchFunc != null) {\n 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)\");\n this.fetch = loadOptions.fetchFunc;\n } else {\n this.fetch = env().platform.fetch;\n }\n assert(path != null && path.length > 0, () => \"URL path for http must not be null, undefined or empty.\");\n if (Array.isArray(path)) {\n assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`);\n }\n this.path = path;\n if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) {\n throw new Error(\"requestInit is expected to have no pre-existing body, but has one.\");\n }\n this.requestInit = loadOptions.requestInit || {};\n }\n async save(modelArtifacts) {\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error(\"BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.\");\n }\n const init2 = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit);\n init2.body = new FormData();\n const weightsManifest = [{\n paths: [\"./model.weights.bin\"],\n weights: modelArtifacts.weightSpecs\n }];\n const modelTopologyAndWeightManifest = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest);\n init2.body.append(\"model.json\", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), \"model.json\");\n if (modelArtifacts.weightData != null) {\n init2.body.append(\"model.weights.bin\", new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), \"model.weights.bin\");\n }\n const response = await this.fetch(this.path, init2);\n if (response.ok) {\n return {\n modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts),\n responses: [response]\n };\n } else {\n throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`);\n }\n }\n async load() {\n const modelConfigRequest = await this.fetch(this.path, this.requestInit);\n if (!modelConfigRequest.ok) {\n 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.`);\n }\n let modelJSON;\n try {\n modelJSON = await modelConfigRequest.json();\n } catch (e) {\n let message = `Failed to parse model JSON of response from ${this.path}.`;\n if (this.path.endsWith(\".pb\")) {\n 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.\";\n } else {\n message += \" Please make sure the server is serving valid JSON for this request.\";\n }\n throw new Error(message);\n }\n const modelTopology = modelJSON.modelTopology;\n const weightsManifest = modelJSON.weightsManifest;\n if (modelTopology == null && weightsManifest == null) {\n throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);\n }\n return getModelArtifactsForJSON(modelJSON, (weightsManifest2) => this.loadWeights(weightsManifest2));\n }\n async loadWeights(weightsManifest) {\n const weightPath = Array.isArray(this.path) ? this.path[1] : this.path;\n const [prefix, suffix] = parseUrl(weightPath);\n const pathPrefix = this.weightPathPrefix || prefix;\n const weightSpecs = [];\n for (const entry of weightsManifest) {\n weightSpecs.push(...entry.weights);\n }\n const fetchURLs = [];\n const urlPromises = [];\n for (const weightsGroup of weightsManifest) {\n for (const path of weightsGroup.paths) {\n if (this.weightUrlConverter != null) {\n urlPromises.push(this.weightUrlConverter(path));\n } else {\n fetchURLs.push(pathPrefix + path + suffix);\n }\n }\n }\n if (this.weightUrlConverter) {\n fetchURLs.push(...await Promise.all(urlPromises));\n }\n const buffers = await loadWeightsAsArrayBuffer(fetchURLs, {\n requestInit: this.requestInit,\n fetchFunc: this.fetch,\n onProgress: this.onProgress\n });\n return [weightSpecs, concatenateArrayBuffers(buffers)];\n }\n};\nHTTPRequest.URL_SCHEME_REGEX = /^https?:\\/\\//;\nfunction parseUrl(url) {\n const lastSlash = url.lastIndexOf(\"/\");\n const lastSearchParam = url.lastIndexOf(\"?\");\n const prefix = url.substring(0, lastSlash);\n const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : \"\";\n return [prefix + \"/\", suffix];\n}\nfunction isHTTPScheme(url) {\n return url.match(HTTPRequest.URL_SCHEME_REGEX) != null;\n}\nvar httpRouter = (url, loadOptions) => {\n if (typeof fetch === \"undefined\" && (loadOptions == null || loadOptions.fetchFunc == null)) {\n return null;\n } else {\n let isHTTP = true;\n if (Array.isArray(url)) {\n isHTTP = url.every((urlItem) => isHTTPScheme(urlItem));\n } else {\n isHTTP = isHTTPScheme(url);\n }\n if (isHTTP) {\n return http(url, loadOptions);\n }\n }\n return null;\n};\nIORouterRegistry.registerSaveRouter(httpRouter);\nIORouterRegistry.registerLoadRouter(httpRouter);\nfunction http(path, loadOptions) {\n return new HTTPRequest(path, loadOptions);\n}\nfunction browserHTTPRequest(path, loadOptions) {\n return http(path, loadOptions);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js\nvar PassthroughLoader = class {\n constructor(modelArtifacts) {\n this.modelArtifacts = modelArtifacts;\n }\n load() {\n return this.modelArtifacts;\n }\n};\nvar PassthroughSaver = class {\n constructor(saveHandler) {\n this.saveHandler = saveHandler;\n }\n save(modelArtifacts) {\n return this.saveHandler(modelArtifacts);\n }\n};\nvar PassthroughAsync = class {\n constructor(handler) {\n if (handler.load) {\n this.load = () => Promise.resolve(handler.load());\n }\n if (handler.save) {\n this.save = (modelArtifacts) => Promise.resolve(handler.save(modelArtifacts));\n }\n }\n};\nfunction fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) {\n const args = arguments;\n return new PassthroughAsync(fromMemorySync(...args));\n}\nfunction fromMemorySync(modelArtifacts, weightSpecs, weightData, trainingConfig) {\n if (arguments.length === 1) {\n const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null;\n if (isModelArtifacts) {\n return new PassthroughLoader(modelArtifacts);\n } else {\n 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.\");\n return new PassthroughLoader({ modelTopology: modelArtifacts });\n }\n } else {\n 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.\");\n return new PassthroughLoader({\n modelTopology: modelArtifacts,\n weightSpecs,\n weightData,\n trainingConfig\n });\n }\n}\nfunction withSaveHandler(saveHandler) {\n return new PassthroughSaver(saveHandler);\n}\nfunction withSaveHandlerSync(saveHandler) {\n return new PassthroughSaver(saveHandler);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/math.js\nvar math_exports = {};\n__export(math_exports, {\n confusionMatrix: () => confusionMatrix\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js\nfunction matMul_(a, b, transposeA = false, transposeB = false) {\n let $a = convertToTensor(a, \"a\", \"matMul\");\n let $b = convertToTensor(b, \"b\", \"matMul\");\n [$a, $b] = makeTypesMatch($a, $b);\n const inputs = { a: $a, b: $b };\n const attrs = { transposeA, transposeB };\n return ENGINE.runKernel(BatchMatMul, inputs, attrs);\n}\nvar matMul = op({ matMul_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js\nfunction oneHot_(indices, depth, onValue = 1, offValue = 0) {\n if (depth < 2) {\n throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`);\n }\n const $indices = convertToTensor(indices, \"indices\", \"oneHot\", \"int32\");\n const inputs = { indices: $indices };\n const attrs = { depth, onValue, offValue };\n return ENGINE.runKernel(OneHot, inputs, attrs);\n}\nvar oneHot = op({ oneHot_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/globals.js\nfunction enableProdMode() {\n env().set(\"PROD\", true);\n}\nfunction enableDebugMode() {\n env().set(\"DEBUG\", true);\n}\nfunction disableDeprecationWarnings() {\n env().set(\"DEPRECATION_WARNINGS_ENABLED\", false);\n console.warn(`TensorFlow.js deprecation warnings have been disabled.`);\n}\nfunction deprecationWarn(msg) {\n if (env().getBool(\"DEPRECATION_WARNINGS_ENABLED\")) {\n console.warn(msg + \" You can disable deprecation warnings with tf.disableDeprecationWarnings().\");\n }\n}\nsetDeprecationWarningFn(deprecationWarn);\nfunction disposeVariables() {\n ENGINE.disposeVariables();\n}\nfunction engine() {\n return ENGINE;\n}\nfunction memory() {\n return ENGINE.memory();\n}\nfunction profile(f) {\n return ENGINE.profile(f);\n}\nfunction tidy(nameOrFn, fn) {\n return ENGINE.tidy(nameOrFn, fn);\n}\nfunction dispose(container) {\n const tensors = getTensorsInContainer(container);\n tensors.forEach((tensor2) => tensor2.dispose());\n}\nfunction keep(result) {\n return ENGINE.keep(result);\n}\nfunction time(f) {\n return ENGINE.time(f);\n}\nfunction setBackend(backendName) {\n return ENGINE.setBackend(backendName);\n}\nfunction ready() {\n return ENGINE.ready();\n}\nfunction getBackend() {\n return ENGINE.backendName;\n}\nfunction removeBackend(name) {\n ENGINE.removeBackend(name);\n}\nfunction findBackend(name) {\n return ENGINE.findBackend(name);\n}\nfunction findBackendFactory(name) {\n return ENGINE.findBackendFactory(name);\n}\nfunction registerBackend(name, factory, priority = 1) {\n return ENGINE.registerBackend(name, factory, priority);\n}\nfunction backend() {\n return ENGINE.backend;\n}\nfunction setPlatform(platformName, platform) {\n env().setPlatform(platformName, platform);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/imag.js\nfunction imag_(input2) {\n const $input = convertToTensor(input2, \"input\", \"imag\");\n const inputs = { input: $input };\n return ENGINE.runKernel(Imag, inputs);\n}\nvar imag = op({ imag_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/neg.js\nfunction neg_(x) {\n const $x = convertToTensor(x, \"x\", \"neg\");\n const inputs = { x: $x };\n return ENGINE.runKernel(Neg, inputs);\n}\nvar neg = op({ neg_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/real.js\nfunction real_(input2) {\n const $input = convertToTensor(input2, \"input\", \"real\");\n const inputs = { input: $input };\n return ENGINE.runKernel(Real, inputs);\n}\nvar real = op({ real_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js\nfunction transpose_(x, perm, conjugate) {\n const $x = convertToTensor(x, \"x\", \"transpose\");\n if (perm == null) {\n perm = $x.shape.map((s, i) => i).reverse();\n }\n assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`);\n perm.forEach((axis) => {\n assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`);\n });\n if ($x.rank <= 1) {\n return $x.clone();\n }\n const inputs = { x: $x };\n const attrs = { perm };\n if ($x.dtype === \"complex64\") {\n return tidy(() => {\n let $real = real($x);\n let $imag = imag($x);\n $real = ENGINE.runKernel(Transpose, { x: $real }, attrs);\n $imag = ENGINE.runKernel(Transpose, { x: $imag }, attrs);\n if (conjugate) {\n $imag = neg($imag);\n }\n return complex($real, $imag);\n });\n }\n return ENGINE.runKernel(Transpose, inputs, attrs);\n}\nvar transpose = op({ transpose_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/confusion_matrix.js\nfunction confusionMatrix_(labels, predictions, numClasses) {\n const $labels = convertToTensor(labels, \"labels\", \"confusionMatrix\");\n const $predictions = convertToTensor(predictions, \"predictions\", \"confusionMatrix\");\n assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`);\n assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`);\n assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`);\n 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.`);\n assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`);\n const oneHotLabels = oneHot(cast($labels, \"int32\"), numClasses);\n const oneHotPredictions = oneHot(cast($predictions, \"int32\"), numClasses);\n const oneHotLabelsT = transpose(oneHotLabels);\n const product = matMul(oneHotLabelsT, oneHotPredictions);\n return cast(product, \"int32\");\n}\nvar confusionMatrix = op({ confusionMatrix_ });\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js\nvar broadcast_util_exports = {};\n__export(broadcast_util_exports, {\n assertAndGetBroadcastShape: () => assertAndGetBroadcastShape,\n getBroadcastDims: () => getBroadcastDims,\n getReductionAxes: () => getReductionAxes\n});\nfunction getBroadcastDims(inShape, outShape) {\n const inRank = inShape.length;\n const dims = [];\n for (let i = 0; i < inRank; i++) {\n const dim = inRank - 1 - i;\n const a = inShape[dim] || 1;\n const b = outShape[outShape.length - 1 - i] || 1;\n if (b > 1 && a === 1) {\n dims.unshift(dim);\n }\n }\n return dims;\n}\nfunction getReductionAxes(inShape, outShape) {\n const result = [];\n for (let i = 0; i < outShape.length; i++) {\n const inDim = inShape[inShape.length - i - 1];\n const outAxis = outShape.length - i - 1;\n const outDim = outShape[outAxis];\n if (inDim == null || inDim === 1 && outDim > 1) {\n result.unshift(outAxis);\n }\n }\n return result;\n}\nfunction assertAndGetBroadcastShape(shapeA, shapeB) {\n const result = [];\n const l = Math.max(shapeA.length, shapeB.length);\n for (let i = 0; i < l; i++) {\n let a = shapeA[shapeA.length - i - 1];\n if (a == null) {\n a = 1;\n }\n let b = shapeB[shapeB.length - i - 1];\n if (b == null) {\n b = 1;\n }\n if (a === 1) {\n result.unshift(b);\n } else if (b === 1) {\n result.unshift(a);\n } else if (a !== b) {\n const errMsg = `Operands could not be broadcast together with shapes ${shapeA} and ${shapeB}.`;\n throw Error(errMsg);\n } else {\n result.unshift(a);\n }\n }\n return result;\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/browser.js\nvar browser_exports = {};\n__export(browser_exports, {\n fromPixels: () => fromPixels,\n fromPixelsAsync: () => fromPixelsAsync,\n toPixels: () => toPixels\n});\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js\nfunction tensor3d(values, shape, dtype) {\n assertNonNull(values);\n if (shape != null && shape.length !== 3) {\n throw new Error(\"tensor3d() requires shape to have three numbers\");\n }\n const inferredShape = inferShape(values, dtype);\n if (inferredShape.length !== 3 && inferredShape.length !== 1) {\n throw new Error(\"tensor3d() requires values to be number[][][] or flat/TypedArray\");\n }\n if (inferredShape.length === 1 && shape == null) {\n throw new Error(\"tensor3d() requires shape to be provided when `values` are a flat array\");\n }\n return makeTensor(values, shape, inferredShape, dtype);\n}\n\n// node_modules/.pnpm/@tensorflow+tfjs-core@3.19.0/node_modules/@tensorflow/tfjs-core/dist/ops/browser.js\nvar fromPixels2DContext;\nfunction fromPixels_(pixels, numChannels = 3) {\n if (numChannels > 4) {\n throw new Error(\"Cannot construct Tensor with more than 4 channels from pixels.\");\n }\n if (pixels == null) {\n throw new Error(\"pixels passed to tf.browser.fromPixels() can not be null\");\n }\n let isPixelData2 = false;\n let isImageData = false;\n let isVideo = false;\n let isImage = false;\n let isCanvasLike = false;\n let isImageBitmap = false;\n if (pixels.data instanceof Uint8Array) {\n isPixelData2 = true;\n } else if (typeof ImageData !== \"undefined\" && pixels instanceof ImageData) {\n isImageData = true;\n } else if (typeof HTMLVideoElement !== \"undefined\" && pixels instanceof HTMLVideoElement) {\n isVideo = true;\n } else if (typeof HTMLImageElement !== \"undefined\" && pixels instanceof HTMLImageElement) {\n isImage = true;\n } else if (pixels.getContext != null) {\n isCanvasLike = true;\n } else if (typeof ImageBitmap !== \"undefined\" && pixels instanceof ImageBitmap) {\n isImageBitmap = true;\n } else {\n 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}`);\n }\n if (isVideo) {\n const HAVE_CURRENT_DATA_READY_STATE = 2;\n if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) {\n throw new Error(\"The video element has not loaded data yet. Please wait for `loadeddata` event on the