From 84f8b2702ea1487fdb8bba12cf7c2d875bd5cce0 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 8 Dec 2020 08:33:00 -0500 Subject: [PATCH] updated demos --- README.md | 106 +++++++++++++++++++++------- dist/face-api.esm-nobundle.js | 2 +- dist/face-api.esm-nobundle.json | 2 +- dist/face-api.esm.js | 2 +- dist/face-api.esm.json | 2 +- dist/face-api.js | 2 +- dist/face-api.json | 2 +- dist/face-api.node-gpu.js | 2 +- dist/face-api.node-gpu.json | 2 +- dist/face-api.node.js | 2 +- dist/face-api.node.json | 2 +- example/node-multiprocess-worker.js | 67 ++++++++++++++++++ example/node-multiprocess.js | 79 +++++++++++++++++++++ example/node-singleprocess.js | 60 ++++++++++++++++ example/node.js | 84 ---------------------- package-lock.json | 3 +- package.json | 10 +-- 17 files changed, 302 insertions(+), 127 deletions(-) create mode 100644 example/node-multiprocess-worker.js create mode 100644 example/node-multiprocess.js create mode 100644 example/node-singleprocess.js delete mode 100644 example/node.js diff --git a/README.md b/README.md index 4f8eafa..5c3cb89 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,7 @@ This is updated **face-api.js** with latest available TensorFlow/JS as the original face-api.js is not compatible with **tfjs 2.0+**. -Forked from **face-api.js** version **0.22.2** released on March 22nd, 2020 - -- -- +Forked from [face-api.js](https://github.com/justadudewhohacks/face-api.js) version **0.22.2** released on March 22nd, 2020 Currently based on **`TensorFlow/JS` 2.7.0** @@ -18,6 +15,8 @@ And since original Face-API was open-source, I've released this version as well Unfortunately, changes ended up being too large for a simple pull request on original Face-API and it ended up being a full-fledged version on its own +
+ ### Differences - Compatible with `TensorFlow/JS 2.0+` @@ -41,6 +40,73 @@ Unfortunately, changes ended up being too large for a simple pull request on ori Which means valid models are **tinyFaceDetector** and **mobileNetv1** +
+
+
+ +## Examples + +
+ +### Browser + +Browser example that uses both models as well as all of the extensions is included in `/example/index.html` +Example can be accessed directly using Git pages using URL: + +
+ +*Note: Photos shown below are taken by me* + +![alt text](example/screenshot.png) + +
+ +### NodeJS + +Two NodeJS examples are: + +- `/example/node-singleprocess.js`: Regular usage of `FaceAPI` from `NodeJS` +- `/example/node-multiprocess.js`: Multiprocessing showcase that uses pool of worker processes (`node-multiprocess-worker.js` + Main starts fixed pool of worker processes with each worker having it's instance of `FaceAPI` + Workers communicate with main when they are ready and main dispaches job to each ready worker until job queue is empty + +```json +2020-12-08 08:30:01 INFO: @vladmandic/face-api version 0.9.1 +2020-12-08 08:30:01 INFO: User: vlado Platform: linux Arch: x64 Node: v15.0.1 +2020-12-08 08:30:01 INFO: FaceAPI multi-process test +2020-12-08 08:30:01 STATE: Main: started worker: 265238 +2020-12-08 08:30:01 STATE: Main: started worker: 265244 +2020-12-08 08:30:02 STATE: Worker: PID: 265238 TensorFlow/JS 2.7.0 FaceAPI 0.9.1 Backend: tensorflow +2020-12-08 08:30:02 STATE: Worker: PID: 265244 TensorFlow/JS 2.7.0 FaceAPI 0.9.1 Backend: tensorflow +2020-12-08 08:30:02 STATE: Main: dispatching to worker: 265238 +2020-12-08 08:30:02 STATE: Main: dispatching to worker: 265244 +2020-12-08 08:30:02 DATA: Worker received message: 265238 { image: 'example/sample (1).jpg' } +2020-12-08 08:30:02 DATA: Worker received message: 265244 { image: 'example/sample (2).jpg' } +2020-12-08 08:30:04 DATA: Main: worker finished: 265238 detected faces: 3 +2020-12-08 08:30:04 STATE: Main: dispatching to worker: 265238 +2020-12-08 08:30:04 DATA: Main: worker finished: 265244 detected faces: 3 +2020-12-08 08:30:04 STATE: Main: dispatching to worker: 265244 +2020-12-08 08:30:04 DATA: Worker received message: 265238 { image: 'example/sample (3).jpg' } +2020-12-08 08:30:04 DATA: Worker received message: 265244 { image: 'example/sample (4).jpg' } +2020-12-08 08:30:06 DATA: Main: worker finished: 265238 detected faces: 3 +2020-12-08 08:30:06 STATE: Main: dispatching to worker: 265238 +2020-12-08 08:30:06 DATA: Worker received message: 265238 { image: 'example/sample (5).jpg' } +2020-12-08 08:30:06 DATA: Main: worker finished: 265244 detected faces: 4 +2020-12-08 08:30:06 STATE: Main: dispatching to worker: 265244 +2020-12-08 08:30:06 DATA: Worker received message: 265244 { image: 'example/sample (6).jpg' } +2020-12-08 08:30:07 DATA: Main: worker finished: 265238 detected faces: 5 +2020-12-08 08:30:07 STATE: Main: worker exit: 265238 0 +2020-12-08 08:30:08 DATA: Main: worker finished: 265244 detected faces: 4 +2020-12-08 08:30:08 INFO: Processed 12 images in 6826 ms +2020-12-08 08:30:08 STATE: Main: worker exit: 265244 0 +``` + +Note that `@tensorflow/tfjs-node` or `@tensorflow/tfjs-node-gpu` must be installed before using NodeJS example + +
+
+
+ ## Installation Face-API ships with several pre-build versions of the library: @@ -68,6 +134,8 @@ Reason for additional `nobundle` version is if you want to include a specific ve All versions include `sourcemap` and `asset manifest` +
+

There are several ways to use Face-API: @@ -171,10 +239,16 @@ And then use with: const faceapi = require('@vladmandic/face-api/dist/face-api.node-gpu.js'); // this loads face-api version with correct bindings for tfjs-node-gpu ``` +
+
+
+ ## Weights Pretrained models and their weights are includes in `./model`. +
+ ## Build If you want to do a full rebuild, either download npm module @@ -218,6 +292,8 @@ npm run build 2020-12-02 16:31:25 STATE: Build for: browserBundle type: esm: { imports: 162, importBytes: 1728673, modules: 576, moduleBytes: 1359851, outputBytes: 1900836, outputFiles: 'dist/face-api.esm.js' } ``` +
+

## Credits & Documentation @@ -225,25 +301,3 @@ npm run build - Original project and usage documentation: [Face-API](https://github.com/justadudewhohacks/face-api.js) - Original model weighs: [Face-API](https://github.com/justadudewhohacks/face-api.js-models) - ML API Documentation: [Tensorflow/JS](https://js.tensorflow.org/api/latest/) - -
- -## Example - -
- -### Browser - -Example that uses both models as well as all of the extensions is included in `/example/index.html` -Example can be accessed directly using Git pages using URL: - -
- -### NodeJS - -Example is included in `/example/node.js` -Note that it does not require any other other 3rd party libraries - -*Note: Photos shown below are taken by me* - -![alt text](example/screenshot.png) diff --git a/dist/face-api.esm-nobundle.js b/dist/face-api.esm-nobundle.js index 2ab39e5..ed1eeed 100644 --- a/dist/face-api.esm-nobundle.js +++ b/dist/face-api.esm-nobundle.js @@ -5,5 +5,5 @@ author: ' */ -var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__markAsModule=target=>__defProp(target,"__esModule",{value:!0}),__commonJS=(callback,module)=>()=>(module||(module={exports:{}},callback(module.exports,module)),module.exports),__export=(target,all)=>{__markAsModule(target);for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__exportStar=(target,module,desc)=>{if(__markAsModule(target),module&&typeof module=="object"||typeof module=="function")for(let key of __getOwnPropNames(module))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module[key],enumerable:!(desc=__getOwnPropDesc(module,key))||desc.enumerable});return target},__toModule=module=>module&&module.__esModule?module:__exportStar(__defProp(module!=null?__create(__getProtoOf(module)):{},"default",{value:module,enumerable:!0}),module);import*as dist_star from"@tensorflow/tfjs/dist/index.js";import*as tfjs_backend_wasm_star from"@tensorflow/tfjs-backend-wasm";var require_tfjs_esm=__commonJS(exports=>{__exportStar(exports,dist_star);__exportStar(exports,tfjs_backend_wasm_star)}),require_isNodejs=__commonJS((exports,module)=>{__export(exports,{isNodejs:()=>isNodejs3});function isNodejs3(){return typeof global=="object"&&!0&&typeof module!="undefined"&&typeof process!="undefined"&&!!process.version}}),tf42=__toModule(require_tfjs_esm()),draw_exports={};__export(draw_exports,{AnchorPosition:()=>AnchorPosition,DrawBox:()=>DrawBox,DrawBoxOptions:()=>DrawBoxOptions,DrawFaceLandmarks:()=>DrawFaceLandmarks,DrawFaceLandmarksOptions:()=>DrawFaceLandmarksOptions,DrawTextField:()=>DrawTextField,DrawTextFieldOptions:()=>DrawTextFieldOptions,drawContour:()=>drawContour,drawDetections:()=>drawDetections,drawFaceExpressions:()=>drawFaceExpressions,drawFaceLandmarks:()=>drawFaceLandmarks});function drawContour(ctx,points,isClosed=!1){if(ctx.beginPath(),points.slice(1).forEach(({x,y},prevIdx)=>{let from=points[prevIdx];ctx.moveTo(from.x,from.y),ctx.lineTo(x,y)}),isClosed){let from=points[points.length-1],to=points[0];if(!from||!to)return;ctx.moveTo(from.x,from.y),ctx.lineTo(to.x,to.y)}ctx.stroke()}var utils_exports={};__export(utils_exports,{computeReshapedDimensions:()=>computeReshapedDimensions,getCenterPoint:()=>getCenterPoint,isDimensions:()=>isDimensions,isEven:()=>isEven,isFloat:()=>isFloat,isTensor:()=>isTensor,isTensor1D:()=>isTensor1D,isTensor2D:()=>isTensor2D,isTensor3D:()=>isTensor3D,isTensor4D:()=>isTensor4D,isValidNumber:()=>isValidNumber,isValidProbablitiy:()=>isValidProbablitiy,range:()=>range,round:()=>round});var tf=__toModule(require_tfjs_esm()),Dimensions=class{constructor(width,height){if(!isValidNumber(width)||!isValidNumber(height))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width,height})}`);this._width=width,this._height=height}get width(){return this._width}get height(){return this._height}reverse(){return new Dimensions(1/this.width,1/this.height)}};function isTensor(tensor2,dim){return tensor2 instanceof tf.Tensor&&tensor2.shape.length===dim}function isTensor1D(tensor2){return isTensor(tensor2,1)}function isTensor2D(tensor2){return isTensor(tensor2,2)}function isTensor3D(tensor2){return isTensor(tensor2,3)}function isTensor4D(tensor2){return isTensor(tensor2,4)}function isFloat(num){return num%1!==0}function isEven(num){return num%2===0}function round(num,prec=2){let f=Math.pow(10,prec);return Math.floor(num*f)/f}function isDimensions(obj){return obj&&obj.width&&obj.height}function computeReshapedDimensions({width,height},inputSize){let scale2=inputSize/Math.max(height,width);return new Dimensions(Math.round(width*scale2),Math.round(height*scale2))}function getCenterPoint(pts){return pts.reduce((sum,pt)=>sum.add(pt),new Point(0,0)).div(new Point(pts.length,pts.length))}function range(num,start,step){return Array(num).fill(0).map((_,i)=>start+i*step)}function isValidNumber(num){return!!num&&num!==Infinity&&num!==-Infinity&&!isNaN(num)||num===0}function isValidProbablitiy(num){return isValidNumber(num)&&0<=num&&num<=1}var Point=class{constructor(x,y){this._x=x,this._y=y}get x(){return this._x}get y(){return this._y}add(pt){return new Point(this.x+pt.x,this.y+pt.y)}sub(pt){return new Point(this.x-pt.x,this.y-pt.y)}mul(pt){return new Point(this.x*pt.x,this.y*pt.y)}div(pt){return new Point(this.x/pt.x,this.y/pt.y)}abs(){return new Point(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))}floor(){return new Point(Math.floor(this.x),Math.floor(this.y))}},Box=class{static isRect(rect){return!!rect&&[rect.x,rect.y,rect.width,rect.height].every(isValidNumber)}static assertIsValidBox(box,callee,allowNegativeDimensions=!1){if(!Box.isRect(box))throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);if(!allowNegativeDimensions&&(box.width<0||box.height<0))throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`)}constructor(_box,allowNegativeDimensions=!0){let box=_box||{},isBbox=[box.left,box.top,box.right,box.bottom].every(isValidNumber),isRect=[box.x,box.y,box.width,box.height].every(isValidNumber);if(!isRect&&!isBbox)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);let[x,y,width,height]=isRect?[box.x,box.y,box.width,box.height]:[box.left,box.top,box.right-box.left,box.bottom-box.top];Box.assertIsValidBox({x,y,width,height},"Box.constructor",allowNegativeDimensions),this._x=x,this._y=y,this._width=width,this._height=height}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Point(this.left,this.top)}get topRight(){return new Point(this.right,this.top)}get bottomLeft(){return new Point(this.left,this.bottom)}get bottomRight(){return new Point(this.right,this.bottom)}round(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.round(val));return new Box({x,y,width,height})}floor(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.floor(val));return new Box({x,y,width,height})}toSquare(){let{x,y,width,height}=this,diff=Math.abs(width-height);return widthimageWidth&&(edx=-ex+imageWidth+w,ex=imageWidth),ey>imageHeight&&(edy=-ey+imageHeight+h,ey=imageHeight),x<1&&(edy=2-x,x=1),y<1&&(edy=2-y,y=1),{dy,edy,dx,edx,y,ey,x,ex,w,h}}calibrate(region){return new Box({left:this.left+region.left*this.width,top:this.top+region.top*this.height,right:this.right+region.right*this.width,bottom:this.bottom+region.bottom*this.height}).toSquare().round()}},BoundingBox=class extends Box{constructor(left,top,right,bottom,allowNegativeDimensions=!1){super({left,top,right,bottom},allowNegativeDimensions)}};var ObjectDetection=class{constructor(score,classScore,className,relativeBox,imageDims){this._imageDims=new Dimensions(imageDims.width,imageDims.height),this._score=score,this._classScore=classScore,this._className=className,this._box=new Box(relativeBox).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new Box(this._box).rescale(this.imageDims.reverse())}forSize(width,height){return new ObjectDetection(this.score,this.classScore,this.className,this.relativeBox,{width,height})}},FaceDetection=class extends ObjectDetection{constructor(score,relativeBox,imageDims){super(score,score,"",relativeBox,imageDims)}forSize(width,height){let{score,relativeBox,imageDims}=super.forSize(width,height);return new FaceDetection(score,relativeBox,imageDims)}};function iou(box1,box2,isIOU=!0){let width=Math.max(0,Math.min(box1.right,box2.right)-Math.max(box1.left,box2.left)),height=Math.max(0,Math.min(box1.bottom,box2.bottom)-Math.max(box1.top,box2.top)),interSection=width*height;return isIOU?interSection/(box1.area+box2.area-interSection):interSection/Math.min(box1.area,box2.area)}function minBbox(pts){let xs=pts.map(pt=>pt.x),ys=pts.map(pt=>pt.y),minX=xs.reduce((min,x)=>xymaxmax({score,boxIndex})).sort((c1,c2)=>c1.score-c2.score).map(c=>c.boxIndex),pick=[];for(;indicesSortedByScore.length>0;){let curr=indicesSortedByScore.pop();pick.push(curr);let indices=indicesSortedByScore,outputs=[];for(let i=0;ioutputs[j]<=iouThreshold)}return pick}var tf2=__toModule(require_tfjs_esm());function normalize(x,meanRgb){return tf2.tidy(()=>{let[r,g,b]=meanRgb,avg_r=tf2.fill([...x.shape.slice(0,3),1],r,"float32"),avg_g=tf2.fill([...x.shape.slice(0,3),1],g,"float32"),avg_b=tf2.fill([...x.shape.slice(0,3),1],b,"float32"),avg_rgb=tf2.concat([avg_r,avg_g,avg_b],3);return tf2.sub(x,avg_rgb)})}var tf3=__toModule(require_tfjs_esm());function padToSquare(imgTensor,isCenterImage=!1){return tf3.tidy(()=>{let[height,width]=imgTensor.shape.slice(1);if(height===width)return imgTensor;let dimDiff=Math.abs(height-width),paddingAmount=Math.round(dimDiff*(isCenterImage?.5:1)),paddingAxis=height>width?2:1,createPaddingTensor=paddingAmount2=>{let paddingTensorShape=imgTensor.shape.slice();return paddingTensorShape[paddingAxis]=paddingAmount2,tf3.fill(paddingTensorShape,0,"float32")},paddingTensorAppend=createPaddingTensor(paddingAmount),remainingPaddingAmount=dimDiff-paddingTensorAppend.shape[paddingAxis],paddingTensorPrepend=isCenterImage&&remainingPaddingAmount?createPaddingTensor(remainingPaddingAmount):null,tensorsToStack=[paddingTensorPrepend,imgTensor,paddingTensorAppend].filter(t=>!!t).map(t=>tf3.cast(t,"float32"));return tf3.concat(tensorsToStack,paddingAxis)})}function shuffleArray(inputArray){let array=inputArray.slice();for(let i=array.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1)),x=array[i];array[i]=array[j],array[j]=x}return array}function sigmoid(x){return 1/(1+Math.exp(-x))}function inverseSigmoid(x){return Math.log(x/(1-x))}var Rect=class extends Box{constructor(x,y,width,height,allowNegativeDimensions=!1){super({x,y,width,height},allowNegativeDimensions)}},relX=.5,relY=.43,relScale=.45,FaceLandmarks=class{constructor(relativeFaceLandmarkPositions,imgDims,shift=new Point(0,0)){let{width,height}=imgDims;this._imgDims=new Dimensions(width,height),this._shift=shift,this._positions=relativeFaceLandmarkPositions.map(pt=>pt.mul(new Point(width,height)).add(shift))}get shift(){return new Point(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(pt=>pt.sub(this._shift).div(new Point(this.imageWidth,this.imageHeight)))}forSize(width,height){return new this.constructor(this.relativePositions,{width,height})}shiftBy(x,y){return new this.constructor(this.relativePositions,this._imgDims,new Point(x,y))}shiftByPoint(pt){return this.shiftBy(pt.x,pt.y)}align(detection,options={}){if(detection){let box=detection instanceof FaceDetection?detection.box.floor():new Box(detection);return this.shiftBy(box.x,box.y).align(null,options)}let{useDlibAlignment,minBoxPadding}=Object.assign({},{useDlibAlignment:!1,minBoxPadding:.2},options);return useDlibAlignment?this.alignDlib():this.alignMinBbox(minBoxPadding)}alignDlib(){let centers=this.getRefPointsForAlignment(),[leftEyeCenter,rightEyeCenter,mouthCenter]=centers,distToMouth=pt=>mouthCenter.sub(pt).magnitude(),eyeToMouthDist=(distToMouth(leftEyeCenter)+distToMouth(rightEyeCenter))/2,size=Math.floor(eyeToMouthDist/relScale),refPoint=getCenterPoint(centers),x=Math.floor(Math.max(0,refPoint.x-relX*size)),y=Math.floor(Math.max(0,refPoint.y-relY*size));return new Rect(x,y,Math.min(size,this.imageWidth+x),Math.min(size,this.imageHeight+y))}alignMinBbox(padding){let box=minBbox(this.positions);return box.pad(box.width*padding,box.height*padding)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var FaceLandmarks5=class extends FaceLandmarks{getRefPointsForAlignment(){let pts=this.positions;return[pts[0],pts[1],getCenterPoint([pts[3],pts[4]])]}};var FaceLandmarks68=class extends FaceLandmarks{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(getCenterPoint)}};var FaceMatch=class{constructor(label,distance){this._label=label,this._distance=distance}get label(){return this._label}get distance(){return this._distance}toString(withDistance=!0){return`${this.label}${withDistance?` (${round(this.distance)})`:""}`}};var LabeledBox=class extends Box{static assertIsValidLabeledBox(box,callee){if(Box.assertIsValidBox(box,callee),!isValidNumber(box.label))throw new Error(`${callee} - expected property label (${box.label}) to be a number`)}constructor(box,label){super(box);this._label=label}get label(){return this._label}};var LabeledFaceDescriptors=class{constructor(label,descriptors){if(!(typeof label=="string"))throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(descriptors)||descriptors.some(desc=>!(desc instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=label,this._descriptors=descriptors}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(d=>Array.from(d))}}static fromJSON(json){let descriptors=json.descriptors.map(d=>new Float32Array(d));return new LabeledFaceDescriptors(json.label,descriptors)}};var PredictedBox=class extends LabeledBox{static assertIsValidPredictedBox(box,callee){if(LabeledBox.assertIsValidLabeledBox(box,callee),!isValidProbablitiy(box.score)||!isValidProbablitiy(box.classScore))throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`)}constructor(box,label,score,classScore){super(box,label);this._score=score,this._classScore=classScore}get score(){return this._score}get classScore(){return this._classScore}};function isWithFaceDetection(obj){return obj.detection instanceof FaceDetection}function extendWithFaceDetection(sourceObj,detection){let extension={detection};return Object.assign({},sourceObj,extension)}function createBrowserEnv(){let fetch=window.fetch||function(){throw new Error("fetch - missing fetch implementation for browser environment")},readFile=function(){throw new Error("readFile - filesystem not available for browser environment")};return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch,readFile}}function createFileSystem(fs){let requireFsError="";if(!fs)try{fs=require("fs")}catch(err){requireFsError=err.toString()}let readFile=fs?function(filePath){return new Promise((res,rej)=>{fs.readFile(filePath,function(err,buffer){return err?rej(err):res(buffer)})})}:function(){throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)};return{readFile}}function createNodejsEnv(){let Canvas=global.Canvas||global.HTMLCanvasElement,Image=global.Image||global.HTMLImageElement,createCanvasElement=function(){if(Canvas)return new Canvas;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},createImageElement=function(){if(Image)return new Image;throw new Error("createImageElement - missing Image implementation for nodejs environment")},fetch=global.fetch||function(){throw new Error("fetch - missing fetch implementation for nodejs environment")},fileSystem=createFileSystem();return{Canvas:Canvas||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:Image||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement,createImageElement,fetch,...fileSystem}}function isBrowser(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var isNodejs=__toModule(require_isNodejs()),environment;function getEnv(){if(!environment)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return environment}function setEnv(env16){environment=env16}function initialize(){if(isBrowser())return setEnv(createBrowserEnv());if(isNodejs.isNodejs())return setEnv(createNodejsEnv())}function monkeyPatch(env16){if(environment||initialize(),!environment)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas=environment.Canvas,Image=environment.Image}=env16;environment.Canvas=Canvas,environment.Image=Image,environment.createCanvasElement=env16.createCanvasElement||(()=>new Canvas),environment.createImageElement=env16.createImageElement||(()=>new Image),environment.ImageData=env16.ImageData||environment.ImageData,environment.Video=env16.Video||environment.Video,environment.fetch=env16.fetch||environment.fetch,environment.readFile=env16.readFile||environment.readFile}var env={getEnv,setEnv,initialize,createBrowserEnv,createFileSystem,createNodejsEnv,monkeyPatch,isBrowser,isNodejs:isNodejs.isNodejs};initialize();function resolveInput(arg){return!env.isNodejs()&&typeof arg=="string"?document.getElementById(arg):arg}function getContext2dOrThrow(canvasArg){let{Canvas,CanvasRenderingContext2D:CanvasRenderingContext2D2}=env.getEnv();if(canvasArg instanceof CanvasRenderingContext2D2)return canvasArg;let canvas=resolveInput(canvasArg);if(!(canvas instanceof Canvas))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let ctx=canvas.getContext("2d");if(!ctx)throw new Error("resolveContext2d - canvas 2d context is null");return ctx}var AnchorPosition;(function(AnchorPosition2){AnchorPosition2.TOP_LEFT="TOP_LEFT",AnchorPosition2.TOP_RIGHT="TOP_RIGHT",AnchorPosition2.BOTTOM_LEFT="BOTTOM_LEFT",AnchorPosition2.BOTTOM_RIGHT="BOTTOM_RIGHT"})(AnchorPosition||(AnchorPosition={}));var DrawTextFieldOptions=class{constructor(options={}){let{anchorPosition,backgroundColor,fontColor,fontSize,fontStyle,padding}=options;this.anchorPosition=anchorPosition||AnchorPosition.TOP_LEFT,this.backgroundColor=backgroundColor||"rgba(0, 0, 0, 0.5)",this.fontColor=fontColor||"rgba(255, 255, 255, 1)",this.fontSize=fontSize||14,this.fontStyle=fontStyle||"Georgia",this.padding=padding||4}},DrawTextField=class{constructor(text,anchor,options={}){this.text=typeof text=="string"?[text]:text instanceof DrawTextField?text.text:text,this.anchor=anchor,this.options=new DrawTextFieldOptions(options)}measureWidth(ctx){let{padding}=this.options;return this.text.map(l=>ctx.measureText(l).width).reduce((w0,w1)=>w0{let x=padding+upperLeft.x,y=padding+upperLeft.y+(i+1)*fontSize;ctx.fillText(textLine,x,y)})}},DrawBoxOptions=class{constructor(options={}){let{boxColor,lineWidth,label,drawLabelOptions}=options;this.boxColor=boxColor||"rgba(0, 0, 255, 1)",this.lineWidth=lineWidth||2,this.label=label;let defaultDrawLabelOptions={anchorPosition:AnchorPosition.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new DrawTextFieldOptions(Object.assign({},defaultDrawLabelOptions,drawLabelOptions))}},DrawBox=class{constructor(box,options={}){this.box=new Box(box),this.options=new DrawBoxOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{boxColor,lineWidth}=this.options,{x,y,width,height}=this.box;ctx.strokeStyle=boxColor,ctx.lineWidth=lineWidth,ctx.strokeRect(x,y,width,height);let{label}=this.options;label&&new DrawTextField([label],{x:x-lineWidth/2,y},this.options.drawLabelOptions).draw(canvasArg)}};function drawDetections(canvasArg,detections){let detectionsArray=Array.isArray(detections)?detections:[detections];detectionsArray.forEach(det=>{let score=det instanceof FaceDetection?det.score:isWithFaceDetection(det)?det.detection.score:void 0,box=det instanceof FaceDetection?det.box:isWithFaceDetection(det)?det.detection.box:new Box(det),label=score?`${round(score)}`:void 0;new DrawBox(box,{label}).draw(canvasArg)})}var tf18=__toModule(require_tfjs_esm());function isMediaLoaded(media){let{Image,Video}=env.getEnv();return media instanceof Image&&media.complete||media instanceof Video&&media.readyState>=3}function awaitMediaLoaded(media){return new Promise((resolve,reject)=>{if(media instanceof env.getEnv().Canvas||isMediaLoaded(media))return resolve(null);function onLoad(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),resolve(e)}function onError(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),reject(e)}media.addEventListener("load",onLoad),media.addEventListener("error",onError)})}function bufferToImage(buf){return new Promise((resolve,reject)=>{if(!(buf instanceof Blob))return reject("bufferToImage - expected buf to be of type: Blob");let reader=new FileReader;reader.onload=()=>{if(typeof reader.result!="string")return reject("bufferToImage - expected reader.result to be a string, in onload");let img=env.getEnv().createImageElement();img.onload=()=>resolve(img),img.onerror=reject,img.src=reader.result},reader.onerror=reject,reader.readAsDataURL(buf)})}function getMediaDimensions(input){let{Image,Video}=env.getEnv();return input instanceof Image?new Dimensions(input.naturalWidth,input.naturalHeight):input instanceof Video?new Dimensions(input.videoWidth,input.videoHeight):new Dimensions(input.width,input.height)}function createCanvas({width,height}){let{createCanvasElement}=env.getEnv(),canvas=createCanvasElement();return canvas.width=width,canvas.height=height,canvas}function createCanvasFromMedia(media,dims){let{ImageData:ImageData2}=env.getEnv();if(!(media instanceof ImageData2)&&!isMediaLoaded(media))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width,height}=dims||getMediaDimensions(media),canvas=createCanvas({width,height});return media instanceof ImageData2?getContext2dOrThrow(canvas).putImageData(media,0,0):getContext2dOrThrow(canvas).drawImage(media,0,0,width,height),canvas}var tf4=__toModule(require_tfjs_esm());async function imageTensorToCanvas(imgTensor,canvas){let targetCanvas=canvas||env.getEnv().createCanvasElement(),[height,width,numChannels]=imgTensor.shape.slice(isTensor4D(imgTensor)?1:0),imgTensor3D=tf4.tidy(()=>imgTensor.as3D(height,width,numChannels).toInt());return await tf4.browser.toPixels(imgTensor3D,targetCanvas),imgTensor3D.dispose(),targetCanvas}function isMediaElement(input){let{Image,Canvas,Video}=env.getEnv();return input instanceof Image||input instanceof Canvas||input instanceof Video}import{Tensor as Tensor2,browser as browser2,cast as cast2,image,stack,tidy as tidy4}from"@tensorflow/tfjs-core";function imageToSquare(input,inputSize,centerImage=!1){let{Image,Canvas}=env.getEnv();if(!(input instanceof Image||input instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input),scale2=inputSize/Math.max(dims.height,dims.width),width=scale2*dims.width,height=scale2*dims.height,targetCanvas=createCanvas({width:inputSize,height:inputSize}),inputCanvas=input instanceof Canvas?input:createCanvasFromMedia(input),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input)){this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape;return}if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape.slice(1);return}let canvas=input instanceof env.getEnv().Canvas?input:createCanvasFromMedia(input);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tidy4(()=>{let inputTensors=range(this.batchSize,0,1).map(batchIdx=>{let input=this.getInput(batchIdx);if(input instanceof Tensor2){let imgTensor=isTensor4D(input)?input:input.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=image.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input instanceof env.getEnv().Canvas)return browser2.fromPixels(imageToSquare(input,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`)}),batchTensor=stack(inputTensors.map(t=>cast2(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input,i)=>{if(!isMediaElement(input)&&!isTensor3D(input)&&!isTensor4D(input))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input=>isMediaElement(input)&&awaitMediaLoaded(input))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input,detections){let{Canvas}=env.getEnv(),canvas=input;if(!(input instanceof Canvas)){let netInput=await toNetInput(input);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}var tf6=__toModule(require_tfjs_esm());async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tf6.tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>tf6.slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init){let fetch=env.getEnv().fetch,res=await fetch(url,init);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}var tf7=__toModule(require_tfjs_esm());function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return tf7.io.loadWeights(manifest,modelBaseUri)}function matchDimensions(input,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input.width=width,input.height=height,{width,height}}var tf15=__toModule(require_tfjs_esm()),tf8=__toModule(require_tfjs_esm()),NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor2){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor2}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof tf8.Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof tf8.Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor2})=>{this.reassignParamFromPath(path,tensor2.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable})=>{let tensor2=tf8.tensor(variable.dataSync());variable.dispose(),this.reassignParamFromPath(path,tensor2)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor2})=>Array.from(tensor2.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights=tf8.io.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof tf8.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}},tf10=__toModule(require_tfjs_esm()),tf9=__toModule(require_tfjs_esm());function depthwiseSeparableConv(x,params,stride){return tf9.tidy(()=>{let out=tf9.separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=tf9.add(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=tf10.relu(tf10.add(out1,tf10.add(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,tf10.add(out3,out4))))})}var tf11=__toModule(require_tfjs_esm());function convLayer(x,params,padding="same",withRelu=!1){return tf11.tidy(()=>{let out=tf11.add(tf11.conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?tf11.relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}var tf12=__toModule(require_tfjs_esm());function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tf12.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf12.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}var tf13=__toModule(require_tfjs_esm());function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tf13.tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tf13.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var tf14=__toModule(require_tfjs_esm()),SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tf14.tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tf14.tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tf14.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor2=weightMap[originalPath];if(!isTensor(tensor2,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor2}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tf15.tidy(()=>{let batchTensor=tf15.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf15.scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=tf15.avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}},tf17=__toModule(require_tfjs_esm()),tf16=__toModule(require_tfjs_esm());function fullyConnectedLayer(x,params){return tf16.tidy(()=>tf16.add(tf16.matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf17.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input){return tf18.tidy(()=>tf18.softmax(this.runNet(input)))}async forward(input){return this.forwardInput(await toNetInput(input))}async predictExpressions(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(tf18.unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}var tf20=__toModule(require_tfjs_esm()),tf19=__toModule(require_tfjs_esm());function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return tf19.add(tf19.conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?tf19.relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=tf19.maxPool(out,[3,3],[2,2],"same"),out=tf19.add(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(tf19.relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv2,[1,1]),out=tf19.add(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tf19.tidy(()=>{let batchTensor=tf19.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf19.scalar(256)),out=tf19.relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=tf19.relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf20.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input,pooled=tf20.avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input){return tf20.tidy(()=>{let{age,gender}=this.runNet(input);return{age,gender:tf20.softmax(gender)}})}async forward(input){return this.forwardInput(await toNetInput(input))}async predictAgeAndGender(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),ages=tf20.unstack(out.age),genders=tf20.unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var tf21=__toModule(require_tfjs_esm()),FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale2=inputSize/Math.max(height,width);return{width:width*scale2,height:height*scale2}}),batchSize=inputDimensions.length;return tf21.tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>tf21.stack([tf21.fill([68],fillX,"float32"),tf21.fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding(batchIdx,(w,h)=>wgetPadding(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input){return tf21.tidy(()=>{let out=this.runNet(input);return this.postProcess(out,input.inputSize,input.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input){return this.forwardInput(await toNetInput(input))}async detectLandmarks(input){let netInput=await toNetInput(input),landmarkTensors=tf21.tidy(()=>tf21.unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven(i)),yCoords=landmarksArray.filter((_,i)=>!isEven(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var tf22=__toModule(require_tfjs_esm());function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tf22.tidy(()=>{let batchTensor=tf22.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf22.scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=tf22.avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};var tf27=__toModule(require_tfjs_esm()),tf24=__toModule(require_tfjs_esm()),tf23=__toModule(require_tfjs_esm());function scale(x,params){return tf23.add(tf23.mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=tf24.conv2d(x,filters,strides,padding);return out=tf24.add(out,bias),out=scale(out,params.scale),withRelu?tf24.relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}var tf25=__toModule(require_tfjs_esm());function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tf25.tidy(()=>tf25.transpose(tf25.tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tf25.tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tf25.tensor1d(extractWeights(numWeights)),biases=tf25.tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale2=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale2}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tf25.tidy(()=>tf25.transpose(tf25.tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale2=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale2}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf26=__toModule(require_tfjs_esm());function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=tf26.add(out,x),out=tf26.relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=tf26.avgPool(x,2,2,"valid"),zeros2=tf26.zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=tf26.zeros(padShapeX);out=tf26.concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=tf26.zeros(padShapeY);out=tf26.concat([out,zerosH],2)}return pooled=isPad?tf26.concat([pooled,zeros2],3):pooled,out=tf26.add(pooled,out),out=tf26.relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tf27.tidy(()=>{let batchTensor=tf27.cast(input.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf27.scalar(256)),out=convDown(normalized,params.conv32_down);out=tf27.maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=tf27.matMul(globalAvg,params.fc);return fullyConnected})}async forward(input){return this.forwardInput(await toNetInput(input))}async computeFaceDescriptor(input){let netInput=await toNetInput(input),faceDescriptorTensors=tf27.tidy(()=>tf27.unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}var tf34=__toModule(require_tfjs_esm()),tf28=__toModule(require_tfjs_esm());function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tf28.tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tf28.tensor1d(extractWeights(numChannels)),batch_norm_offset=tf28.tensor1d(extractWeights(numChannels)),batch_norm_mean=tf28.tensor1d(extractWeights(numChannels)),batch_norm_variance=tf28.tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tf28.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf28.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tf28.tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf30=__toModule(require_tfjs_esm()),tf29=__toModule(require_tfjs_esm());function pointwiseConvLayer(x,params,strides){return tf29.tidy(()=>{let out=tf29.conv2d(x,params.filters,strides,"same");return out=tf29.add(out,params.batch_norm_offset),tf29.clipByValue(out,0,6)})}var epsilon=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tf30.tidy(()=>{let out=tf30.depthwiseConv2d(x,params.filters,strides,"same");return out=tf30.batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon),tf30.clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tf30.tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}var tf31=__toModule(require_tfjs_esm());function getCenterCoordinatesAndSizesLayer(x){let vec=tf31.unstack(tf31.transpose(x,[1,0])),sizes=[tf31.sub(vec[2],vec[0]),tf31.sub(vec[3],vec[1])],centers=[tf31.add(vec[0],tf31.div(sizes[0],tf31.scalar(2))),tf31.add(vec[1],tf31.div(sizes[1],tf31.scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=tf31.unstack(tf31.transpose(x1,[1,0])),div0_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2],tf31.scalar(5))),sizes[0]),tf31.scalar(2)),add0_out=tf31.add(tf31.mul(tf31.div(vec[0],tf31.scalar(10)),sizes[0]),centers[0]),div1_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3],tf31.scalar(5))),sizes[1]),tf31.scalar(2)),add1_out=tf31.add(tf31.mul(tf31.div(vec[1],tf31.scalar(10)),sizes[1]),centers[1]);return tf31.transpose(tf31.stack([tf31.sub(add0_out,div0_out),tf31.sub(add1_out,div1_out),tf31.add(add0_out,div0_out),tf31.add(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tf31.tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim,[batchSize,1,1]),[-1,4]),tf31.reshape(boxPredictions,[-1,4]));boxes=tf31.reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=tf31.sigmoid(tf31.slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=tf31.slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=tf31.reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=tf31.unstack(boxes),scoresByBatch=tf31.unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}var tf33=__toModule(require_tfjs_esm()),tf32=__toModule(require_tfjs_esm());function boxPredictionLayer(x,params){return tf32.tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=tf32.reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=tf32.reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tf33.tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=tf33.concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=tf33.concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tf34.tidy(()=>{let batchTensor=tf34.cast(input.toBatchTensor(512,!1),"float32"),x=tf34.sub(tf34.mul(batchTensor,tf34.scalar(.007843137718737125)),tf34.scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input){return this.forwardInput(await toNetInput(input))}async locateFaces(input,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression2(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",tf39=__toModule(require_tfjs_esm()),isNumber=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber(a.x)&&isNumber(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}var tf36=__toModule(require_tfjs_esm()),tf35=__toModule(require_tfjs_esm());function leaky(x){return tf35.tidy(()=>{let min=tf35.mul(x,tf35.scalar(.10000000149011612));return tf35.add(tf35.relu(tf35.sub(x,min)),min)})}function convWithBatchNorm(x,params){return tf36.tidy(()=>{let out=tf36.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf36.conv2d(out,params.conv.filters,[1,1],"valid"),out=tf36.sub(out,params.bn.sub),out=tf36.mul(out,params.bn.truediv),out=tf36.add(out,params.conv.bias),leaky(out)})}var tf37=__toModule(require_tfjs_esm());function depthwiseSeparableConv3(x,params){return tf37.tidy(()=>{let out=tf37.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf37.separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=tf37.add(out,params.bias),leaky(out)})}var tf38=__toModule(require_tfjs_esm());function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub6=tf38.tensor1d(extractWeights(size)),truediv=tf38.tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub6,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub6=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub6,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tf39.tidy(()=>{let batchTensor=tf39.cast(input.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(tf39.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input,inputSize){return await this.forwardInput(await toNetInput(input),inputSize)}async detect(input,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input),out=await this.forwardInput(netInput,inputSize),out0=tf39.tidy(()=>tf39.unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tf39.tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?tf39.softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):tf39.scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max,curr)=>max.classScore>curr.classScore?max:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}},tf41=__toModule(require_tfjs_esm()),tf40=__toModule(require_tfjs_esm());async function extractAllFacesAndComputeResults(parentResults,input,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input instanceof tf40.Tensor?await extractFaceTensors(input,faceBoxes):await extractFaces(input,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof tf40.Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input,options)=>nets.ssdMobilenetv1.locateFaces(input,options),tinyFaceDetector=(input,options)=>nets.tinyFaceDetector.locateFaces(input,options),tinyYolov23=(input,options)=>nets.tinyYolov2.locateFaces(input,options),detectFaceLandmarks=input=>nets.faceLandmark68Net.detectLandmarks(input),detectFaceLandmarksTiny=input=>nets.faceLandmark68TinyNet.detectLandmarks(input),computeFaceDescriptor=input=>nets.faceRecognitionNet.computeFaceDescriptor(input),recognizeFaceExpressions=input=>nets.faceExpressionNet.predictExpressions(input),predictAgeAndGender=input=>nets.ageGenderNet.predictAgeAndGender(input),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input){super();this.parentTask=parentTask;this.input=input}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input,options=new SsdMobilenetv1Options){super();this.input=input;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input2=>nets.tinyFaceDetector.locateFaces(input2,options):options instanceof SsdMobilenetv1Options?input2=>nets.ssdMobilenetv1.locateFaces(input2,options):options instanceof TinyYolov2Options?input2=>nets.tinyYolov2.locateFaces(input2,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input,options)}function detectAllFaces(input,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input,options)}async function allFacesSsdMobilenetv1(input,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count=1,createUniqueLabel=()=>`person ${count++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json){let labeledDescriptors=json.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version="0.8.9",node=typeof process!="undefined",browser3=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version2={faceapi:version,node,browser:browser3};export{AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,TinyYolov2SizeType,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw_exports as draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf42 as tf,tinyFaceDetector,tinyYolov23 as tinyYolov2,toNetInput,utils_exports as utils,validateConfig,version2 as version}; +var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__markAsModule=target=>__defProp(target,"__esModule",{value:!0}),__commonJS=(callback,module)=>()=>(module||(module={exports:{}},callback(module.exports,module)),module.exports),__export=(target,all)=>{__markAsModule(target);for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__exportStar=(target,module,desc)=>{if(__markAsModule(target),module&&typeof module=="object"||typeof module=="function")for(let key of __getOwnPropNames(module))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module[key],enumerable:!(desc=__getOwnPropDesc(module,key))||desc.enumerable});return target},__toModule=module=>module&&module.__esModule?module:__exportStar(__defProp(module!=null?__create(__getProtoOf(module)):{},"default",{value:module,enumerable:!0}),module);import*as dist_star from"@tensorflow/tfjs/dist/index.js";import*as tfjs_backend_wasm_star from"@tensorflow/tfjs-backend-wasm";var require_tfjs_esm=__commonJS(exports=>{__exportStar(exports,dist_star);__exportStar(exports,tfjs_backend_wasm_star)}),require_isNodejs=__commonJS((exports,module)=>{__export(exports,{isNodejs:()=>isNodejs3});function isNodejs3(){return typeof global=="object"&&!0&&typeof module!="undefined"&&typeof process!="undefined"&&!!process.version}}),tf42=__toModule(require_tfjs_esm()),draw_exports={};__export(draw_exports,{AnchorPosition:()=>AnchorPosition,DrawBox:()=>DrawBox,DrawBoxOptions:()=>DrawBoxOptions,DrawFaceLandmarks:()=>DrawFaceLandmarks,DrawFaceLandmarksOptions:()=>DrawFaceLandmarksOptions,DrawTextField:()=>DrawTextField,DrawTextFieldOptions:()=>DrawTextFieldOptions,drawContour:()=>drawContour,drawDetections:()=>drawDetections,drawFaceExpressions:()=>drawFaceExpressions,drawFaceLandmarks:()=>drawFaceLandmarks});function drawContour(ctx,points,isClosed=!1){if(ctx.beginPath(),points.slice(1).forEach(({x,y},prevIdx)=>{let from=points[prevIdx];ctx.moveTo(from.x,from.y),ctx.lineTo(x,y)}),isClosed){let from=points[points.length-1],to=points[0];if(!from||!to)return;ctx.moveTo(from.x,from.y),ctx.lineTo(to.x,to.y)}ctx.stroke()}var utils_exports={};__export(utils_exports,{computeReshapedDimensions:()=>computeReshapedDimensions,getCenterPoint:()=>getCenterPoint,isDimensions:()=>isDimensions,isEven:()=>isEven,isFloat:()=>isFloat,isTensor:()=>isTensor,isTensor1D:()=>isTensor1D,isTensor2D:()=>isTensor2D,isTensor3D:()=>isTensor3D,isTensor4D:()=>isTensor4D,isValidNumber:()=>isValidNumber,isValidProbablitiy:()=>isValidProbablitiy,range:()=>range,round:()=>round});var tf=__toModule(require_tfjs_esm()),Dimensions=class{constructor(width,height){if(!isValidNumber(width)||!isValidNumber(height))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width,height})}`);this._width=width,this._height=height}get width(){return this._width}get height(){return this._height}reverse(){return new Dimensions(1/this.width,1/this.height)}};function isTensor(tensor2,dim){return tensor2 instanceof tf.Tensor&&tensor2.shape.length===dim}function isTensor1D(tensor2){return isTensor(tensor2,1)}function isTensor2D(tensor2){return isTensor(tensor2,2)}function isTensor3D(tensor2){return isTensor(tensor2,3)}function isTensor4D(tensor2){return isTensor(tensor2,4)}function isFloat(num){return num%1!==0}function isEven(num){return num%2===0}function round(num,prec=2){let f=Math.pow(10,prec);return Math.floor(num*f)/f}function isDimensions(obj){return obj&&obj.width&&obj.height}function computeReshapedDimensions({width,height},inputSize){let scale2=inputSize/Math.max(height,width);return new Dimensions(Math.round(width*scale2),Math.round(height*scale2))}function getCenterPoint(pts){return pts.reduce((sum,pt)=>sum.add(pt),new Point(0,0)).div(new Point(pts.length,pts.length))}function range(num,start,step){return Array(num).fill(0).map((_,i)=>start+i*step)}function isValidNumber(num){return!!num&&num!==Infinity&&num!==-Infinity&&!isNaN(num)||num===0}function isValidProbablitiy(num){return isValidNumber(num)&&0<=num&&num<=1}var Point=class{constructor(x,y){this._x=x,this._y=y}get x(){return this._x}get y(){return this._y}add(pt){return new Point(this.x+pt.x,this.y+pt.y)}sub(pt){return new Point(this.x-pt.x,this.y-pt.y)}mul(pt){return new Point(this.x*pt.x,this.y*pt.y)}div(pt){return new Point(this.x/pt.x,this.y/pt.y)}abs(){return new Point(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))}floor(){return new Point(Math.floor(this.x),Math.floor(this.y))}},Box=class{static isRect(rect){return!!rect&&[rect.x,rect.y,rect.width,rect.height].every(isValidNumber)}static assertIsValidBox(box,callee,allowNegativeDimensions=!1){if(!Box.isRect(box))throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);if(!allowNegativeDimensions&&(box.width<0||box.height<0))throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`)}constructor(_box,allowNegativeDimensions=!0){let box=_box||{},isBbox=[box.left,box.top,box.right,box.bottom].every(isValidNumber),isRect=[box.x,box.y,box.width,box.height].every(isValidNumber);if(!isRect&&!isBbox)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);let[x,y,width,height]=isRect?[box.x,box.y,box.width,box.height]:[box.left,box.top,box.right-box.left,box.bottom-box.top];Box.assertIsValidBox({x,y,width,height},"Box.constructor",allowNegativeDimensions),this._x=x,this._y=y,this._width=width,this._height=height}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Point(this.left,this.top)}get topRight(){return new Point(this.right,this.top)}get bottomLeft(){return new Point(this.left,this.bottom)}get bottomRight(){return new Point(this.right,this.bottom)}round(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.round(val));return new Box({x,y,width,height})}floor(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.floor(val));return new Box({x,y,width,height})}toSquare(){let{x,y,width,height}=this,diff=Math.abs(width-height);return widthimageWidth&&(edx=-ex+imageWidth+w,ex=imageWidth),ey>imageHeight&&(edy=-ey+imageHeight+h,ey=imageHeight),x<1&&(edy=2-x,x=1),y<1&&(edy=2-y,y=1),{dy,edy,dx,edx,y,ey,x,ex,w,h}}calibrate(region){return new Box({left:this.left+region.left*this.width,top:this.top+region.top*this.height,right:this.right+region.right*this.width,bottom:this.bottom+region.bottom*this.height}).toSquare().round()}},BoundingBox=class extends Box{constructor(left,top,right,bottom,allowNegativeDimensions=!1){super({left,top,right,bottom},allowNegativeDimensions)}};var ObjectDetection=class{constructor(score,classScore,className,relativeBox,imageDims){this._imageDims=new Dimensions(imageDims.width,imageDims.height),this._score=score,this._classScore=classScore,this._className=className,this._box=new Box(relativeBox).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new Box(this._box).rescale(this.imageDims.reverse())}forSize(width,height){return new ObjectDetection(this.score,this.classScore,this.className,this.relativeBox,{width,height})}},FaceDetection=class extends ObjectDetection{constructor(score,relativeBox,imageDims){super(score,score,"",relativeBox,imageDims)}forSize(width,height){let{score,relativeBox,imageDims}=super.forSize(width,height);return new FaceDetection(score,relativeBox,imageDims)}};function iou(box1,box2,isIOU=!0){let width=Math.max(0,Math.min(box1.right,box2.right)-Math.max(box1.left,box2.left)),height=Math.max(0,Math.min(box1.bottom,box2.bottom)-Math.max(box1.top,box2.top)),interSection=width*height;return isIOU?interSection/(box1.area+box2.area-interSection):interSection/Math.min(box1.area,box2.area)}function minBbox(pts){let xs=pts.map(pt=>pt.x),ys=pts.map(pt=>pt.y),minX=xs.reduce((min,x)=>xymaxmax({score,boxIndex})).sort((c1,c2)=>c1.score-c2.score).map(c=>c.boxIndex),pick=[];for(;indicesSortedByScore.length>0;){let curr=indicesSortedByScore.pop();pick.push(curr);let indices=indicesSortedByScore,outputs=[];for(let i=0;ioutputs[j]<=iouThreshold)}return pick}var tf2=__toModule(require_tfjs_esm());function normalize(x,meanRgb){return tf2.tidy(()=>{let[r,g,b]=meanRgb,avg_r=tf2.fill([...x.shape.slice(0,3),1],r,"float32"),avg_g=tf2.fill([...x.shape.slice(0,3),1],g,"float32"),avg_b=tf2.fill([...x.shape.slice(0,3),1],b,"float32"),avg_rgb=tf2.concat([avg_r,avg_g,avg_b],3);return tf2.sub(x,avg_rgb)})}var tf3=__toModule(require_tfjs_esm());function padToSquare(imgTensor,isCenterImage=!1){return tf3.tidy(()=>{let[height,width]=imgTensor.shape.slice(1);if(height===width)return imgTensor;let dimDiff=Math.abs(height-width),paddingAmount=Math.round(dimDiff*(isCenterImage?.5:1)),paddingAxis=height>width?2:1,createPaddingTensor=paddingAmount2=>{let paddingTensorShape=imgTensor.shape.slice();return paddingTensorShape[paddingAxis]=paddingAmount2,tf3.fill(paddingTensorShape,0,"float32")},paddingTensorAppend=createPaddingTensor(paddingAmount),remainingPaddingAmount=dimDiff-paddingTensorAppend.shape[paddingAxis],paddingTensorPrepend=isCenterImage&&remainingPaddingAmount?createPaddingTensor(remainingPaddingAmount):null,tensorsToStack=[paddingTensorPrepend,imgTensor,paddingTensorAppend].filter(t=>!!t).map(t=>tf3.cast(t,"float32"));return tf3.concat(tensorsToStack,paddingAxis)})}function shuffleArray(inputArray){let array=inputArray.slice();for(let i=array.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1)),x=array[i];array[i]=array[j],array[j]=x}return array}function sigmoid(x){return 1/(1+Math.exp(-x))}function inverseSigmoid(x){return Math.log(x/(1-x))}var Rect=class extends Box{constructor(x,y,width,height,allowNegativeDimensions=!1){super({x,y,width,height},allowNegativeDimensions)}},relX=.5,relY=.43,relScale=.45,FaceLandmarks=class{constructor(relativeFaceLandmarkPositions,imgDims,shift=new Point(0,0)){let{width,height}=imgDims;this._imgDims=new Dimensions(width,height),this._shift=shift,this._positions=relativeFaceLandmarkPositions.map(pt=>pt.mul(new Point(width,height)).add(shift))}get shift(){return new Point(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(pt=>pt.sub(this._shift).div(new Point(this.imageWidth,this.imageHeight)))}forSize(width,height){return new this.constructor(this.relativePositions,{width,height})}shiftBy(x,y){return new this.constructor(this.relativePositions,this._imgDims,new Point(x,y))}shiftByPoint(pt){return this.shiftBy(pt.x,pt.y)}align(detection,options={}){if(detection){let box=detection instanceof FaceDetection?detection.box.floor():new Box(detection);return this.shiftBy(box.x,box.y).align(null,options)}let{useDlibAlignment,minBoxPadding}=Object.assign({},{useDlibAlignment:!1,minBoxPadding:.2},options);return useDlibAlignment?this.alignDlib():this.alignMinBbox(minBoxPadding)}alignDlib(){let centers=this.getRefPointsForAlignment(),[leftEyeCenter,rightEyeCenter,mouthCenter]=centers,distToMouth=pt=>mouthCenter.sub(pt).magnitude(),eyeToMouthDist=(distToMouth(leftEyeCenter)+distToMouth(rightEyeCenter))/2,size=Math.floor(eyeToMouthDist/relScale),refPoint=getCenterPoint(centers),x=Math.floor(Math.max(0,refPoint.x-relX*size)),y=Math.floor(Math.max(0,refPoint.y-relY*size));return new Rect(x,y,Math.min(size,this.imageWidth+x),Math.min(size,this.imageHeight+y))}alignMinBbox(padding){let box=minBbox(this.positions);return box.pad(box.width*padding,box.height*padding)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var FaceLandmarks5=class extends FaceLandmarks{getRefPointsForAlignment(){let pts=this.positions;return[pts[0],pts[1],getCenterPoint([pts[3],pts[4]])]}};var FaceLandmarks68=class extends FaceLandmarks{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(getCenterPoint)}};var FaceMatch=class{constructor(label,distance){this._label=label,this._distance=distance}get label(){return this._label}get distance(){return this._distance}toString(withDistance=!0){return`${this.label}${withDistance?` (${round(this.distance)})`:""}`}};var LabeledBox=class extends Box{static assertIsValidLabeledBox(box,callee){if(Box.assertIsValidBox(box,callee),!isValidNumber(box.label))throw new Error(`${callee} - expected property label (${box.label}) to be a number`)}constructor(box,label){super(box);this._label=label}get label(){return this._label}};var LabeledFaceDescriptors=class{constructor(label,descriptors){if(!(typeof label=="string"))throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(descriptors)||descriptors.some(desc=>!(desc instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=label,this._descriptors=descriptors}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(d=>Array.from(d))}}static fromJSON(json){let descriptors=json.descriptors.map(d=>new Float32Array(d));return new LabeledFaceDescriptors(json.label,descriptors)}};var PredictedBox=class extends LabeledBox{static assertIsValidPredictedBox(box,callee){if(LabeledBox.assertIsValidLabeledBox(box,callee),!isValidProbablitiy(box.score)||!isValidProbablitiy(box.classScore))throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`)}constructor(box,label,score,classScore){super(box,label);this._score=score,this._classScore=classScore}get score(){return this._score}get classScore(){return this._classScore}};function isWithFaceDetection(obj){return obj.detection instanceof FaceDetection}function extendWithFaceDetection(sourceObj,detection){let extension={detection};return Object.assign({},sourceObj,extension)}function createBrowserEnv(){let fetch=window.fetch||function(){throw new Error("fetch - missing fetch implementation for browser environment")},readFile=function(){throw new Error("readFile - filesystem not available for browser environment")};return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch,readFile}}function createFileSystem(fs){let requireFsError="";if(!fs)try{fs=require("fs")}catch(err){requireFsError=err.toString()}let readFile=fs?function(filePath){return new Promise((res,rej)=>{fs.readFile(filePath,function(err,buffer){return err?rej(err):res(buffer)})})}:function(){throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)};return{readFile}}function createNodejsEnv(){let Canvas=global.Canvas||global.HTMLCanvasElement,Image=global.Image||global.HTMLImageElement,createCanvasElement=function(){if(Canvas)return new Canvas;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},createImageElement=function(){if(Image)return new Image;throw new Error("createImageElement - missing Image implementation for nodejs environment")},fetch=global.fetch||function(){throw new Error("fetch - missing fetch implementation for nodejs environment")},fileSystem=createFileSystem();return{Canvas:Canvas||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:Image||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement,createImageElement,fetch,...fileSystem}}function isBrowser(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var isNodejs=__toModule(require_isNodejs()),environment;function getEnv(){if(!environment)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return environment}function setEnv(env16){environment=env16}function initialize(){if(isBrowser())return setEnv(createBrowserEnv());if(isNodejs.isNodejs())return setEnv(createNodejsEnv())}function monkeyPatch(env16){if(environment||initialize(),!environment)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas=environment.Canvas,Image=environment.Image}=env16;environment.Canvas=Canvas,environment.Image=Image,environment.createCanvasElement=env16.createCanvasElement||(()=>new Canvas),environment.createImageElement=env16.createImageElement||(()=>new Image),environment.ImageData=env16.ImageData||environment.ImageData,environment.Video=env16.Video||environment.Video,environment.fetch=env16.fetch||environment.fetch,environment.readFile=env16.readFile||environment.readFile}var env={getEnv,setEnv,initialize,createBrowserEnv,createFileSystem,createNodejsEnv,monkeyPatch,isBrowser,isNodejs:isNodejs.isNodejs};initialize();function resolveInput(arg){return!env.isNodejs()&&typeof arg=="string"?document.getElementById(arg):arg}function getContext2dOrThrow(canvasArg){let{Canvas,CanvasRenderingContext2D:CanvasRenderingContext2D2}=env.getEnv();if(canvasArg instanceof CanvasRenderingContext2D2)return canvasArg;let canvas=resolveInput(canvasArg);if(!(canvas instanceof Canvas))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let ctx=canvas.getContext("2d");if(!ctx)throw new Error("resolveContext2d - canvas 2d context is null");return ctx}var AnchorPosition;(function(AnchorPosition2){AnchorPosition2.TOP_LEFT="TOP_LEFT",AnchorPosition2.TOP_RIGHT="TOP_RIGHT",AnchorPosition2.BOTTOM_LEFT="BOTTOM_LEFT",AnchorPosition2.BOTTOM_RIGHT="BOTTOM_RIGHT"})(AnchorPosition||(AnchorPosition={}));var DrawTextFieldOptions=class{constructor(options={}){let{anchorPosition,backgroundColor,fontColor,fontSize,fontStyle,padding}=options;this.anchorPosition=anchorPosition||AnchorPosition.TOP_LEFT,this.backgroundColor=backgroundColor||"rgba(0, 0, 0, 0.5)",this.fontColor=fontColor||"rgba(255, 255, 255, 1)",this.fontSize=fontSize||14,this.fontStyle=fontStyle||"Georgia",this.padding=padding||4}},DrawTextField=class{constructor(text,anchor,options={}){this.text=typeof text=="string"?[text]:text instanceof DrawTextField?text.text:text,this.anchor=anchor,this.options=new DrawTextFieldOptions(options)}measureWidth(ctx){let{padding}=this.options;return this.text.map(l=>ctx.measureText(l).width).reduce((w0,w1)=>w0{let x=padding+upperLeft.x,y=padding+upperLeft.y+(i+1)*fontSize;ctx.fillText(textLine,x,y)})}},DrawBoxOptions=class{constructor(options={}){let{boxColor,lineWidth,label,drawLabelOptions}=options;this.boxColor=boxColor||"rgba(0, 0, 255, 1)",this.lineWidth=lineWidth||2,this.label=label;let defaultDrawLabelOptions={anchorPosition:AnchorPosition.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new DrawTextFieldOptions(Object.assign({},defaultDrawLabelOptions,drawLabelOptions))}},DrawBox=class{constructor(box,options={}){this.box=new Box(box),this.options=new DrawBoxOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{boxColor,lineWidth}=this.options,{x,y,width,height}=this.box;ctx.strokeStyle=boxColor,ctx.lineWidth=lineWidth,ctx.strokeRect(x,y,width,height);let{label}=this.options;label&&new DrawTextField([label],{x:x-lineWidth/2,y},this.options.drawLabelOptions).draw(canvasArg)}};function drawDetections(canvasArg,detections){let detectionsArray=Array.isArray(detections)?detections:[detections];detectionsArray.forEach(det=>{let score=det instanceof FaceDetection?det.score:isWithFaceDetection(det)?det.detection.score:void 0,box=det instanceof FaceDetection?det.box:isWithFaceDetection(det)?det.detection.box:new Box(det),label=score?`${round(score)}`:void 0;new DrawBox(box,{label}).draw(canvasArg)})}var tf18=__toModule(require_tfjs_esm());function isMediaLoaded(media){let{Image,Video}=env.getEnv();return media instanceof Image&&media.complete||media instanceof Video&&media.readyState>=3}function awaitMediaLoaded(media){return new Promise((resolve,reject)=>{if(media instanceof env.getEnv().Canvas||isMediaLoaded(media))return resolve(null);function onLoad(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),resolve(e)}function onError(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),reject(e)}media.addEventListener("load",onLoad),media.addEventListener("error",onError)})}function bufferToImage(buf){return new Promise((resolve,reject)=>{if(!(buf instanceof Blob))return reject("bufferToImage - expected buf to be of type: Blob");let reader=new FileReader;reader.onload=()=>{if(typeof reader.result!="string")return reject("bufferToImage - expected reader.result to be a string, in onload");let img=env.getEnv().createImageElement();img.onload=()=>resolve(img),img.onerror=reject,img.src=reader.result},reader.onerror=reject,reader.readAsDataURL(buf)})}function getMediaDimensions(input){let{Image,Video}=env.getEnv();return input instanceof Image?new Dimensions(input.naturalWidth,input.naturalHeight):input instanceof Video?new Dimensions(input.videoWidth,input.videoHeight):new Dimensions(input.width,input.height)}function createCanvas({width,height}){let{createCanvasElement}=env.getEnv(),canvas=createCanvasElement();return canvas.width=width,canvas.height=height,canvas}function createCanvasFromMedia(media,dims){let{ImageData:ImageData2}=env.getEnv();if(!(media instanceof ImageData2)&&!isMediaLoaded(media))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width,height}=dims||getMediaDimensions(media),canvas=createCanvas({width,height});return media instanceof ImageData2?getContext2dOrThrow(canvas).putImageData(media,0,0):getContext2dOrThrow(canvas).drawImage(media,0,0,width,height),canvas}var tf4=__toModule(require_tfjs_esm());async function imageTensorToCanvas(imgTensor,canvas){let targetCanvas=canvas||env.getEnv().createCanvasElement(),[height,width,numChannels]=imgTensor.shape.slice(isTensor4D(imgTensor)?1:0),imgTensor3D=tf4.tidy(()=>imgTensor.as3D(height,width,numChannels).toInt());return await tf4.browser.toPixels(imgTensor3D,targetCanvas),imgTensor3D.dispose(),targetCanvas}function isMediaElement(input){let{Image,Canvas,Video}=env.getEnv();return input instanceof Image||input instanceof Canvas||input instanceof Video}import{Tensor as Tensor2,browser as browser2,cast as cast2,image,stack,tidy as tidy4}from"@tensorflow/tfjs-core";function imageToSquare(input,inputSize,centerImage=!1){let{Image,Canvas}=env.getEnv();if(!(input instanceof Image||input instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input),scale2=inputSize/Math.max(dims.height,dims.width),width=scale2*dims.width,height=scale2*dims.height,targetCanvas=createCanvas({width:inputSize,height:inputSize}),inputCanvas=input instanceof Canvas?input:createCanvasFromMedia(input),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input)){this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape;return}if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape.slice(1);return}let canvas=input instanceof env.getEnv().Canvas?input:createCanvasFromMedia(input);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tidy4(()=>{let inputTensors=range(this.batchSize,0,1).map(batchIdx=>{let input=this.getInput(batchIdx);if(input instanceof Tensor2){let imgTensor=isTensor4D(input)?input:input.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=image.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input instanceof env.getEnv().Canvas)return browser2.fromPixels(imageToSquare(input,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`)}),batchTensor=stack(inputTensors.map(t=>cast2(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input,i)=>{if(!isMediaElement(input)&&!isTensor3D(input)&&!isTensor4D(input))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input=>isMediaElement(input)&&awaitMediaLoaded(input))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input,detections){let{Canvas}=env.getEnv(),canvas=input;if(!(input instanceof Canvas)){let netInput=await toNetInput(input);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}var tf6=__toModule(require_tfjs_esm());async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tf6.tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>tf6.slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init){let fetch=env.getEnv().fetch,res=await fetch(url,init);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}var tf7=__toModule(require_tfjs_esm());function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return tf7.io.loadWeights(manifest,modelBaseUri)}function matchDimensions(input,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input.width=width,input.height=height,{width,height}}var tf15=__toModule(require_tfjs_esm()),tf8=__toModule(require_tfjs_esm()),NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor2){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor2}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof tf8.Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof tf8.Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor2})=>{this.reassignParamFromPath(path,tensor2.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable})=>{let tensor2=tf8.tensor(variable.dataSync());variable.dispose(),this.reassignParamFromPath(path,tensor2)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor2})=>Array.from(tensor2.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights=tf8.io.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof tf8.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}},tf10=__toModule(require_tfjs_esm()),tf9=__toModule(require_tfjs_esm());function depthwiseSeparableConv(x,params,stride){return tf9.tidy(()=>{let out=tf9.separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=tf9.add(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=tf10.relu(tf10.add(out1,tf10.add(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,tf10.add(out3,out4))))})}var tf11=__toModule(require_tfjs_esm());function convLayer(x,params,padding="same",withRelu=!1){return tf11.tidy(()=>{let out=tf11.add(tf11.conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?tf11.relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}var tf12=__toModule(require_tfjs_esm());function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tf12.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf12.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}var tf13=__toModule(require_tfjs_esm());function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tf13.tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tf13.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var tf14=__toModule(require_tfjs_esm()),SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tf14.tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tf14.tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tf14.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor2=weightMap[originalPath];if(!isTensor(tensor2,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor2}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tf15.tidy(()=>{let batchTensor=tf15.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf15.scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=tf15.avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}},tf17=__toModule(require_tfjs_esm()),tf16=__toModule(require_tfjs_esm());function fullyConnectedLayer(x,params){return tf16.tidy(()=>tf16.add(tf16.matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf17.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input){return tf18.tidy(()=>tf18.softmax(this.runNet(input)))}async forward(input){return this.forwardInput(await toNetInput(input))}async predictExpressions(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(tf18.unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}var tf20=__toModule(require_tfjs_esm()),tf19=__toModule(require_tfjs_esm());function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return tf19.add(tf19.conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?tf19.relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=tf19.maxPool(out,[3,3],[2,2],"same"),out=tf19.add(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(tf19.relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv2,[1,1]),out=tf19.add(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tf19.tidy(()=>{let batchTensor=tf19.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf19.scalar(256)),out=tf19.relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=tf19.relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf20.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input,pooled=tf20.avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input){return tf20.tidy(()=>{let{age,gender}=this.runNet(input);return{age,gender:tf20.softmax(gender)}})}async forward(input){return this.forwardInput(await toNetInput(input))}async predictAgeAndGender(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),ages=tf20.unstack(out.age),genders=tf20.unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var tf21=__toModule(require_tfjs_esm()),FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale2=inputSize/Math.max(height,width);return{width:width*scale2,height:height*scale2}}),batchSize=inputDimensions.length;return tf21.tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>tf21.stack([tf21.fill([68],fillX,"float32"),tf21.fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding(batchIdx,(w,h)=>wgetPadding(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input){return tf21.tidy(()=>{let out=this.runNet(input);return this.postProcess(out,input.inputSize,input.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input){return this.forwardInput(await toNetInput(input))}async detectLandmarks(input){let netInput=await toNetInput(input),landmarkTensors=tf21.tidy(()=>tf21.unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven(i)),yCoords=landmarksArray.filter((_,i)=>!isEven(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var tf22=__toModule(require_tfjs_esm());function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tf22.tidy(()=>{let batchTensor=tf22.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf22.scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=tf22.avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};var tf27=__toModule(require_tfjs_esm()),tf24=__toModule(require_tfjs_esm()),tf23=__toModule(require_tfjs_esm());function scale(x,params){return tf23.add(tf23.mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=tf24.conv2d(x,filters,strides,padding);return out=tf24.add(out,bias),out=scale(out,params.scale),withRelu?tf24.relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}var tf25=__toModule(require_tfjs_esm());function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tf25.tidy(()=>tf25.transpose(tf25.tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tf25.tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tf25.tensor1d(extractWeights(numWeights)),biases=tf25.tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale2=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale2}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tf25.tidy(()=>tf25.transpose(tf25.tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale2=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale2}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf26=__toModule(require_tfjs_esm());function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=tf26.add(out,x),out=tf26.relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=tf26.avgPool(x,2,2,"valid"),zeros2=tf26.zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=tf26.zeros(padShapeX);out=tf26.concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=tf26.zeros(padShapeY);out=tf26.concat([out,zerosH],2)}return pooled=isPad?tf26.concat([pooled,zeros2],3):pooled,out=tf26.add(pooled,out),out=tf26.relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tf27.tidy(()=>{let batchTensor=tf27.cast(input.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf27.scalar(256)),out=convDown(normalized,params.conv32_down);out=tf27.maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=tf27.matMul(globalAvg,params.fc);return fullyConnected})}async forward(input){return this.forwardInput(await toNetInput(input))}async computeFaceDescriptor(input){let netInput=await toNetInput(input),faceDescriptorTensors=tf27.tidy(()=>tf27.unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}var tf34=__toModule(require_tfjs_esm()),tf28=__toModule(require_tfjs_esm());function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tf28.tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tf28.tensor1d(extractWeights(numChannels)),batch_norm_offset=tf28.tensor1d(extractWeights(numChannels)),batch_norm_mean=tf28.tensor1d(extractWeights(numChannels)),batch_norm_variance=tf28.tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tf28.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf28.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tf28.tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf30=__toModule(require_tfjs_esm()),tf29=__toModule(require_tfjs_esm());function pointwiseConvLayer(x,params,strides){return tf29.tidy(()=>{let out=tf29.conv2d(x,params.filters,strides,"same");return out=tf29.add(out,params.batch_norm_offset),tf29.clipByValue(out,0,6)})}var epsilon=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tf30.tidy(()=>{let out=tf30.depthwiseConv2d(x,params.filters,strides,"same");return out=tf30.batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon),tf30.clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tf30.tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}var tf31=__toModule(require_tfjs_esm());function getCenterCoordinatesAndSizesLayer(x){let vec=tf31.unstack(tf31.transpose(x,[1,0])),sizes=[tf31.sub(vec[2],vec[0]),tf31.sub(vec[3],vec[1])],centers=[tf31.add(vec[0],tf31.div(sizes[0],tf31.scalar(2))),tf31.add(vec[1],tf31.div(sizes[1],tf31.scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=tf31.unstack(tf31.transpose(x1,[1,0])),div0_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2],tf31.scalar(5))),sizes[0]),tf31.scalar(2)),add0_out=tf31.add(tf31.mul(tf31.div(vec[0],tf31.scalar(10)),sizes[0]),centers[0]),div1_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3],tf31.scalar(5))),sizes[1]),tf31.scalar(2)),add1_out=tf31.add(tf31.mul(tf31.div(vec[1],tf31.scalar(10)),sizes[1]),centers[1]);return tf31.transpose(tf31.stack([tf31.sub(add0_out,div0_out),tf31.sub(add1_out,div1_out),tf31.add(add0_out,div0_out),tf31.add(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tf31.tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim,[batchSize,1,1]),[-1,4]),tf31.reshape(boxPredictions,[-1,4]));boxes=tf31.reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=tf31.sigmoid(tf31.slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=tf31.slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=tf31.reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=tf31.unstack(boxes),scoresByBatch=tf31.unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}var tf33=__toModule(require_tfjs_esm()),tf32=__toModule(require_tfjs_esm());function boxPredictionLayer(x,params){return tf32.tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=tf32.reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=tf32.reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tf33.tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=tf33.concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=tf33.concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tf34.tidy(()=>{let batchTensor=tf34.cast(input.toBatchTensor(512,!1),"float32"),x=tf34.sub(tf34.mul(batchTensor,tf34.scalar(.007843137718737125)),tf34.scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input){return this.forwardInput(await toNetInput(input))}async locateFaces(input,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression2(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",tf39=__toModule(require_tfjs_esm()),isNumber=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber(a.x)&&isNumber(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}var tf36=__toModule(require_tfjs_esm()),tf35=__toModule(require_tfjs_esm());function leaky(x){return tf35.tidy(()=>{let min=tf35.mul(x,tf35.scalar(.10000000149011612));return tf35.add(tf35.relu(tf35.sub(x,min)),min)})}function convWithBatchNorm(x,params){return tf36.tidy(()=>{let out=tf36.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf36.conv2d(out,params.conv.filters,[1,1],"valid"),out=tf36.sub(out,params.bn.sub),out=tf36.mul(out,params.bn.truediv),out=tf36.add(out,params.conv.bias),leaky(out)})}var tf37=__toModule(require_tfjs_esm());function depthwiseSeparableConv3(x,params){return tf37.tidy(()=>{let out=tf37.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf37.separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=tf37.add(out,params.bias),leaky(out)})}var tf38=__toModule(require_tfjs_esm());function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub6=tf38.tensor1d(extractWeights(size)),truediv=tf38.tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub6,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub6=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub6,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tf39.tidy(()=>{let batchTensor=tf39.cast(input.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(tf39.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input,inputSize){return await this.forwardInput(await toNetInput(input),inputSize)}async detect(input,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input),out=await this.forwardInput(netInput,inputSize),out0=tf39.tidy(()=>tf39.unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tf39.tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?tf39.softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):tf39.scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max,curr)=>max.classScore>curr.classScore?max:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}},tf41=__toModule(require_tfjs_esm()),tf40=__toModule(require_tfjs_esm());async function extractAllFacesAndComputeResults(parentResults,input,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input instanceof tf40.Tensor?await extractFaceTensors(input,faceBoxes):await extractFaces(input,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof tf40.Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input,options)=>nets.ssdMobilenetv1.locateFaces(input,options),tinyFaceDetector=(input,options)=>nets.tinyFaceDetector.locateFaces(input,options),tinyYolov23=(input,options)=>nets.tinyYolov2.locateFaces(input,options),detectFaceLandmarks=input=>nets.faceLandmark68Net.detectLandmarks(input),detectFaceLandmarksTiny=input=>nets.faceLandmark68TinyNet.detectLandmarks(input),computeFaceDescriptor=input=>nets.faceRecognitionNet.computeFaceDescriptor(input),recognizeFaceExpressions=input=>nets.faceExpressionNet.predictExpressions(input),predictAgeAndGender=input=>nets.ageGenderNet.predictAgeAndGender(input),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input){super();this.parentTask=parentTask;this.input=input}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input,options=new SsdMobilenetv1Options){super();this.input=input;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input2=>nets.tinyFaceDetector.locateFaces(input2,options):options instanceof SsdMobilenetv1Options?input2=>nets.ssdMobilenetv1.locateFaces(input2,options):options instanceof TinyYolov2Options?input2=>nets.tinyYolov2.locateFaces(input2,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input,options)}function detectAllFaces(input,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input,options)}async function allFacesSsdMobilenetv1(input,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count=1,createUniqueLabel=()=>`person ${count++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json){let labeledDescriptors=json.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version="0.9.1",node=typeof process!="undefined",browser3=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version2={faceapi:version,node,browser:browser3};export{AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,TinyYolov2SizeType,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw_exports as draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf42 as tf,tinyFaceDetector,tinyYolov23 as tinyYolov2,toNetInput,utils_exports as utils,validateConfig,version2 as version}; //# sourceMappingURL=face-api.esm-nobundle.js.map diff --git a/dist/face-api.esm-nobundle.json b/dist/face-api.esm-nobundle.json index 14b49e4..be26220 100644 --- a/dist/face-api.esm-nobundle.json +++ b/dist/face-api.esm-nobundle.json @@ -2060,7 +2060,7 @@ ] }, "package.json": { - "bytes": 1409, + "bytes": 1352, "imports": [] }, "src/index.ts": { diff --git a/dist/face-api.esm.js b/dist/face-api.esm.js index 9e4eb8e..4f7631d 100644 --- a/dist/face-api.esm.js +++ b/dist/face-api.esm.js @@ -3969,7 +3969,7 @@ return a / b;`,DIV_PACKED=` ${$x.shape}`),assert3(inputWidth*blockSize>=0,()=>`Negative dimension size caused by overflow when multiplying ${inputWidth} and ${blockSize} for depthToSpace with input shape ${$x.shape}`),assert3(inputDepth%(blockSize*blockSize)===0,()=>`Dimension size must be evenly divisible by ${blockSize*blockSize} but is ${inputDepth} for depthToSpace with input shape ${$x.shape}`);let forward=backend3=>backend3.depthToSpace($x,blockSize,dataFormat),inputs={x:$x},attrs={blockSize,dataFormat};return ENGINE2.runKernelFunc(forward,inputs,null,DepthToSpace2,attrs)}var depthToSpace3=op2({depthToSpace_:depthToSpace_2});function depthwiseConv2d_2(x,filter,strides,pad7,dataFormat="NHWC",dilations=[1,1],dimRoundingMode){let $x=convertToTensor2(x,"x","depthwiseConv2d"),$filter=convertToTensor2(filter,"filter","depthwiseConv2d"),x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(x4D.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${x4D.rank}.`),assert3($filter.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${$filter.rank}.`),assert3(x4D.shape[3]===$filter.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${x4D.shape[3]}) must match the inChannels dimension in filter ${$filter.shape[2]}.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=(backend3,save)=>{dilations==null&&(dilations=[1,1]),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`);let convInfo=computeConv2DInfo2(x4D.shape,$filter.shape,strides,dilations,pad7,dimRoundingMode,!0),res2=backend3.depthwiseConv2D(x4D,$filter,convInfo);return save([x4D,$filter]),res2},inputs={x:x4D,filter:$filter},attrs={strides,pad:pad7,dataFormat,dilations,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNative2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var depthwiseConv2d6=op2({depthwiseConv2d_:depthwiseConv2d_2});function dilation2d_2(x,filter,strides,pad7,dilations=[1,1],dataFormat="NHWC"){let $x=convertToTensor2(x,"x","dilation2d"),$filter=convertToTensor2(filter,"filter","dilation2d");assert3($x.rank===3||$x.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${$x.rank}.`),assert3($filter.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${$filter.rank}.`),assert3(dataFormat==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${dataFormat}`);let x4D=$x,reshapedTo4D=!1;$x.rank===3&&(x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]]),reshapedTo4D=!0);let inputs={x:x4D,filter:$filter},attrs={strides,pad:pad7,dilations},res=ENGINE2.runKernel(Dilation2D2,inputs,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var dilation2d2=op2({dilation2d_:dilation2d_2});function getReductionAxes2(inShape,outShape){let result=[];for(let i=0;i1)&&result.unshift(outAxis)}return result}function assertAndGetBroadcastShape2(shapeA,shapeB){let result=[],l=Math.max(shapeA.length,shapeB.length);for(let i=0;ibackend3.equal($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Equal2)}var equal2=op2({equal_:equal_2});function where_2(condition,a,b){let $a=convertToTensor2(a,"a","where"),$b=convertToTensor2(b,"b","where"),$condition=convertToTensor2(condition,"condition","where","bool"),broadcastShape=assertAndGetBroadcastShape2($a.shape,$b.shape),$broadcastedA=broadcastTo2($a,broadcastShape),$broadcastedB=broadcastTo2($b,broadcastShape);$condition.rank===1&&assert3($condition.shape[0]===$a.shape[0],()=>"The first dimension of `a` must match the size of `condition`."),$condition.rank!==1&&assertShapesMatch2($condition.shape,$broadcastedB.shape,"Error in where: ");let forward=(backend3,save)=>{let res=backend3.select($condition,$broadcastedA,$broadcastedB);return save([$condition]),res},inputs={condition:$condition,t:$broadcastedA,e:$broadcastedB};return ENGINE2.runKernelFunc(forward,inputs,null,SelectV22)}var where2=op2({where_:where_2});function zerosLike_2(x){let $x=convertToTensor2(x,"x","zerosLike"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.zerosLike($x),inputs,null,ZerosLike2)}var zerosLike3=op2({zerosLike_:zerosLike_2});function divNoNan_2(a,b){let $a=convertToTensor2(a,"a","div"),$b=convertToTensor2(b,"b","div");[$a,$b]=makeTypesMatch2($a,$b);let divResult=div2($a,$b),zeros10=zerosLike3(divResult),bEqualsZero=equal2($b,zeros10);return where2(bEqualsZero,zeros10,divResult)}var divNoNan2=op2({divNoNan_:divNoNan_2});function dot_2(t1,t2){let $t1=convertToTensor2(t1,"t1","dot"),$t2=convertToTensor2(t2,"t2","dot");assert3(($t1.rank===1||$t1.rank===2)&&($t2.rank===1||$t2.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${$t1.rank} and ${$t2.rank}.`);let t1Inner=$t1.rank===1?$t1.size:$t1.shape[1],t2Inner=$t2.rank===1?$t2.size:$t2.shape[0];if(assert3(t1Inner===t2Inner,()=>`Error in dot: inner dimensions of inputs must match, but got ${t1Inner} and ${t2Inner}.`),$t1.rank===1&&$t2.rank===1){let t12D=reshape2($t1,[1,-1]),t22D=reshape2($t2,[-1,1]),t1t2=matMul3(t12D,t22D);return reshape2(t1t2,[])}else if($t1.rank===1&&$t2.rank===2){let t12D=reshape2($t1,[1,-1]),t22D=reshape2($t2,[$t2.shape[0],$t2.shape[1]]),t1t2=matMul3(t12D,t22D);return reshape2(t1t2,[t1t2.size])}else if($t1.rank===2&&$t2.rank===1){let t22D=reshape2($t2,[-1,1]),t1t2=matMul3($t1,t22D);return reshape2(t1t2,[t1t2.size])}else{let t22D=reshape2($t2,[$t2.shape[0],$t2.shape[1]]),t1t2=matMul3($t1,t22D);return t1t2}}var dot2=op2({dot_:dot_2});function elu_2(x){let $x=convertToTensor2(x,"x","elu"),forward=(backend3,save)=>{let y=backend3.elu($x);return save([y]),y},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Elu3)}var elu2=op2({elu_:elu_2});function erf_2(x){let $x=convertToTensor2(x,"x","erf");assert3($x.dtype==="int32"||$x.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),$x.dtype==="int32"&&($x=cast2($x,"float32"));let inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.erf($x);return save([$x]),res},inputs,null,Erf2)}var erf2=op2({erf_:erf_2});function exp_2(x){let $x=convertToTensor2(x,"x","exp"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.exp($x);return save([res]),res},inputs,null,Exp2)}var exp2=op2({exp_:exp_2});function expandDims_2(x,axis=0){let parseAs=null,$x=convertToTensor2(x,"x","expandDims",parseAs);assert3(axis<=$x.rank,()=>"Axis must be <= rank of the tensor");let newShape=$x.shape.slice();return axis<0&&(assert3(-($x.rank+1)<=axis,()=>`Axis must be in the interval [${-($x.rank+1)}, ${$x.rank}]`),axis=$x.rank+axis+1),newShape.splice(axis,0,1),reshape2($x,newShape)}var expandDims3=op2({expandDims_:expandDims_2});function expm1_2(x){let $x=convertToTensor2(x,"x","expm1"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.expm1($x);return save([$x]),res},inputs,null,Expm12)}var expm12=op2({expm1_:expm1_2});function tile_2(x,reps){let parseAs=null,$x=convertToTensor2(x,"x","tile",parseAs);assert3($x.rank===reps.length,()=>`Error in transpose: rank of input ${$x.rank} must match length of reps ${reps}.`);let forward=(backend3,save)=>{let res=backend3.tile($x,reps);return save([$x]),res},inputsToSave=[$x],inputs={x:$x},attrs={reps};return ENGINE2.runKernelFunc(forward,inputs,null,Tile2,attrs,inputsToSave)}var tile2=op2({tile_:tile_2});function eye_2(numRows,numColumns,batchShape,dtype="float32"){numColumns==null&&(numColumns=numRows);let buff=buffer2([numRows,numColumns],dtype),n=numRows<=numColumns?numRows:numColumns;for(let i=0;ibackend3.fill(shape,value,dtype),{},null,Fill2,attrs)}function floor_2(x){let $x=convertToTensor2(x,"x","floor"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.floor($x),inputs,null,Floor2)}var floor2=op2({floor_:floor_2});function collectGatherOpShapeInfo2(x,indices,axis){let dimSize=x.shape[axis],outputShape=[],batchSize=1,sliceSize=1;for(let i=0;i{let parsedAxis=parseAxisParam2(axis,$x.shape)[0],shapeInfo=collectGatherOpShapeInfo2($x,$indices,parsedAxis),res=backend3.gather($x,reshape2($indices,[$indices.size]),parsedAxis);return save([$x,$indices]),reshape2(res,shapeInfo.outputShape)};return ENGINE2.runKernelFunc(forward,inputs,null,GatherV22,attrs)}var gather2=op2({gather_:gather_2});function greater_2(a,b){let $a=convertToTensor2(a,"a","greater"),$b=convertToTensor2(b,"b","greater");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=backend3=>backend3.greater($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Greater2)}var greater2=op2({greater_:greater_2});function greaterEqual_2(a,b){let $a=convertToTensor2(a,"a","greaterEqual"),$b=convertToTensor2(b,"b","greaterEqual");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.greaterEqual($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,GreaterEqual2)}var greaterEqual2=op2({greaterEqual_:greaterEqual_2});function imag_2(input2){let $input=convertToTensor2(input2,"input","imag"),forward=backend3=>backend3.imag($input),inputs={input:$input};return ENGINE2.runKernelFunc(forward,inputs,null,Imag2)}var imag2=op2({imag_:imag_2});function isFinite_2(x){let $x=convertToTensor2(x,"x","isFinite"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.isFinite($x),inputs,null,IsFinite2)}var isFinite4=op2({isFinite_:isFinite_2});function isInf_2(x){let $x=convertToTensor2(x,"x","isInf"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.isInf($x),inputs,null,IsInf2)}var isInf3=op2({isInf_:isInf_2});function isNaN_2(x){let $x=convertToTensor2(x,"x","isNaN"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.isNaN($x),inputs,null,IsNan2)}var isNaN4=op2({isNaN_:isNaN_2});function maximum_2(a,b){let $a=convertToTensor2(a,"a","maximum"),$b=convertToTensor2(b,"b","maximum");[$a,$b]=makeTypesMatch2($a,$b),$a.dtype==="bool"&&($a=cast2($a,"int32"),$b=cast2($b,"int32")),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.maximum($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Maximum3)}var maximum2=op2({maximum_:maximum_2});function scalar2(value,dtype){if((isTypedArray2(value)&&dtype!=="string"||Array.isArray(value))&&dtype!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(dtype==="string"&&isTypedArray2(value)&&!(value instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");let shape=[],inferredShape=[];return makeTensor2(value,shape,inferredShape,dtype)}function leakyRelu_2(x,alpha=.2){let $x=convertToTensor2(x,"x","leakyRelu");return maximum2(mul2(scalar2(alpha),$x),$x)}var leakyRelu2=op2({leakyRelu_:leakyRelu_2});function less_2(a,b){let $a=convertToTensor2(a,"a","less"),$b=convertToTensor2(b,"b","less");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=backend3=>backend3.less($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Less2)}var less2=op2({less_:less_2});function lessEqual_2(a,b){let $a=convertToTensor2(a,"a","lessEqual"),$b=convertToTensor2(b,"b","lessEqual");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.lessEqual($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,LessEqual2)}var lessEqual2=op2({lessEqual_:lessEqual_2});function localResponseNormalization_2(x,depthRadius=5,bias=1,alpha=1,beta=.5){let $x=convertToTensor2(x,"x","localResponseNormalization");assert3($x.rank===4||$x.rank===3,()=>`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${$x.rank}.`),assert3(isInt2(depthRadius),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${depthRadius}.`);let x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]]));let forward=(backend3,save)=>{let y=backend3.localResponseNormalization4D(x4D,depthRadius,bias,alpha,beta);return save([x4D,y]),y},inputs={x:x4D},attrs={depthRadius,bias,alpha,beta},res=ENGINE2.runKernelFunc(forward,inputs,null,LRN2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var localResponseNormalization2=op2({localResponseNormalization_:localResponseNormalization_2});function log_2(x){let $x=convertToTensor2(x,"x","log"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.log($x);return save([$x]),res},inputs,null,Log2)}var log2=op2({log_:log_2});function log1p_2(x){let $x=convertToTensor2(x,"x","log1p"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.log1p($x);return save([$x]),res},inputs,null,Log1p2)}var log1p2=op2({log1p_:log1p_2});function customGrad2(f){return ENGINE2.customGrad(f)}function neg_2(x){let $x=convertToTensor2(x,"x","neg"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.neg($x),inputs,null,Negate2)}var neg2=op2({neg_:neg_2});function softplus_2(x){let $x=convertToTensor2(x,"x","softplus"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.softplus($x);return save([$x]),res},inputs,null,Softplus3)}var softplus2=op2({softplus_:softplus_2});function logSigmoid_2(x){let $x=convertToTensor2(x,"x","logSigmoid"),customOp=customGrad2(x2=>{let value=neg2(softplus2(neg2(x2))),gradFunc=dy=>{let derX=mul2(dy,sigmoid3(neg2(x2)));return derX};return{value,gradFunc}});return customOp($x)}var logSigmoid2=op2({logSigmoid_:logSigmoid_2});function max_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","max"),forward=(backend3,save)=>{let origAxes=parseAxisParam2(axis,$x.shape),axes=origAxes,permutedAxes=getAxesPermutation2(axes,$x.rank),maxInput=$x;permutedAxes!=null&&(maxInput=transpose2($x,permutedAxes),axes=getInnerMostAxes2(axes.length,maxInput.rank));let y=backend3.max(maxInput,axes);permutedAxes!=null&&maxInput.dispose();let res=y;if(keepDims){let expandedShape=expandShapeToKeepDim2(res.shape,parseAxisParam2(axis,$x.shape));res=reshape2(res,expandedShape),y.dispose()}return save([$x,res]),res},inputs={x:$x},attrs={reductionIndices:axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Max2,attrs)}var max2=op2({max_:max_2});function sub_2(a,b){let $a=convertToTensor2(a,"a","sub"),$b=convertToTensor2(b,"b","sub");[$a,$b]=makeTypesMatch2($a,$b);let forward=(backend3,save)=>{let res=backend3.subtract($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Sub2)}var sub2=op2({sub_:sub_2});function sum_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","sum");$x.dtype==="bool"&&($x=cast2($x,"int32"));let forward=(backend3,save)=>{save([$x]);let axes=parseAxisParam2(axis,$x.shape),permutation=getAxesPermutation2(axes,$x.rank),reductionAxes=axes,permutedX=$x;permutation!=null&&(permutedX=transpose2($x,permutation),reductionAxes=getInnerMostAxes2(reductionAxes.length,$x.rank));let value=backend3.sum(permutedX,reductionAxes);if(keepDims){let newShape=expandShapeToKeepDim2(value.shape,axes);value=reshape2(value,newShape)}return value},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Sum2,attrs)}var sum3=op2({sum_:sum_2});function logSoftmax_2(logits,axis=-1){let $logits=convertToTensor2(logits,"logits","logSoftmax");if(axis===-1&&(axis=$logits.rank-1),axis!==$logits.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${$logits.rank} and axis was ${axis}`);let forward=(backend3,save)=>{let keepDims=!0,xMax=max2(logits,axis,!0),shifted=sub2(logits,xMax),value=sub2(cast2(shifted,"float32"),log2(sum3(exp2(shifted),axis,keepDims)));return save([value]),value},inputs={logits:$logits},attrs={axis};return ENGINE2.runKernelFunc(forward,inputs,null,LogSoftmax3,attrs)}var logSoftmax2=op2({logSoftmax_:logSoftmax_2});function logSumExp_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","logSumExp"),axes=parseAxisParam2(axis,$x.shape),xMax=max2($x,axes,!0),a=sub2($x,xMax),b=exp2(a),c=sum3(b,axes),d=log2(c),res=add4(reshape2(xMax,d.shape),d);if(keepDims){let newShape=expandShapeToKeepDim2(res.shape,axes);return reshape2(res,newShape)}return res}var logSumExp2=op2({logSumExp_:logSumExp_2});function logicalAnd_2(a,b){let $a=convertToTensor2(a,"a","logicalAnd","bool"),$b=convertToTensor2(b,"b","logicalAnd","bool");assertAndGetBroadcastShape2($a.shape,$b.shape);let inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(backend3=>backend3.logicalAnd($a,$b),inputs,null,LogicalAnd2)}var logicalAnd2=op2({logicalAnd_:logicalAnd_2});function logicalNot_2(x){let $x=convertToTensor2(x,"x","logicalNot","bool"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.logicalNot($x),inputs,null,LogicalNot2)}var logicalNot3=op2({logicalNot_:logicalNot_2});function logicalOr_2(a,b){let $a=convertToTensor2(a,"a","logicalOr","bool"),$b=convertToTensor2(b,"b","logicalOr","bool");assertAndGetBroadcastShape2($a.shape,$b.shape);let inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(backend3=>backend3.logicalOr($a,$b),inputs,null,LogicalOr2)}var logicalOr2=op2({logicalOr_:logicalOr_2});function logicalXor_2(a,b){let $a=convertToTensor2(a,"a","logicalXor","bool"),$b=convertToTensor2(b,"b","logicalXor","bool");return assertAndGetBroadcastShape2($a.shape,$b.shape),logicalAnd2(logicalOr2(a,b),logicalNot3(logicalAnd2(a,b)))}var logicalXor2=op2({logicalXor_:logicalXor_2});function maxPool_2(x,filterSize,strides,pad7,dimRoundingMode){let $x=convertToTensor2(x,"x","maxPool"),dilations=1,x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(x4D.rank===4,()=>`Error in maxPool: input must be rank 4 but got rank ${x4D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=(backend3,save)=>{let convInfo=computePool2DInfo2(x4D.shape,filterSize,strides,1,pad7,dimRoundingMode),y;return convInfo.filterWidth===1&&convInfo.filterHeight===1&&arraysEqual2(convInfo.inShape,convInfo.outShape)?y=x4D.clone():y=backend3.maxPool(x4D,convInfo),save([x4D,y]),y},inputs={x:x4D},attrs={filterSize,strides,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,MaxPool2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var maxPool5=op2({maxPool_:maxPool_2});function zeros2(shape,dtype="float32"){if(dtype==="complex64"){let real9=zeros2(shape,"float32"),imag9=zeros2(shape,"float32");return complex2(real9,imag9)}let values=makeZerosTypedArray2(sizeFromShape2(shape),dtype);return ENGINE2.makeTensor(values,shape,dtype)}function ones4(shape,dtype="float32"){if(dtype==="complex64"){let real9=ones4(shape,"float32"),imag9=zeros2(shape,"float32");return complex2(real9,imag9)}let values=makeOnesTypedArray2(sizeFromShape2(shape),dtype);return ENGINE2.makeTensor(values,shape,dtype)}function mean_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","mean"),axes=parseAxisParam2(axis,$x.shape),shapes=computeOutAndReduceShapes2($x.shape,axes),reduceShape=shapes[1],reduceSize=sizeFromShape2(reduceShape),inputs={x:$x},attrs={axis,keepDims},forward=()=>{let reduceSizeScalar=scalar2(reduceSize),xReduce=reduceSizeScalar.dtype===$x.dtype?$x:cast2($x,reduceSizeScalar.dtype),res=div2(xReduce,reduceSizeScalar);return sum3(res,axis,keepDims)},customOp=customGrad2(x2=>{let value=ENGINE2.runKernelFunc(forward,inputs,null,Mean2,attrs),gradFunc=dy=>{let expandedDyShape=x2.shape.slice();axes.forEach(axis2=>{expandedDyShape[axis2]=1});let expandedDy=reshape2(dy,expandedDyShape),derX=div2(mul2(expandedDy,ones4(x2.shape,"float32")),reduceSize);return derX};return{value,gradFunc}});return customOp($x)}var mean2=op2({mean_:mean_2});function min_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","min"),forward=(backend3,save)=>{let origAxes=parseAxisParam2(axis,$x.shape),axes=origAxes,permutedAxes=getAxesPermutation2(axes,$x.rank),minInput=$x;permutedAxes!=null&&(minInput=transpose2($x,permutedAxes),axes=getInnerMostAxes2(axes.length,$x.rank));let y=backend3.min(minInput,axes);permutedAxes!=null&&minInput.dispose();let res=y;if(keepDims){let expandedShape=expandShapeToKeepDim2(res.shape,origAxes);res=reshape2(y,expandedShape),y.dispose()}return save([$x,res]),res},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Min2,attrs)}var min2=op2({min_:min_2});function minimum_2(a,b){let $a=convertToTensor2(a,"a","minimum"),$b=convertToTensor2(b,"b","minimum");[$a,$b]=makeTypesMatch2($a,$b),$a.dtype==="bool"&&($a=cast2($a,"int32"),$b=cast2($b,"int32")),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.minimum($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Minimum3)}var minimum2=op2({minimum_:minimum_2});function mirrorPad_2(x,paddings,mode){assert3(mode==="reflect"||mode==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${mode}.`);let $x=convertToTensor2(x,"x","mirrorPad");if($x.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");assert3(paddings.length===$x.rank,()=>`Padding doesn't match input. Must be ${$x.rank}. Got ${paddings.length}.`);let shapeOffset=mode==="reflect"?1:0;for(let i=0;i<$x.rank;i++)assert3(paddings[i].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),assert3(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}`);let attrs={paddings,mode},inputs={x:$x};return ENGINE2.runKernel(MirrorPad2,inputs,attrs)}var mirrorPad3=op2({mirrorPad_:mirrorPad_2});function mod_2(a,b){let $a=convertToTensor2(a,"a","mod"),$b=convertToTensor2(b,"b","mod");[$a,$b]=makeTypesMatch2($a,$b);let forward=(backend3,save)=>{let res=backend3.mod($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Mod2)}var mod2=op2({mod_:mod_2});function square_2(x){let $x=convertToTensor2(x,"x","square"),attrs={},inputsToSave=[$x],outputsToSave=[];return ENGINE2.runKernelFunc((backend3,save)=>(save([$x]),backend3.square($x)),{x:$x},null,"Square",attrs,inputsToSave,outputsToSave)}var square2=op2({square_:square_2});function notEqual_2(a,b){let $a=convertToTensor2(a,"a","notEqual"),$b=convertToTensor2(b,"b","notEqual");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=backend3=>backend3.notEqual($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,NotEqual2)}var notEqual4=op2({notEqual_:notEqual_2});function real_2(input2){let $input=convertToTensor2(input2,"input","real"),forward=backend3=>backend3.real($input),inputs={input:$input};return ENGINE2.runKernelFunc(forward,inputs,null,Real2)}var real2=op2({real_:real_2});function onesLike_2(x){let $x=convertToTensor2(x,"x","onesLike"),forward=(backend3,save)=>{if($x.dtype==="complex64"){let r=onesLike3(real2($x)),i=zerosLike3(imag2($x));return complex2(r,i)}return backend3.onesLike($x)},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,OnesLike2)}var onesLike3=op2({onesLike_:onesLike_2});function pad_2(x,paddings,constantValue=0){let $x=convertToTensor2(x,"x","pad");if($x.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let forward=(backend3,save)=>(save([$x]),backend3.pad($x,paddings,constantValue)),attrs={paddings,constantValue},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,PadV22,attrs)}var pad2=op2({pad_:pad_2});function spaceToBatchND_2(x,blockShape,paddings){let $x=convertToTensor2(x,"x","spaceToBatchND");assert3($x.rank>=1+blockShape.length,()=>`input rank ${$x.rank} should be > than [blockShape] ${blockShape.length}`),assert3(paddings.length===blockShape.length,()=>`paddings.shape[0] ${paddings.length} must be equal to [blockShape] ${blockShape.length}`),assert3($x.shape.reduce((a,b,i)=>i>0&&i<=blockShape.length?a&&(b+paddings[i-1][0]+paddings[i-1][1])%blockShape[i-1]===0:a,!0),()=>`input spatial dimensions ${$x.shape.slice(1)} with paddings ${paddings.toString()} must be divisible by blockShapes ${blockShape.toString()}`);let forward=backend3=>backend3.spaceToBatchND($x,blockShape,paddings),inputs={x:$x},attrs={blockShape,paddings};return ENGINE2.runKernelFunc(forward,inputs,null,SpaceToBatchND2,attrs)}var spaceToBatchND3=op2({spaceToBatchND_:spaceToBatchND_2});function pool_2(input2,windowShape,poolingType,pad7,dilations,strides){dilations==null&&(dilations=[1,1]),strides==null&&(strides=1),pad7===0&&(pad7="valid");let $x=convertToTensor2(input2,"x","maxPool"),x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`);let convInfo=computePool2DInfo2(x4D.shape,windowShape,strides,dilations,pad7),dilation=[convInfo.dilationHeight,convInfo.dilationWidth],basePadding;pad7==="same"?basePadding=withSpaceToBatchBasePaddings2([convInfo.filterHeight,convInfo.filterWidth],dilation):basePadding=[[0,0],[0,0]];let isDilationOne=dilation[0]===1&&dilation[1]===1,[adjustedPadding,adjustedCrops]=requiredSpaceToBatchPaddings2([convInfo.inHeight,convInfo.inWidth],dilation,basePadding),convertedPad=isDilationOne?pad7:"valid",convertedX=isDilationOne?x4D:spaceToBatchND3(x4D,dilation,adjustedPadding),forwardOp=poolingType==="avg"?()=>avgPool5(convertedX,windowShape,strides,convertedPad):()=>maxPool5(convertedX,windowShape,strides,convertedPad),y=forwardOp(),res=isDilationOne?y:batchToSpaceND2(y,dilation,adjustedCrops);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}function requiredSpaceToBatchPaddings2(inputShape,blockShape,basePadding){let padStart=basePadding.map(b=>b[0]),origPadEnd=basePadding.map(b=>b[1]),fullInputShape=inputShape.concat(padStart,origPadEnd),padEndExtra=blockShape.map((b,i)=>(b-fullInputShape[i]%b)%b),padEnd=origPadEnd.map((s,i)=>s+padEndExtra[i]),paddings=blockShape.map((_,i)=>[padStart[i],padEnd[i]]),crops=blockShape.map((_,i)=>[0,padEndExtra[i]]);return[paddings,crops]}function withSpaceToBatchBasePaddings2(filterShape,dilation){let dilatedFilterShape=filterShape.map((s,i)=>s+(s-1)*(dilation[i]-1)),padExtraShape=dilatedFilterShape.map(s=>s-1),padExtraStart=padExtraShape.map(s=>Math.floor(s/2)),padExtraEnd=padExtraShape.map((s,i)=>s-padExtraStart[i]);return padExtraShape.map((_,i)=>[padExtraStart[i],padExtraEnd[i]])}var pool2=op2({pool_:pool_2});function pow_2(base2,exp14){let $base=convertToTensor2(base2,"base","pow"),$exp=convertToTensor2(exp14,"exp","pow");[$base,$exp]=makeTypesMatch2($base,$exp);let inputs={a:$base,b:$exp},forward=(backend3,save)=>{let y=backend3.pow($base,$exp);return save([$base,$exp,y]),y};return ENGINE2.runKernelFunc(forward,inputs,null,Pow2)}var pow2=op2({pow_:pow_2});function prelu_2(x,alpha){let $x=convertToTensor2(x,"x","prelu"),$alpha=convertToTensor2(alpha,"alpha","prelu"),forward=(backend3,save)=>{let res=backend3.prelu($x,$alpha);return save([$x,$alpha]),res},inputs={x:$x,alpha:$alpha};return ENGINE2.runKernelFunc(forward,inputs,null,Prelu2)}var prelu2=op2({prelu_:prelu_2});function prod_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","prod");$x.dtype==="bool"&&($x=cast2($x,"int32"));let forward=backend3=>{let axes=parseAxisParam2(axis,$x.shape),permutation=getAxesPermutation2(axes,$x.rank),reductionAxes=axes,permutedX=$x;permutation!=null&&(permutedX=transpose2($x,permutation),reductionAxes=getInnerMostAxes2(reductionAxes.length,$x.rank));let value=backend3.prod(permutedX,reductionAxes);if(keepDims){let newShape=expandShapeToKeepDim2(value.shape,axes);value=reshape2(value,newShape)}return value},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Prod2,attrs)}var prod2=op2({prod_:prod_2});function tensor1d2(values,dtype){assertNonNull2(values);let inferredShape=inferShape2(values,dtype);if(inferredShape.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");let shape=null;return makeTensor2(values,shape,inferredShape,dtype)}function range3(start,stop,step9=1,dtype="float32"){if(step9===0)throw new Error("Cannot have a step of zero");let forward=()=>{let sameStartStop=start===stop,increasingRangeNegativeStep=start1;if(sameStartStop||increasingRangeNegativeStep||decreasingRangePositiveStep)return zeros2([0],dtype);let numElements=Math.abs(Math.ceil((stop-start)/step9)),values=makeZerosTypedArray2(numElements,dtype);stop{let res=backend3.reciprocal($x);return save([$x]),res},inputs,null,Reciprocal2)}var reciprocal2=op2({reciprocal_:reciprocal_2});function relu_2(x){let $x=convertToTensor2(x,"x","relu"),forward=(backend3,save)=>(save([$x]),$x.dtype==="bool"?cast2($x,"int32"):backend3.relu($x)),inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Relu3)}var relu2=op2({relu_:relu_2});function relu6_2(x){let $x=convertToTensor2(x,"x","relu6"),forward=(backend3,save)=>(save([$x]),$x.dtype==="bool"?cast2($x,"int32"):backend3.relu6($x)),inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Relu63)}var relu62=op2({relu6_:relu6_2});function reverse_2(x,axis){let $x=convertToTensor2(x,"x","reverse"),forward=backend3=>{let axes=parseAxisParam2(axis,$x.shape);if($x.rank===0)return clone2($x);let res=backend3.reverse($x,axes);return reshape2(res,$x.shape)},inputs={x:$x},attrs={dims:axis};return ENGINE2.runKernelFunc(forward,inputs,null,Reverse2,attrs)}var reverse2=op2({reverse_:reverse_2});function round_2(x){let $x=convertToTensor2(x,"x","round"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.round($x),inputs,null,Round2)}var round3=op2({round_:round_2});function rsqrt_2(x){let $x=convertToTensor2(x,"x","rsqrt"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.rsqrt($x);return save([$x]),res},inputs,null,Rsqrt2)}var rsqrt2=op2({rsqrt_:rsqrt_2});function selu_2(x){let $x=convertToTensor2(x,"x","selu"),forward=(backend3,save)=>{let res=backend3.selu($x);return save([$x]),res},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Selu3)}var selu2=op2({selu_:selu_2});function separableConv2d_2(x,depthwiseFilter,pointwiseFilter,strides,pad7,dilation=[1,1],dataFormat="NHWC"){let $x=convertToTensor2(x,"x","separableConv2d"),$depthwiseFilter=convertToTensor2(depthwiseFilter,"depthwiseFilter","separableConv2d"),$pointwiseFilter=convertToTensor2(pointwiseFilter,"pointwiseFilter","separableConv2d"),x4D=$x,reshapedTo4D=!1;if($x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),dataFormat==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");assert3(x4D.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${x4D.rank}.`),assert3($depthwiseFilter.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${$depthwiseFilter.rank}.`),assert3($pointwiseFilter.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${$depthwiseFilter.rank}.`),assert3($pointwiseFilter.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${$pointwiseFilter.shape[0]}.`),assert3($pointwiseFilter.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${$pointwiseFilter.shape[1]}.`);let inChannels=$depthwiseFilter.shape[2],channelMultiplier=$depthwiseFilter.shape[3];assert3($pointwiseFilter.shape[2]===inChannels*channelMultiplier,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${inChannels*channelMultiplier}, but got ${$pointwiseFilter.shape[2]}.`);let depthwise=depthwiseConv2d6(x4D,$depthwiseFilter,strides,pad7,dataFormat,dilation),pointwiseStride=1,res=conv2d2(depthwise,$pointwiseFilter,pointwiseStride,"valid",dataFormat);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var separableConv2d3=op2({separableConv2d_:separableConv2d_2});function sign_2(x){let $x=convertToTensor2(x,"x","sign"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.sign($x),inputs,null,Sign2)}var sign2=op2({sign_:sign_2});function sin_2(x){let $x=convertToTensor2(x,"x","sin"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sin($x);return save([$x]),res},inputs,null,Sin2)}var sin2=op2({sin_:sin_2});function sinh_2(x){let $x=convertToTensor2(x,"x","sinh"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sinh($x);return save([$x]),res},inputs,null,Sinh2)}var sinh2=op2({sinh_:sinh_2});function softmax_2(logits,dim=-1){let $logits=convertToTensor2(logits,"logits","softmax","float32");if(dim===-1&&(dim=$logits.rank-1),dim!==$logits.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${$logits.rank} and dim was ${dim}`);let inputs={logits:$logits},attrs={dim};return ENGINE2.runKernelFunc((backend3,save)=>{let y=backend3.softmax($logits,dim);return save([y]),y},inputs,null,Softmax4,attrs)}var softmax2=op2({softmax_:softmax_2});function fft_2(input2){assert3(input2.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${input2.dtype}.`);let inputs={input:input2};return ENGINE2.runKernelFunc(backend3=>{let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,input2D=input2.as2D(batch,innerDimensionSize),result=backend3.fft(input2D);return result.reshape(input2.shape)},inputs,null,FFT2)}var fft2=op2({fft_:fft_2});function ifft_2(input2){assert3(input2.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${input2.dtype}.`);let inputs={input:input2};return ENGINE2.runKernelFunc(backend3=>{let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,input2D=reshape2(input2,[batch,innerDimensionSize]),result=backend3.ifft(input2D);return reshape2(result,input2.shape)},inputs,null,IFFT2)}var ifft2=op2({ifft_:ifft_2});function irfft_2(input2){let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,ret;if(innerDimensionSize<=2){let complexInput=reshape2(input2,[batch,innerDimensionSize]);ret=ifft2(complexInput)}else{let outputShape=[batch,2*(innerDimensionSize-1)],realInput=reshape2(real2(input2),[batch,innerDimensionSize]),imagInput=reshape2(imag2(input2),[batch,innerDimensionSize]),realConjugate=reverse2(slice2(realInput,[0,1],[batch,innerDimensionSize-2]),1),imagConjugate=mul2(reverse2(slice2(imagInput,[0,1],[batch,innerDimensionSize-2]),1),scalar2(-1)),r=concat2([realInput,realConjugate],1),i=concat2([imagInput,imagConjugate],1),complexInput=reshape2(complex2(r,i),[outputShape[0],outputShape[1]]);ret=ifft2(complexInput)}if(ret=real2(ret),input2.rank===3&&input2.shape[0]!==0){let temp=ret,batch2=input2.shape[0];ret=reshape2(ret,[batch2,ret.shape[0]/batch2,ret.shape[1]]),temp.dispose()}return ret}var irfft2=op2({irfft_:irfft_2});function prepareSplitSize2(x,numOrSizeSplits,axis=0){let splitSizes=[];if(typeof numOrSizeSplits=="number")assert3(x.shape[axis]%numOrSizeSplits===0,()=>"Number of splits must evenly divide the axis."),splitSizes=new Array(numOrSizeSplits).fill(x.shape[axis]/numOrSizeSplits);else{let numOfNegs=numOrSizeSplits.reduce((count2,value)=>(value===-1&&(count2+=1),count2),0);assert3(numOfNegs<=1,()=>"There should be only one negative value in split array.");let negIndex=numOrSizeSplits.indexOf(-1);if(negIndex!==-1){let total=numOrSizeSplits.reduce((a,b)=>b>0?a+b:a);numOrSizeSplits[negIndex]=x.shape[axis]-total}assert3(x.shape[axis]===numOrSizeSplits.reduce((a,b)=>a+b),()=>"The sum of sizes must match the size of the axis dimension."),splitSizes=numOrSizeSplits}return splitSizes}function split_2(x,numOrSizeSplits,axis=0){let $x=convertToTensor2(x,"x","split"),forward=(backend3,_)=>{let $axis=parseAxisParam2(axis,$x.shape)[0],splitSizes=prepareSplitSize2($x,numOrSizeSplits,$axis);return backend3.split($x,splitSizes,$axis)},inputs={x:$x},attr={numOrSizeSplits,axis};return ENGINE2.runKernelFunc(forward,inputs,null,SplitV2,attr)}var split2=op2({split_:split_2});function rfft_2(input2,fftLength){assert3(input2.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${input2.dtype}`);let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,adjustedInput;if(fftLength!=null&&fftLength0),size=input2.shape.map(v=>v);size[input2.shape.length-1]=fftLength,adjustedInput=slice2(input2,begin,size),innerDimensionSize=fftLength}else if(fftLength!=null&&fftLength>innerDimensionSize){let zerosShape=input2.shape.map(v=>v);zerosShape[input2.shape.length-1]=fftLength-innerDimensionSize,adjustedInput=concat2([input2,zeros2(zerosShape)],input2.shape.length-1),innerDimensionSize=fftLength}else adjustedInput=input2;let zerosInput=zerosLike3(adjustedInput),complexInput=reshape2(complex2(adjustedInput,zerosInput),[batch,innerDimensionSize]),ret=fft2(complexInput),half=Math.floor(innerDimensionSize/2)+1,realValues=real2(ret),imagValues=imag2(ret),realComplexConjugate=split2(realValues,[half,innerDimensionSize-half],realValues.shape.length-1),imagComplexConjugate=split2(imagValues,[half,innerDimensionSize-half],imagValues.shape.length-1),outputShape=adjustedInput.shape.slice();return outputShape[adjustedInput.shape.length-1]=half,reshape2(complex2(realComplexConjugate[0],imagComplexConjugate[0]),outputShape)}var rfft2=op2({rfft_:rfft_2});function sqrt_2(x){let $x=convertToTensor2(x,"x","sqrt"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sqrt($x);return save([$x]),res},inputs,null,Sqrt2)}var sqrt2=op2({sqrt_:sqrt_2});function squaredDifference_2(a,b){let $a=convertToTensor2(a,"a","squaredDifference"),$b=convertToTensor2(b,"b","squaredDifference");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.squaredDifference($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b},attrs={};return ENGINE2.runKernelFunc(forward,inputs,null,SquaredDifference2,attrs)}var squaredDifference4=op2({squaredDifference_:squaredDifference_2});function squeeze_2(x,axis){let $x=convertToTensor2(x,"x","squeeze");return reshape2($x,squeezeShape2($x.shape,axis).newShape)}var squeeze2=op2({squeeze_:squeeze_2});function stack_2(tensors,axis=0){let $tensors=convertToTensorArray2(tensors,"tensors","stack");if(assert3($tensors.length>=1,()=>"Pass at least one tensor to tf.stack"),$tensors.length===1)return expandDims3($tensors[0],axis);let rank=$tensors[0].rank,shape=$tensors[0].shape,dtype=$tensors[0].dtype;assert3(axis<=rank,()=>"Axis must be <= rank of the tensor"),$tensors.forEach(t=>{assertShapesMatch2(shape,t.shape,"All tensors passed to stack must have matching shapes"),assert3(dtype===t.dtype,()=>"All tensors passed to stack must have matching dtypes")});let expandedTensors=$tensors.map(t=>expandDims3(t,axis));return concat2(expandedTensors,axis)}var stack2=op2({stack_:stack_2});function step_2(x,alpha=0){let $x=convertToTensor2(x,"x","step"),inputs={x:$x},attrs={alpha};return ENGINE2.runKernelFunc(backend3=>backend3.step($x,alpha),inputs,null,Step2,attrs)}var step2=op2({step_:step_2});function stridedSlice_2(x,begin,end,strides,beginMask=0,endMask=0,ellipsisMask=0,newAxisMask=0,shrinkAxisMask=0){let $x=convertToTensor2(x,"x","stridedSlice"),forward=backend3=>{strides==null&&(strides=new Array(begin.length));let ellipsisAxes=maskToAxes2(ellipsisMask);if(ellipsisAxes.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(ellipsisMask!==0&&newAxisMask!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(ellipsisMask!==0&&shrinkAxisMask!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let numInterpolatedAxes=$x.rank-begin.length,expandAxes=maskToAxes2(newAxisMask),newShape=$x.shape.slice();expandAxes.forEach(axis=>{begin[axis]=0,end[axis]=1,newShape.splice(axis,0,1)}),$x=reshape2($x,newShape);let{begin:normalizedBegin,end:normalizedEnd,strides:normalizedStrides}=getNormalizedAxes2($x.shape,ellipsisAxes,numInterpolatedAxes,begin,end,strides,beginMask,endMask,ellipsisMask);begin=normalizedBegin,end=normalizedEnd,strides=normalizedStrides;let shrinkAxes=maskToAxes2(shrinkAxisMask);shrinkAxes.forEach(axis=>{end[axis]=begin[axis]+1,strides[axis]=1});let size=computeOutShape5(begin,end,strides),outShape=size.filter((_,axis)=>shrinkAxes.indexOf(axis)===-1),nonStrided=strides.every(v=>v===1);if(nonStrided)return reshape2(slice2($x,begin,size),outShape);let res=backend3.stridedSlice($x,begin,end,strides);return reshape2(res,outShape)},inputs={x:$x},attrs={begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask};return ENGINE2.runKernelFunc(forward,inputs,null,StridedSlice2,attrs)}var stridedSlice3=op2({stridedSlice_:stridedSlice_2});function tan_2(x){let $x=convertToTensor2(x,"x","tan"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.tan($x);return save([$x]),res},inputs,null,Tan2)}var tan2=op2({tan_:tan_2});function tensor2d2(values,shape,dtype){if(assertNonNull2(values),shape!=null&&shape.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let inferredShape=inferShape2(values,dtype);if(inferredShape.length!==2&&inferredShape.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(inferredShape.length===1&&shape==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return makeTensor2(values,shape,inferredShape,dtype)}function topk_2(x,k=1,sorted=!0){let $x=convertToTensor2(x,"x","topk");if($x.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let lastDim=$x.shape[$x.shape.length-1];if(k>lastDim)throw new Error(`'k' passed to topk() must be <= the last dimension (${lastDim}) but got ${k}`);let inputs={x:$x},attrs={k,sorted},[values,indices]=ENGINE2.runKernelFunc(b=>b.topk($x,k,sorted),inputs,null,TopK2,attrs);return{values,indices}}var topk2=op2({topk_:topk_2});function unique_2(x,axis=0){let $x=convertToTensor2(x,"x","unique",null);assert3($x.rank>0,()=>"The input tensor must be at least 1D");let inputs={x:$x},attrs={axis},[values,indices]=ENGINE2.runKernel(Unique2,inputs,attrs);return{values,indices}}var unique2=op2({unique_:unique_2});function unsortedSegmentSum_2(x,segmentIds,numSegments){let $x=convertToTensor2(x,"x","unsortedSegmentSum"),$segmentIds=convertToTensor2(segmentIds,"segmentIds","unsortedSegmentSum","int32");assert3(isInt2(numSegments),()=>"numSegments must be of dtype int");let inputs={x:$x,segmentIds:$segmentIds},attrs={numSegments},forward=(backend3,save)=>{let res=backend3.unsortedSegmentSum($x,$segmentIds,numSegments);return save([$segmentIds]),res};return ENGINE2.runKernelFunc(forward,inputs,null,UnsortedSegmentSum2,attrs)}var unsortedSegmentSum2=op2({unsortedSegmentSum_:unsortedSegmentSum_2});function unstack_2(x,axis=0){let $x=convertToTensor2(x,"x","unstack");assert3(axis>=-$x.shape.length&&axis<$x.shape.length,()=>`Axis = ${axis} is not in [-${$x.shape.length}, ${$x.shape.length})`),axis<0&&(axis+=$x.shape.length);let inputs={value:$x},attrs={axis},forward=backend3=>backend3.unstack($x,axis);return ENGINE2.runKernelFunc(forward,inputs,null,Unpack2,attrs)}var unstack2=op2({unstack_:unstack_2});function notEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","notEqualStrict"),$b=convertToTensor2(b,"b","notEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in notEqualStrict: "),notEqual4($a,$b)}function lessStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","lessStrict"),$b=convertToTensor2(b,"b","lessStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in lessStrict: "),less2($a,$b)}function equalStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","equalStrict"),$b=convertToTensor2(b,"b","equalStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in equalStrict: "),equal2($a,$b)}function lessEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","lessEqualStrict"),$b=convertToTensor2(b,"b","lessEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in lessEqualStrict: "),lessEqual2($a,$b)}function greaterStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","greaterStrict"),$b=convertToTensor2(b,"b","greaterStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in greaterStrict: "),greater2($a,$b)}function greaterEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","greaterEqualStrict"),$b=convertToTensor2(b,"b","greaterEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in greaterEqualStrict: "),greaterEqual2($a,$b)}var equalStrict2=op2({equalStrict_:equalStrict_2}),greaterEqualStrict2=op2({greaterEqualStrict_:greaterEqualStrict_2}),greaterStrict2=op2({greaterStrict_:greaterStrict_2}),lessEqualStrict2=op2({lessEqualStrict_:lessEqualStrict_2}),lessStrict2=op2({lessStrict_:lessStrict_2}),notEqualStrict2=op2({notEqualStrict_:notEqualStrict_2});function addStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","addStrict"),$b=convertToTensor2(b,"b","addStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in addStrict: "),add4($a,$b)}function subStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","subStrict"),$b=convertToTensor2(b,"b","subStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in subStrict: "),sub2($a,$b)}function powStrict_2(base2,exp14){return deprecationWarn2("strict variants of ops have been deprecated and will be removed in future"),assertShapesMatch2(base2.shape,exp14.shape,"Error in powStrict: "),pow2(base2,exp14)}function mulStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","mul"),$b=convertToTensor2(b,"b","mul");return assertShapesMatch2($a.shape,$b.shape,"Error in multiplyStrict: "),mul2($a,$b)}function divStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","div"),$b=convertToTensor2(b,"b","div");return assertShapesMatch2($a.shape,$b.shape,"Error in divideStrict: "),div2($a,$b)}function modStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","modStrict"),$b=convertToTensor2(b,"b","modStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in modStrict: "),mod2($a,$b)}function minimumStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","minimumStrict"),$b=convertToTensor2(b,"b","minimumStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in minimumStrict: "),minimum2($a,$b)}function maximumStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","maximumStrict"),$b=convertToTensor2(b,"b","maximumStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in maximumStrict: "),maximum2($a,$b)}function squaredDifferenceStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","squaredDifferenceStrict"),$b=convertToTensor2(b,"b","squaredDifferenceStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in squaredDifferenceStrict: "),squaredDifference4($a,$b)}var addStrict2=op2({addStrict_:addStrict_2}),divStrict2=op2({divStrict_:divStrict_2}),maximumStrict2=op2({maximumStrict_:maximumStrict_2}),minimumStrict2=op2({minimumStrict_:minimumStrict_2}),modStrict2=op2({modStrict_:modStrict_2}),mulStrict2=op2({mulStrict_:mulStrict_2}),powStrict2=op2({powStrict_:powStrict_2}),squaredDifferenceStrict2=op2({squaredDifferenceStrict_:squaredDifferenceStrict_2}),subStrict2=op2({subStrict_:subStrict_2});function norm_2(x,ord="euclidean",axis=null,keepDims=!1){x=convertToTensor2(x,"x","norm");let norm6=normImpl2(x,ord,axis),keepDimsShape=norm6.shape;if(keepDims){let axes=parseAxisParam2(axis,x.shape);keepDimsShape=expandShapeToKeepDim2(norm6.shape,axes)}return reshape2(norm6,keepDimsShape)}function normImpl2(x,p2,axis=null){if(x.rank===0)return abs2(x);if(x.rank!==1&&axis===null)return normImpl2(reshape2(x,[-1]),p2,axis);if(x.rank===1||typeof axis=="number"||Array.isArray(axis)&&axis.length===1){if(p2===1)return sum3(abs2(x),axis);if(p2===Infinity)return max2(abs2(x),axis);if(p2===-Infinity)return min2(abs2(x),axis);if(p2==="euclidean"||p2===2)return sqrt2(sum3(pow2(abs2(x),scalar2(2,"int32")),axis));throw new Error(`Error in norm: invalid ord value: ${p2}`)}if(Array.isArray(axis)&&axis.length===2){if(p2===1)return max2(sum3(abs2(x),axis[0]),axis[1]-1);if(p2===Infinity)return max2(sum3(abs2(x),axis[1]),axis[0]);if(p2===-Infinity)return min2(sum3(abs2(x),axis[1]),axis[0]);if(p2==="fro"||p2==="euclidean")return sqrt2(sum3(square2(x),axis));throw new Error(`Error in norm: invalid ord value: ${p2}`)}throw new Error(`Error in norm: invalid axis: ${axis}`)}var norm2=op2({norm_:norm_2});function enclosingPowerOfTwo2(value){return Math.floor(Math.pow(2,Math.ceil(Math.log(value)/Math.log(2))))}function cosineWindow2(windowLength,a,b){let even=1-windowLength%2,newValues=new Float32Array(windowLength);for(let i=0;i`Error in conv2dDerFilter: input must be rank 4, but got shape ${x4D.shape}.`),assert3(dy4D.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${dy4D.shape}.`),assert3(filterShape.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${filterShape}.`);let inDepth=dataFormat==="NHWC"?x4D.shape[3]:x4D.shape[1],outDepth=dataFormat==="NHWC"?dy4D.shape[3]:dy4D.shape[1];assert3(inDepth===filterShape[2],()=>`Error in conv2dDerFilter: depth of input ${inDepth}) must match input depth in filter (${filterShape[2]}.`),assert3(outDepth===filterShape[3],()=>`Error in conv2dDerFilter: depth of dy (${outDepth}) must match output depth for filter (${filterShape[3]}).`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let dilations=1,$dataFormat=convertConv2DDataFormat2(dataFormat),convInfo=computeConv2DInfo2(x4D.shape,filterShape,strides,dilations,pad7,dimRoundingMode,!1,$dataFormat);return backend3.conv2dDerFilter(x4D,dy4D,convInfo)},inputs={x:x4D,dy:dy4D},attrs={strides,pad:pad7,dataFormat,dimRoundingMode,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,Conv2DBackpropFilter2,attrs)}var conv2DBackpropFilter3=op2({conv2DBackpropFilter_:conv2DBackpropFilter_2});function depthwiseConv2dNativeBackpropFilter_2(x,dy,filterShape,strides,pad7,dilations=[1,1],dimRoundingMode){let x4D=x;x.rank===3&&(x4D=reshape2(x,[1,x.shape[0],x.shape[1],x.shape[2]]));let dy4D=dy;dy4D.rank===3&&(dy4D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2]]));let forward=backend3=>{let convInfo=computeConv2DInfo2(x.shape,filterShape,strides,dilations,pad7,dimRoundingMode,!0);return backend3.depthwiseConv2DDerFilter(x4D,dy4D,convInfo)},inputs={x:x4D,dy:dy4D},attrs={strides,pad:pad7,dimRoundingMode,dilations,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNativeBackpropFilter2,attrs)}var depthwiseConv2dNativeBackpropFilter3=op2({depthwiseConv2dNativeBackpropFilter_:depthwiseConv2dNativeBackpropFilter_2});function depthwiseConv2dNativeBackpropInput_2(xShape,dy,filter,strides,pad7,dilations=[1,1],dimRoundingMode){let dy4D=dy,reshapedTo4D=!1;dy.rank===3&&(reshapedTo4D=!0,dy4D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2]]));let forward=backend3=>{let convInfo=computeConv2DInfo2(xShape,filter.shape,strides,dilations,pad7,dimRoundingMode,!0);return backend3.depthwiseConv2DDerInput(dy4D,filter,convInfo)},inputs={dy:dy4D,filter},attrs={strides,pad:pad7,dimRoundingMode,dilations,inputShape:xShape},res=ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNativeBackpropInput2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var depthwiseConv2dNativeBackpropInput3=op2({depthwiseConv2dNativeBackpropInput_:depthwiseConv2dNativeBackpropInput_2});function hammingWindow_2(windowLength){return cosineWindow2(windowLength,.54,.46)}var hammingWindow2=op2({hammingWindow_:hammingWindow_2});function hannWindow_2(windowLength){return cosineWindow2(windowLength,.5,.5)}var hannWindow2=op2({hannWindow_:hannWindow_2});function frame_2(signal3,frameLength,frameStep,padEnd=!1,padValue=0){let start=0,output=[];for(;start+frameLength<=signal3.size;)output.push(slice2(signal3,start,frameLength)),start+=frameStep;if(padEnd)for(;start`Error in cropAndResize: image must be rank 4,but got rank ${$image.rank}.`),assert3($boxes.rank===2&&$boxes.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${numBoxes},4] but had shape ${$boxes.shape}.`),assert3($boxInd.rank===1&&$boxInd.shape[0]===numBoxes,()=>`Error in cropAndResize: boxInd must be have size [${numBoxes}] but had shape ${$boxes.shape}.`),assert3(cropSize.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${cropSize.length}.`),assert3(cropSize[0]>=1&&cropSize[1]>=1,()=>`cropSize must be atleast [1,1], but was ${cropSize}`),assert3(method==="bilinear"||method==="nearest",()=>`method must be bilinear or nearest, but was ${method}`);let forward=backend3=>backend3.cropAndResize($image,$boxes,$boxInd,cropSize,method,extrapolationValue),inputs={image:$image,boxes:$boxes,boxInd:$boxInd},attrs={method,extrapolationValue,cropSize},res=ENGINE2.runKernelFunc(forward,inputs,null,CropAndResize2,attrs);return res}var cropAndResize3=op2({cropAndResize_:cropAndResize_2});function flipLeftRight_2(image3){let $image=convertToTensor2(image3,"image","flipLeftRight","float32");assert3($image.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${$image.rank}.`);let inputs={image:$image},res=ENGINE2.runKernel(FlipLeftRight2,inputs,{});return res}var flipLeftRight3=op2({flipLeftRight_:flipLeftRight_2});function rotateWithOffset_2(image3,radians,fillValue=0,center=.5){let $image=convertToTensor2(image3,"image","rotateWithOffset","float32");assert3($image.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${$image.rank}.`);let inputs={image:$image},attrs={radians,fillValue,center},res=ENGINE2.runKernel(RotateWithOffset2,inputs,attrs);return res}var rotateWithOffset3=op2({rotateWithOffset_:rotateWithOffset_2});function nonMaxSuppSanityCheck2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma){iouThreshold==null&&(iouThreshold=.5),scoreThreshold==null&&(scoreThreshold=Number.NEGATIVE_INFINITY),softNmsSigma==null&&(softNmsSigma=0);let numBoxes=boxes.shape[0];return maxOutputSize=Math.min(maxOutputSize,numBoxes),assert3(0<=iouThreshold&&iouThreshold<=1,()=>`iouThreshold must be in [0, 1], but was '${iouThreshold}'`),assert3(boxes.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${boxes.rank}'`),assert3(boxes.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${boxes.shape[1]}`),assert3(scores.rank===1,()=>"scores must be a 1D tensor"),assert3(scores.shape[0]===numBoxes,()=>`scores has incompatible shape with boxes. Expected ${numBoxes}, but was ${scores.shape[0]}`),assert3(0<=softNmsSigma&&softNmsSigma<=1,()=>`softNmsSigma must be in [0, 1], but was '${softNmsSigma}'`),{maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma}}function nonMaxSuppression_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),inputs=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold);maxOutputSize=inputs.maxOutputSize,iouThreshold=inputs.iouThreshold,scoreThreshold=inputs.scoreThreshold;let attrs={maxOutputSize,iouThreshold,scoreThreshold};return ENGINE2.runKernelFunc(b=>b.nonMaxSuppression($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold),{boxes:$boxes,scores:$scores},null,NonMaxSuppressionV32,attrs)}var nonMaxSuppression3=op2({nonMaxSuppression_:nonMaxSuppression_2});function binaryInsert2(arr,element,comparator){let index=binarySearch2(arr,element,comparator),insertionPoint=index<0?-(index+1):index;arr.splice(insertionPoint,0,element)}function binarySearch2(arr,target,comparator){return binarySearch_2(arr,target,comparator||defaultComparator2)}function defaultComparator2(a,b){return a>b?1:a>>1);let compareResult=comparator(target,arr[middle]);compareResult>0?left=middle+1:(right=middle,found=!compareResult)}return found?left:-left-1}function nonMaxSuppressionV3Impl3(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,0).selectedIndices}function nonMaxSuppressionV4Impl4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,padToMaxOutputSize){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,0,!1,padToMaxOutputSize,!0)}function nonMaxSuppressionV5Impl4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma,!0)}function nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma,returnScoresTensor=!1,padToMaxOutputSize=!1,returnValidOutputs=!1){let candidates=[];for(let i=0;iscoreThreshold&&candidates.push({score:scores[i],boxIndex:i,suppressBeginIndex:0});candidates.sort(ascendingComparator2);let scale3=softNmsSigma>0?-.5/softNmsSigma:0,selectedIndices=[],selectedScores=[];for(;selectedIndices.length0;){let candidate=candidates.pop(),{score:originalScore,boxIndex,suppressBeginIndex}=candidate;if(originalScore=suppressBeginIndex;--j){let iou3=intersectionOverUnion2(boxes,boxIndex,selectedIndices[j]);if(iou3>=iouThreshold){ignoreCandidate=!0;break}if(candidate.score=candidate.score*suppressWeight2(iouThreshold,scale3,iou3),candidate.score<=scoreThreshold)break}candidate.suppressBeginIndex=selectedIndices.length,ignoreCandidate||(candidate.score===originalScore?(selectedIndices.push(boxIndex),selectedScores.push(candidate.score)):candidate.score>scoreThreshold&&binaryInsert2(candidates,candidate,ascendingComparator2))}let validOutputs=selectedIndices.length,elemsToPad=maxOutputSize-validOutputs;padToMaxOutputSize&&elemsToPad>0&&(selectedIndices.push(...new Array(elemsToPad).fill(0)),selectedScores.push(...new Array(elemsToPad).fill(0)));let result={selectedIndices:tensor1d2(selectedIndices,"int32")};return returnScoresTensor&&(result.selectedScores=tensor1d2(selectedScores,"float32")),returnValidOutputs&&(result.validOutputs=scalar2(validOutputs,"int32")),result}function intersectionOverUnion2(boxes,i,j){let iCoord=boxes.subarray(i*4,i*4+4),jCoord=boxes.subarray(j*4,j*4+4),yminI=Math.min(iCoord[0],iCoord[2]),xminI=Math.min(iCoord[1],iCoord[3]),ymaxI=Math.max(iCoord[0],iCoord[2]),xmaxI=Math.max(iCoord[1],iCoord[3]),yminJ=Math.min(jCoord[0],jCoord[2]),xminJ=Math.min(jCoord[1],jCoord[3]),ymaxJ=Math.max(jCoord[0],jCoord[2]),xmaxJ=Math.max(jCoord[1],jCoord[3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function suppressWeight2(iouThreshold,scale3,iou3){let weight=Math.exp(scale3*iou3*iou3);return iou3<=iouThreshold?weight:0}function ascendingComparator2(c1,c2){return c1.score-c2.score||c1.score===c2.score&&c2.boxIndex-c1.boxIndex}async function nonMaxSuppressionAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),inputs=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold);maxOutputSize=inputs.maxOutputSize,iouThreshold=inputs.iouThreshold,scoreThreshold=inputs.scoreThreshold;let boxesAndScores=await Promise.all([$boxes.data(),$scores.data()]),boxesVals=boxesAndScores[0],scoresVals=boxesAndScores[1],res=nonMaxSuppressionV3Impl3(boxesVals,scoresVals,maxOutputSize,iouThreshold,scoreThreshold);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionAsync2=nonMaxSuppressionAsync_2;function nonMaxSuppressionWithScore_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,softNmsSigma=0){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);maxOutputSize=params.maxOutputSize,iouThreshold=params.iouThreshold,scoreThreshold=params.scoreThreshold,softNmsSigma=params.softNmsSigma;let inputs={boxes:$boxes,scores:$scores},attrs={maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma},result=ENGINE2.runKernel(NonMaxSuppressionV52,inputs,attrs);return{selectedIndices:result[0],selectedScores:result[1]}}var nonMaxSuppressionWithScore2=op2({nonMaxSuppressionWithScore_:nonMaxSuppressionWithScore_2});async function nonMaxSuppressionWithScoreAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,softNmsSigma=0){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);maxOutputSize=params.maxOutputSize,iouThreshold=params.iouThreshold,scoreThreshold=params.scoreThreshold,softNmsSigma=params.softNmsSigma;let boxesAndScores=await Promise.all([$boxes.data(),$scores.data()]),boxesVals=boxesAndScores[0],scoresVals=boxesAndScores[1],res=nonMaxSuppressionV5Impl4(boxesVals,scoresVals,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionWithScoreAsync2=nonMaxSuppressionWithScoreAsync_2;function nonMaxSuppressionPadded_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,padToMaxOutputSize=!1){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,null),$maxOutputSize=params.maxOutputSize,$iouThreshold=params.iouThreshold,$scoreThreshold=params.scoreThreshold,inputs={boxes:$boxes,scores:$scores},attrs={maxOutputSize:$maxOutputSize,iouThreshold:$iouThreshold,scoreThreshold:$scoreThreshold,padToMaxOutputSize},result=ENGINE2.runKernel(NonMaxSuppressionV42,inputs,attrs);return{selectedIndices:result[0],validOutputs:result[1]}}var nonMaxSuppressionPadded2=op2({nonMaxSuppressionPadded_:nonMaxSuppressionPadded_2});async function nonMaxSuppressionPaddedAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,padToMaxOutputSize=!1){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,null),$maxOutputSize=params.maxOutputSize,$iouThreshold=params.iouThreshold,$scoreThreshold=params.scoreThreshold,[boxesVals,scoresVals]=await Promise.all([$boxes.data(),$scores.data()]),res=nonMaxSuppressionV4Impl4(boxesVals,scoresVals,$maxOutputSize,$iouThreshold,$scoreThreshold,padToMaxOutputSize);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionPaddedAsync2=nonMaxSuppressionPaddedAsync_2;function resizeBilinear_2(images,size,alignCorners=!1){let $images=convertToTensor2(images,"images","resizeBilinear");assert3($images.rank===3||$images.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${$images.rank}.`),assert3(size.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${size}.`);let batchImages=$images,reshapedTo4D=!1;$images.rank===3&&(reshapedTo4D=!0,batchImages=reshape2($images,[1,$images.shape[0],$images.shape[1],$images.shape[2]]));let[newHeight,newWidth]=size,forward=(backend3,save)=>(save([batchImages]),backend3.resizeBilinear(batchImages,newHeight,newWidth,alignCorners)),inputs={images:batchImages},attrs={alignCorners,size},res=ENGINE2.runKernelFunc(forward,inputs,null,ResizeBilinear2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var resizeBilinear3=op2({resizeBilinear_:resizeBilinear_2});function resizeNearestNeighbor_2(images,size,alignCorners=!1){let $images=convertToTensor2(images,"images","resizeNearestNeighbor");assert3($images.rank===3||$images.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${$images.rank}.`),assert3(size.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${size}.`),assert3($images.dtype==="float32"||$images.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let batchImages=$images,reshapedTo4D=!1;$images.rank===3&&(reshapedTo4D=!0,batchImages=reshape2($images,[1,$images.shape[0],$images.shape[1],$images.shape[2]]));let[newHeight,newWidth]=size,inputs={images:batchImages},attrs={alignCorners,size},forward=(backend3,save)=>(save([batchImages]),backend3.resizeNearestNeighbor(batchImages,newHeight,newWidth,alignCorners)),res=ENGINE2.runKernelFunc(forward,inputs,null,ResizeNearestNeighbor2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var resizeNearestNeighbor2=op2({resizeNearestNeighbor_:resizeNearestNeighbor_2});function bandPart_2(a,numLower,numUpper){assert3(numLower%1===0,()=>`bandPart(): numLower must be an integer, got ${numLower}.`),assert3(numUpper%1===0,()=>`bandPart(): numUpper must be an integer, got ${numUpper}.`);let $a=convertToTensor2(a,"a","bandPart");assert3($a.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${$a.rank}.`);let shape=$a.shape,[M,N]=$a.shape.slice(-2);if(!(numLower<=M))throw new Error(`bandPart(): numLower (${numLower}) must not be greater than the number of rows (${M}).`);if(!(numUpper<=N))throw new Error(`bandPart(): numUpper (${numUpper}) must not be greater than the number of columns (${N}).`);numLower<0&&(numLower=M),numUpper<0&&(numUpper=N);let i=reshape2(range3(0,M,1,"int32"),[-1,1]),j=range3(0,N,1,"int32"),ij=sub2(i,j),inBand=logicalAnd2(lessEqual2(ij,scalar2(+numLower,"int32")),greaterEqual2(ij,scalar2(-numUpper,"int32"))),zero=zeros2([M,N],$a.dtype);return reshape2(stack2(unstack2(reshape2($a,[-1,M,N])).map(mat=>where2(inBand,mat,zero))),shape)}var bandPart2=op2({bandPart_:bandPart_2});function gramSchmidt_2(xs){let inputIsTensor2D;if(Array.isArray(xs)){inputIsTensor2D=!1,assert3(xs!=null&&xs.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let dim=xs[0].shape[0];for(let i=1;i`Gram-Schmidt: Non-unique lengths found in the input vectors: (${xs[i].shape[0]} vs. ${dim})`)}else inputIsTensor2D=!0,xs=split2(xs,xs.shape[0],0).map(x=>squeeze2(x,[0]));assert3(xs.length<=xs[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${xs.length}) exceeds number of dimensions (${xs[0].shape[0]}).`);let ys=[],xs1d=xs;for(let i=0;i{let x=xs1d[i];if(i>0)for(let j=0;j=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${x.rank}`),x.rank===2)return qr2d2(x,fullMatrices);{let outerDimsProd=x.shape.slice(0,x.shape.length-2).reduce((value,prev)=>value*prev),x2ds=unstack2(reshape2(x,[outerDimsProd,x.shape[x.shape.length-2],x.shape[x.shape.length-1]]),0),q2ds=[],r2ds=[];x2ds.forEach(x2d=>{let[q2d,r2d]=qr2d2(x2d,fullMatrices);q2ds.push(q2d),r2ds.push(r2d)});let q=reshape2(stack2(q2ds,0),x.shape),r=reshape2(stack2(r2ds,0),x.shape);return[q,r]}}function qr2d2(x,fullMatrices=!1){return ENGINE2.tidy(()=>{assert3(x.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${x.shape.length}D Tensor.`);let m=x.shape[0],n=x.shape[1],q=eye2(m),r=clone2(x),one2D=tensor2d2([[1]],[1,1]),w=clone2(one2D),iters=m>=n?n:m;for(let j=0;j{let rjEnd1=slice2(r,[j,j],[m-j,1]),normX=norm2(rjEnd1),rjj=slice2(r,[j,j],[1,1]),s=where2(greater2(rjj,0),tensor2d2([[-1]]),tensor2d2([[1]])),u1=sub2(rjj,mul2(s,normX)),wPre=div2(rjEnd1,u1);wPre.shape[0]===1?w=clone2(one2D):w=concat2([one2D,slice2(wPre,[1,0],[wPre.shape[0]-1,wPre.shape[1]])],0);let tau=neg2(div2(matMul3(s,u1),normX)),rjEndAll=slice2(r,[j,0],[m-j,n]),tauTimesW=mul2(tau,w),wT=transpose2(w);if(j===0)r=sub2(rjEndAll,matMul3(tauTimesW,matMul3(wT,rjEndAll)));else{let rTimesTau=sub2(rjEndAll,matMul3(tauTimesW,matMul3(wT,rjEndAll)));r=concat2([slice2(r,[0,0],[j,n]),rTimesTau],0)}let tawTimesWT=transpose2(tauTimesW),qAllJEnd=slice2(q,[0,j],[m,q.shape[1]-j]);if(j===0)q=sub2(qAllJEnd,matMul3(matMul3(qAllJEnd,w),tawTimesWT));else{let qTimesTau=sub2(qAllJEnd,matMul3(matMul3(qAllJEnd,w),tawTimesWT));q=concat2([slice2(q,[0,0],[m,j]),qTimesTau],1)}return[w,r,q]}),dispose2([rTemp,wTemp,qTemp])}return!fullMatrices&&m>n&&(q=slice2(q,[0,0],[m,n]),r=slice2(r,[0,0],[n,n])),[q,r]})}var qr2=op2({qr_:qr_2});var Reduction2;(function(Reduction3){Reduction3[Reduction3.NONE=0]="NONE",Reduction3[Reduction3.MEAN=1]="MEAN",Reduction3[Reduction3.SUM=2]="SUM",Reduction3[Reduction3.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(Reduction2||(Reduction2={}));function computeWeightedLoss_2(losses3,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $losses=convertToTensor2(losses3,"losses","computeWeightedLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","computeWeightedLoss"));let weightedLoss=$weights==null?$losses:mul2($losses,$weights);if(reduction===Reduction2.NONE)return weightedLoss;if(reduction===Reduction2.SUM)return sum3(weightedLoss);if(reduction===Reduction2.MEAN){if($weights==null)return mean2(weightedLoss);{let broadcastFactor=$losses.size/$weights.size,result=div2(sum3(weightedLoss),sum3($weights));return broadcastFactor>1?div2(result,scalar2(broadcastFactor)):result}}if(reduction===Reduction2.SUM_BY_NONZERO_WEIGHTS){if($weights==null)return div2(sum3(weightedLoss),scalar2($losses.size));{let broadcastedWeights=mul2($weights,ones4($losses.shape)),numNonZeros=cast2(sum3(notEqual4(broadcastedWeights,scalar2(0))),"float32");return div2(sum3(weightedLoss),numNonZeros)}}throw Error(`Unknown reduction: ${reduction}`)}var computeWeightedLoss3=op2({computeWeightedLoss_:computeWeightedLoss_2});function absoluteDifference_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","absoluteDifference"),$predictions=convertToTensor2(predictions,"predictions","absoluteDifference"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","absoluteDifference")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in absoluteDifference: ");let losses3=abs2(sub2($labels,$predictions));return computeWeightedLoss3(losses3,$weights,reduction)}var absoluteDifference2=op2({absoluteDifference_:absoluteDifference_2});function cosineDistance_2(labels,predictions,axis,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","cosineDistance"),$predictions=convertToTensor2(predictions,"predictions","cosineDistance"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","cosineDistance")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in cosineDistance: ");let one=scalar2(1),losses3=sub2(one,sum3(mul2($labels,$predictions),axis,!0));return computeWeightedLoss3(losses3,$weights,reduction)}var cosineDistance2=op2({cosineDistance_:cosineDistance_2});function hingeLoss_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","hingeLoss"),$predictions=convertToTensor2(predictions,"predictions","hingeLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","hingeLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in hingeLoss: ");let one=scalar2(1);$labels=sub2(mul2(scalar2(2),$labels),one);let losses3=relu2(sub2(one,mul2($labels,$predictions)));return computeWeightedLoss3(losses3,$weights,reduction)}var hingeLoss2=op2({hingeLoss_:hingeLoss_2});function huberLoss_2(labels,predictions,weights,delta=1,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","huberLoss"),$predictions=convertToTensor2(predictions,"predictions","huberLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","huberLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in huberLoss: ");let deltaScalar=scalar2(delta),error=abs2(sub2($predictions,$labels)),quadratic=minimum2(error,deltaScalar),linear=sub2(error,quadratic),losses3=add4(mul2(scalar2(.5),square2(quadratic)),mul2(deltaScalar,linear));return computeWeightedLoss3(losses3,$weights,reduction)}var huberLoss2=op2({huberLoss_:huberLoss_2});function logLoss_2(labels,predictions,weights,epsilon4=1e-7,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","logLoss"),$predictions=convertToTensor2(predictions,"predictions","logLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","logLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in logLoss: ");let one=scalar2(1),epsilonScalar=scalar2(epsilon4),l13=neg2(mul2($labels,log2(add4($predictions,epsilonScalar)))),l23=mul2(sub2(one,$labels),log2(add4(sub2(one,$predictions),epsilonScalar))),losses3=sub2(l13,l23);return computeWeightedLoss3(losses3,$weights,reduction)}var logLoss2=op2({logLoss_:logLoss_2});function meanSquaredError_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","meanSquaredError"),$predictions=convertToTensor2(predictions,"predictions","meanSquaredError"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","meanSquaredError")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in meanSquaredError: ");let losses3=squaredDifference4($labels,$predictions);return computeWeightedLoss3(losses3,$weights,reduction)}var meanSquaredError4=op2({meanSquaredError_:meanSquaredError_2});function sigmoidCrossEntropyWithLogits_2(labels,logits){let $labels=convertToTensor2(labels,"labels","sigmoidCrossEntropyWithLogits"),$logits=convertToTensor2(logits,"logits","sigmoidCrossEntropyWithLogits");assertShapesMatch2($labels.shape,$logits.shape,"Error in sigmoidCrossEntropyWithLogits: ");let maxOutput=relu2($logits),outputXTarget=mul2($logits,$labels),sigmoidOutput=log1p2(exp2(neg2(abs2($logits))));return add4(sub2(maxOutput,outputXTarget),sigmoidOutput)}function sigmoidCrossEntropy_2(multiClassLabels,logits,weights,labelSmoothing=0,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $multiClassLabels=convertToTensor2(multiClassLabels,"multiClassLabels","sigmoidCrossEntropy"),$logits=convertToTensor2(logits,"logits","sigmoidCrossEntropy"),$weights=null;if(weights!=null&&($weights=convertToTensor2(weights,"weights","sigmoidCrossEntropy")),assertShapesMatch2($multiClassLabels.shape,$logits.shape,"Error in sigmoidCrossEntropy: "),labelSmoothing>0){let labelSmoothingScalar=scalar2(labelSmoothing),one=scalar2(1),half=scalar2(.5);$multiClassLabels=add4(mul2($multiClassLabels,sub2(one,labelSmoothingScalar)),mul2(half,labelSmoothingScalar))}let losses3=sigmoidCrossEntropyWithLogits_2($multiClassLabels,$logits);return computeWeightedLoss3(losses3,$weights,reduction)}var sigmoidCrossEntropy2=op2({sigmoidCrossEntropy_:sigmoidCrossEntropy_2});function softmaxCrossEntropyWithLogits_2(labels,logits,dim=-1){if(dim===-1&&(dim=logits.rank-1),dim!==logits.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${logits.rank} and dim was ${dim}`);let customOp=customGrad2((labels2,logits2,save)=>{let keepDims=!0,lse=logSumExp2(logits2,[dim],keepDims),logResult=sub2(cast2(logits2,"float32"),lse);save([labels2,logResult]);let costVector=neg2(mul2(logResult,labels2)),value=sum3(costVector,[dim]),gradFunc=(dy,saved)=>{let[labels3,logResult2]=saved,dyShape=expandShapeToKeepDim2(dy.shape,[dim]);return[mul2(reshape2(dy,dyShape),sub2(cast2(labels3,"float32"),exp2(logResult2))),mul2(reshape2(dy,dyShape),sub2(exp2(logResult2),cast2(labels3,"float32")))]};return{value,gradFunc}});return customOp(labels,logits)}function softmaxCrossEntropy_2(onehotLabels,logits,weights,labelSmoothing=0,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $onehotLabels=convertToTensor2(onehotLabels,"onehotLabels","softmaxCrossEntropy"),$logits=convertToTensor2(logits,"logits","softmaxCrossEntropy"),$weights=null;if(weights!=null&&($weights=convertToTensor2(weights,"weights","softmaxCrossEntropy")),assertShapesMatch2($onehotLabels.shape,$logits.shape,"Error in softmaxCrossEntropy: "),labelSmoothing>0){let labelSmoothingScalar=scalar2(labelSmoothing),one=scalar2(1),numClasses=scalar2($onehotLabels.shape[1]);$onehotLabels=add4(mul2($onehotLabels,sub2(one,labelSmoothingScalar)),div2(labelSmoothingScalar,numClasses))}let losses3=softmaxCrossEntropyWithLogits_2($onehotLabels,$logits);return computeWeightedLoss3(losses3,$weights,reduction)}var softmaxCrossEntropy2=op2({softmaxCrossEntropy_:softmaxCrossEntropy_2});var spectral2={fft:fft2,ifft:ifft2,rfft:rfft2,irfft:irfft2},signal2={hammingWindow:hammingWindow2,hannWindow:hannWindow2,frame:frame2,stft:stft2},image2={flipLeftRight:flipLeftRight3,resizeNearestNeighbor:resizeNearestNeighbor2,resizeBilinear:resizeBilinear3,rotateWithOffset:rotateWithOffset3,cropAndResize:cropAndResize3,nonMaxSuppression:nonMaxSuppression3,nonMaxSuppressionAsync:nonMaxSuppressionAsync2,nonMaxSuppressionWithScore:nonMaxSuppressionWithScore2,nonMaxSuppressionWithScoreAsync:nonMaxSuppressionWithScoreAsync2,nonMaxSuppressionPadded:nonMaxSuppressionPadded2,nonMaxSuppressionPaddedAsync:nonMaxSuppressionPaddedAsync2},linalg2={bandPart:bandPart2,gramSchmidt:gramSchmidt2,qr:qr2},losses2={absoluteDifference:absoluteDifference2,computeWeightedLoss:computeWeightedLoss3,cosineDistance:cosineDistance2,hingeLoss:hingeLoss2,huberLoss:huberLoss2,logLoss:logLoss2,meanSquaredError:meanSquaredError4,sigmoidCrossEntropy:sigmoidCrossEntropy2,softmaxCrossEntropy:softmaxCrossEntropy2};var SELU_SCALEALPHA2=1.7580993408473768,SELU_SCALE2=1.0507009873554805;var absGradConfig2={kernelName:Abs2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,step2(cast2(x,"float32"),-1))}}};var acosGradConfig2={kernelName:Acos2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=square2(cast2(x,"float32")),b=sqrt2(sub2(scalar2(1),a));return neg2(div2(dy,b))}}}};var acoshGradConfig2={kernelName:Acosh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=sqrt2(sub2(square2(cast2(x,"float32")),1));return div2(dy,a)}}}};var addGradConfig2={kernelName:Add3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=dy,reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let res=dy,reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,b.shape)};return{a:derA,b:derB}}};var addNGradConfig2={kernelName:AddN2,saveAllInputs:!0,gradFunc:(dy,saved)=>{let ders={};return saved.forEach((_,i)=>{ders[i]=()=>dy.clone()}),ders}};var argMaxGradConfig2={kernelName:ArgMax2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>zerosLike3(x)}}};var argMinGradConfig2={kernelName:ArgMin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>zerosLike3(x)}}};var asinGradConfig2={kernelName:Asin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,sqrt2(sub2(scalar2(1),square2(cast2(x,"float32")))))}}};var asinhGradConfig2={kernelName:Asinh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=sqrt2(add4(scalar2(1),square2(cast2(x,"float32"))));return div2(dy,a)}}}};var atan2GradConfig2={kernelName:Atan22,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let d=add4(square2(a),square2(b)),res=mul2(dy,div2(b,d)),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let d=add4(square2(a),square2(b)),res=neg2(mul2(dy,div2(a,d))),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,b.shape)};return{a:derA,b:derB}}};var atanGradConfig2={kernelName:Atan3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,add4(square2(cast2(x,"float32")),1))}}};var atanhGradConfig2={kernelName:Atanh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,sub2(scalar2(1),square2(cast2(x,"float32"))))}}};function avgPool3dBackprop_2(dy,input2,filterSize,strides,dilations=[1,1,1],pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","avgPool3dBackprop"),$input=convertToTensor2(input2,"input","avgPool3dBackprop"),dy5D=$dy,input5D=$input,reshapedTo5D=!1;$input.rank===4&&(reshapedTo5D=!0,dy5D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2],$dy.shape[3]]),input5D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2],$input.shape[3]])),assert3(dy5D.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${dy5D.rank}.`),assert3(input5D.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${input5D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool3DInfo2(input5D.shape,filterSize,strides,dilations,pad7,dimRoundingMode);return backend3.avgPool3dBackprop(dy5D,input5D,convInfo)},inputs={dy:dy5D,input:input5D},attrs={filterSize,strides,dilations,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,AvgPool3DBackprop2,attrs);return reshapedTo5D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3],res.shape[4]]):res}var avgPool3dBackprop2=op2({avgPool3dBackprop_:avgPool3dBackprop_2});var avgPool3DGradConfig2={kernelName:AvgPool3D2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{filterSize,strides,dilations,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1,1]:dilations;return{x:()=>avgPool3dBackprop2(dy,x,filterSize,strides,$dilations,pad7,dimRoundingMode)}}};function avgPoolBackprop_2(dy,input2,filterSize,strides,pad7){let $dy=convertToTensor2(dy,"dy","avgPoolBackprop"),$input=convertToTensor2(input2,"input","avgPoolBackprop");assert3($input.rank===$dy.rank,()=>`Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`);let input4D=$input,dy4D=$dy,reshapedTo4D=!1;$input.rank===3&&(reshapedTo4D=!0,input4D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2]]),dy4D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2]])),assert3(dy4D.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${dy4D.rank}.`),assert3(input4D.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${input4D.rank}.`);let forward=backend3=>{let convInfo=computePool2DInfo2(input4D.shape,filterSize,strides,1,pad7);return backend3.avgPoolBackprop(dy4D,input4D,convInfo)},inputs={dy:dy4D,input:input4D},attrs={filterSize,strides,pad:pad7},res=ENGINE2.runKernelFunc(forward,inputs,null,AvgPoolBackprop2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var avgPoolBackprop4=op2({avgPoolBackprop_:avgPoolBackprop_2});var avgPoolGradConfig2={kernelName:AvgPool2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{filterSize,strides,pad:pad7}=attrs;return{x:()=>avgPoolBackprop4(dy,x,filterSize,strides,pad7)}}};var batchMatMulGradConfig2={kernelName:BatchMatMul2,inputsToSave:["a","b"],gradFunc:(dy,saved,attrs)=>{let[a,b]=saved,{transposeA,transposeB}=attrs;return!transposeA&&!transposeB?{a:()=>matMul3(dy,b,!1,!0),b:()=>matMul3(a,dy,!0,!1)}:!transposeA&&transposeB?{a:()=>matMul3(dy,b,!1,!1),b:()=>matMul3(dy,a,!0,!1)}:transposeA&&!transposeB?{a:()=>matMul3(b,dy,!1,!0),b:()=>matMul3(a,dy,!1,!1)}:{a:()=>matMul3(b,dy,!0,!0),b:()=>matMul3(dy,a,!0,!0)}}};var batchToSpaceNDGradConfig2={kernelName:BatchToSpaceND2,gradFunc:(dy,saved,attrs)=>{let{blockShape,crops}=attrs;return{x:()=>spaceToBatchND3(dy,blockShape,crops)}}};var broadcastToGradConfig2={kernelName:BroadcastTo2,gradFunc:(dy,saved,attrs)=>{let broadCastToAttrs=attrs,inputShape=broadCastToAttrs.inputShape,outputShape=broadCastToAttrs.shape,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)throw new Error(`broadcastTo(): [${inputShape}] cannot be broadcast to [${outputShape}].`);let axes=[];for(let i=0;i1&&axes.push(i);return{x:()=>sum3(dy,axes,!0)}}};var castGradConfig2={kernelName:Cast2,gradFunc:dy=>({x:()=>dy.clone()})};var ceilGradConfig2={kernelName:Ceil2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var clipByValueGradConfig2={kernelName:ClipByValue2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{clipValueMin,clipValueMax}=attrs;return{x:()=>where2(logicalAnd2(greaterEqual2(x,clipValueMin),lessEqual2(x,clipValueMax)),dy,zerosLike3(dy))}}};var concatGradConfig2={kernelName:Concat2,saveAllInputs:!0,gradFunc:(dy,saved,attrs)=>{let shapes=saved.map(t=>t.shape),{axis}=attrs,$axis=parseAxisParam2(axis,saved[0].shape)[0],sizeSplits=shapes.map(s=>s[$axis]),derTensors=split2(dy,sizeSplits,$axis);return derTensors.map(t=>()=>t)}};var conv2DGradConfig2={kernelName:Conv2D3,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let[x4D,$filter]=saved,{dilations,strides,pad:pad7,dataFormat}=attrs;return assert3(tupleValuesAreOne2(dilations),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${dilations}'`),{x:()=>conv2DBackpropInput4(x4D.shape,dy,$filter,strides,pad7,dataFormat),filter:()=>conv2DBackpropFilter3(x4D,dy,$filter.shape,strides,pad7,dataFormat)}}};var conv2DBackpropInputGradConfig2={kernelName:Conv2DBackpropInput2,inputsToSave:["dy","filter"],gradFunc:(ddx,saved,attrs)=>{let[dy,filter]=saved,{strides,pad:pad7,dataFormat,dimRoundingMode}=attrs;return{dy:()=>conv2d2(ddx,filter,strides,pad7,dataFormat,1,dimRoundingMode),filter:()=>conv2DBackpropFilter3(ddx,dy,filter.shape,strides,pad7,dataFormat,dimRoundingMode)}}};function conv3DBackpropFilter_2(x,dy,filterShape,strides,pad7){let x5D=x;x.rank===4&&(x5D=reshape2(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]));let dy5D=dy;dy5D.rank===4&&(dy5D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2],dy.shape[3]])),assert3(x5D.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${x5D.shape}.`),assert3(dy5D.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${dy5D.shape}.`),assert3(filterShape.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${filterShape}.`),assert3(x5D.shape[4]===filterShape[3],()=>`Error in conv3dDerFilter: depth of input ${x5D.shape[4]}) must match input depth in filter (${filterShape[3]}.`),assert3(dy5D.shape[4]===filterShape[4],()=>`Error in conv3dDerFilter: depth of dy (${dy5D.shape[4]}) must match output depth for filter (${filterShape[4]}).`);let forward=backend3=>{let dilations=1,convInfo=computeConv3DInfo2(x5D.shape,filterShape,strides,dilations,pad7);return backend3.conv3dDerFilter(x5D,dy5D,convInfo)},inputs={x:x5D,dy:dy5D},attrs={strides,pad:pad7,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,Conv3DBackpropFilterV22,attrs)}var conv3DBackpropFilter2=op2({conv3DBackpropFilter_:conv3DBackpropFilter_2});var conv3DGradConfig2={kernelName:Conv3D3,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let{dilations,strides,pad:pad7}=attrs;assert3(tupleValuesAreOne2(dilations),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${dilations}'`);let[x5D,$filter]=saved;return{x:()=>conv3DBackpropInput2(x5D.shape,dy,$filter,strides,pad7),filter:()=>conv3DBackpropFilter2(x5D,dy,$filter.shape,strides,pad7)}}};var cosGradConfig2={kernelName:Cos2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(neg2(sin2(cast2(x,"float32"))),dy)}}};var coshGradConfig2={kernelName:Cosh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(sinh2(cast2(x,"float32")),dy)}}};var cumsumGradConfig2={kernelName:Cumsum2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{axis,exclusive,reverse:reverse8}=attrs;return{x:()=>{let permutation=getAxesPermutation2([axis],x.rank),out=cumsum2(dy,axis,exclusive,!reverse8);return permutation!=null&&(out=transpose2(out,permutation)),out}}}};var depthwiseConv2dNativeGradConfig2={kernelName:DepthwiseConv2dNative2,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let{dilations,strides,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1]:dilations;assert3(tupleValuesAreOne2($dilations),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${$dilations}'`);let[x,filter]=saved;return assert3(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),assert3(filter.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${filter.rank}.`),assert3(x.shape[3]===filter.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${filter.shape[2]}.`),assert3(eitherStridesOrDilationsAreOne2(strides,$dilations),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${strides} and dilations '${$dilations}'.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`),{x:()=>depthwiseConv2dNativeBackpropInput3(x.shape,dy,filter,strides,pad7,dilations,dimRoundingMode),filter:()=>depthwiseConv2dNativeBackpropFilter3(x,dy,filter.shape,strides,pad7,dilations,dimRoundingMode)}}};var dilation2dGradConfig2={kernelName:Dilation2D2,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let[x,filter]=saved,inputInputs={x,filter,dy},filterInputs={x,filter,dy};return{x:()=>ENGINE2.runKernel(Dilation2DBackpropInput2,inputInputs,attrs),filter:()=>ENGINE2.runKernel(Dilation2DBackpropFilter2,filterInputs,attrs)}}};var divGradConfig2={kernelName:Div2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=div2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);reduceAxes.length>0&&(res=reshape2(sum3(res,reduceAxes),b.shape));let tmp=square2(b);return neg2(div2(res,cast2(tmp,"float32")))};return{a:derA,b:derB}}};var eluGradConfig2={kernelName:Elu3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved,backPropKernelFunc=backend3=>backend3.eluDer(dy,y),inputs={dy,y};return{x:()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,EluGrad2)}}};var erfGradConfig2={kernelName:Erf2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved,a=mul2(exp2(neg2(square2(x))),2/Math.sqrt(Math.PI));return{x:()=>mul2(dy,a)}}};var expGradConfig2={kernelName:Exp2,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(dy,y)}}};var expm1GradConfig2={kernelName:Expm12,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,exp2(x))}}};var floorGradConfig2={kernelName:Floor2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var floorDivGradConfig2={kernelName:FloorDiv2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=div2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);reduceAxes.length>0&&(res=reshape2(sum3(res,reduceAxes),b.shape));let tmp=square2(b);return neg2(div2(res,cast2(tmp,"float32")))};return{a:derA,b:derB}}};var fusedBatchNormGradConfig2={kernelName:FusedBatchNorm2,inputsToSave:["x","mean","variance","scale"],gradFunc:(dy,saved,attrs)=>{let{varianceEpsilon}=attrs,[x,mean7,variance,scale3]=saved,scaleValue=scale3==null?scalar2(1):scale3,reductionAxes=getReductionAxes2(mean7.shape,x.shape),tileShape=[];if(mean7.rank===1){for(let i=0;imean7.rank===1?reshape2(mul2(mul2(dy,tile2(reshape2(oneOverSqrtVariance,[1,1,1,mean7.shape[0]]),tileShape)),scaleValue),x.shape):reshape2(mul2(mul2(dy,oneOverSqrtVariance),scaleValue),x.shape),derMean=()=>{let meanDer=mul2(mul2(oneOverSqrtVariance,scalar2(-1)),dyTimesScaleValue);return mean7.rank===1&&(meanDer=sum3(meanDer,reductionAxes)),reshape2(meanDer,mean7.shape)},derVariance=()=>{let varianceDer=mul2(mul2(minusHalfRCube,xMinusMean),dyTimesScaleValue);return mean7.rank===1&&(varianceDer=sum3(varianceDer,reductionAxes)),reshape2(varianceDer,mean7.shape)},derScale=()=>{let xMinusMean2TimesRsqrt=mul2(xMinusMean,oneOverSqrtVariance),scaleDer=mul2(dy,xMinusMean2TimesRsqrt);return mean7.rank===1&&(scaleDer=sum3(scaleDer,reductionAxes)),reshape2(scaleDer,mean7.shape)},derOffset=()=>{let offsetDer=dy;return mean7.rank===1&&(offsetDer=sum3(offsetDer,reductionAxes)),reshape2(offsetDer,mean7.shape)};return{x:derX,mean:derMean,variance:derVariance,scale:derScale,offset:derOffset}}};var gatherGradConfig2={kernelName:GatherV22,inputsToSave:["x","indices"],gradFunc:(dy,saved,attrs)=>{let[x,indices]=saved,{axis}=attrs,parsedAxis=parseAxisParam2(axis,x.shape)[0],derX=()=>{let paramsShape=x.shape,indicesSize=indices.size,outerShape=paramsShape.slice(0,parsedAxis),outerDims=outerShape.length,innerShape=paramsShape.slice(axis,paramsShape.length).slice(1),innerDims=innerShape.length,outerAxesIndices=arrayRange2(0,outerDims),innerAxesIndices=arrayRange2(outerDims+1,outerDims+1+innerDims),valuesShape=arrayConcat2([outerShape,[indicesSize],innerShape]),values=reshape2(dy,valuesShape),reshapedIndices=reshape2(indices,[indicesSize]),transposeDims=arrayConcat2([[outerDims],outerAxesIndices,innerAxesIndices]),valuesTranspose=transpose2(values,transposeDims),paramsGrad=unsortedSegmentSum2(valuesTranspose,reshapedIndices,x.shape[parsedAxis]),invertTransposeDims=getUndoAxesPermutation2(transposeDims);return paramsGrad=transpose2(paramsGrad,invertTransposeDims),paramsGrad};return{x:derX,indices:()=>indices}}};function arrayRange2(start,stop){let result=[];for(let i=start;i{let[a,b]=saved;return{a:()=>zerosLike3(a),b:()=>zerosLike3(b)}}};var identityGradConfig2={kernelName:Identity3,gradFunc:dy=>({x:()=>cast2(dy,"float32")})};var isFiniteGradConfig2={kernelName:IsFinite2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var isInfGradConfig2={kernelName:IsInf2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var isNanGradConfig2={kernelName:IsNan2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var log1pGradConfig2={kernelName:Log1p2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,add4(x,1))}}};var logGradConfig2={kernelName:Log2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,cast2(x,"float32"))}}};var logSoftmaxGradConfig2={kernelName:LogSoftmax3,inputsToSave:[],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[value]=saved,{axis}=attrs;return{logits:()=>{let keepDims=!0,softmax7=exp2(value);return sub2(dy,mul2(sum3(dy,axis,keepDims),softmax7))}}}};function localResponseNormalizationBackprop_2(x,y,dy,depthRadius=5,bias=1,alpha=1,beta=.5){let forward=backend3=>backend3.LRNGrad(dy,x,y,depthRadius,bias,alpha,beta),inputs={x,y,dy},attrs={depthRadius,bias,alpha,beta};return ENGINE2.runKernelFunc(forward,inputs,null,LRNBackprop2,attrs)}var localResponseNormalizationBackprop2=op2({localResponseNormalizationBackprop_:localResponseNormalizationBackprop_2});var lrnGradConfig2={kernelName:LRN2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{depthRadius,bias,alpha,beta}=attrs;return{x:()=>localResponseNormalizationBackprop2(x,y,dy,depthRadius,bias,alpha,beta)}}};function gradForMinAndMax2(dy,y,xOrig,origAxes){return y.rank{let dx=mul2(dy,cast2(equal2(xOrig,y),dy.dtype));return dx}}}var maxGradConfig2={kernelName:Max2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let maxAttrs=attrs,{reductionIndices}=maxAttrs,x=saved[0],y=saved[1],origAxes=parseAxisParam2(reductionIndices,x.shape),maxGrad=gradForMinAndMax2(dy,y,x,origAxes);return{x:()=>maxGrad.x()}}};var maximumGradConfig2={kernelName:Maximum3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,derA=()=>mul2(dy,cast2(greaterEqual2(a,b),"float32")),derB=()=>mul2(dy,cast2(less2(a,b),"float32"));return{a:derA,b:derB}}};function maxPool3dBackprop_2(dy,input2,output,filterSize,strides,dilations=[1,1,1],pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","maxPool3dBackprop"),$input=convertToTensor2(input2,"input","maxPool3dBackprop"),$output=convertToTensor2(output,"output","maxPool3dBackprop"),dy5D=$dy,input5D=$input,output5D=$output,reshapedTo5D=!1;$input.rank===4&&(reshapedTo5D=!0,dy5D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2],$dy.shape[3]]),input5D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2],$input.shape[3]]),output5D=reshape2($output,[1,$output.shape[0],$output.shape[1],$output.shape[2],$output.shape[3]])),assert3(dy5D.rank===5,()=>`Error in maxPool3dBackprop: dy must be rank 5 but got rank ${dy5D.rank}.`),assert3(input5D.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${input5D.rank}.`),assert3(output5D.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${output5D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool3DInfo2(input5D.shape,filterSize,strides,dilations,pad7,dimRoundingMode);return backend3.maxPool3dBackprop(dy5D,input5D,output5D,convInfo)},inputs={dy:dy5D,input:input5D,output:output5D},attrs={filterSize,strides,dilations,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,MaxPool3DBackprop2,attrs);return reshapedTo5D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3],res.shape[4]]):res}var maxPool3dBackprop2=op2({maxPool3dBackprop_:maxPool3dBackprop_2});var maxPool3DGradConfig2={kernelName:MaxPool3D2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{filterSize,strides,dilations,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1,1]:dilations;return{x:()=>maxPool3dBackprop2(dy,x,y,filterSize,strides,$dilations,pad7,dimRoundingMode)}}};function maxPoolBackprop_2(dy,input2,output,filterSize,strides,pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","maxPoolBackprop"),$input=convertToTensor2(input2,"input","maxPoolBackprop"),$output=convertToTensor2(output,"output","maxPoolBackprop");assert3($input.rank===$dy.rank,()=>`Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`),assert3($dy.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${$dy.rank}.`),assert3($input.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${$input.rank}.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool2DInfo2($input.shape,filterSize,strides,1,pad7,dimRoundingMode);return backend3.maxPoolBackprop($dy,$input,$output,convInfo)},inputs={dy:$dy,input:$input,output:$output},attrs={filterSize,strides,pad:pad7,dimRoundingMode};return ENGINE2.runKernelFunc(forward,inputs,null,MaxPoolBackprop2,attrs)}var maxPoolBackprop4=op2({maxPoolBackprop_:maxPoolBackprop_2});var maxPoolGradConfig2={kernelName:MaxPool2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{filterSize,strides,pad:pad7}=attrs;return{x:()=>maxPoolBackprop4(dy,x,y,filterSize,strides,pad7)}}};var minGradConfig2={kernelName:Min2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let minAttrs=attrs,{axis}=minAttrs,[x,y]=saved,origAxes=parseAxisParam2(axis,x.shape),minGrad=gradForMinAndMax2(dy,y,x,origAxes);return{x:()=>minGrad.x()}}};var minimumGradConfig2={kernelName:Minimum3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,derA=()=>mul2(dy,cast2(lessEqual2(a,b),"float32")),derB=()=>mul2(dy,cast2(greater2(a,b),"float32"));return{a:derA,b:derB}}};var mirrorPadGradConfig2={kernelName:MirrorPad2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let x=saved[0],{paddings}=attrs,begin=paddings.map(p2=>p2[0]);return{x:()=>slice2(dy,begin,x.shape)}}};var modGradConfig2={kernelName:Mod2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(dy,reduceAxes),a.shape):dy},derB=()=>{let res=mul2(dy,neg2(floor2(div2(a,b)))),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),b.shape):res};return{a:derA,b:derB}}};var multiplyGradConfig2={kernelName:Multiply3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=mul2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),b.shape):res};return{a:derA,b:derB}}};var negateGradConfig2={kernelName:Negate2,gradFunc:dy=>({x:()=>neg2(dy)})};var oneHotGradConfig2={kernelName:OneHot2,inputsToSave:["indices"],gradFunc:(dy,saved)=>{let indices=saved[0];return{indices:()=>zeros2(indices.shape,"float32")}}};var onesLikeGradConfig2={kernelName:OnesLike2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var padV2GradConfig2={kernelName:PadV22,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let x=saved[0],{paddings}=attrs,begin=paddings.map(p2=>p2[0]);return{x:()=>slice2(dy,begin,x.shape)}}};var powGradConfig2={kernelName:Pow2,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(dy,saved)=>{let[a,b,y]=saved,base2=a,exp14=b,outShape=assertAndGetBroadcastShape2(base2.shape,exp14.shape),derBase=()=>{let expFloat=cast2(exp14,"float32"),res=mul2(dy,mul2(expFloat,pow2(base2,sub2(expFloat,scalar2(1))))),reduceAxes=getReductionAxes2(base2.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,base2.shape)},derExp=()=>{let condition=greater2(base2,0),logBase=where2(condition,log2(base2),zerosLike3(base2)),res=mul2(dy,mul2(y,logBase)),reduceAxes=getReductionAxes2(exp14.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,exp14.shape)};return{a:derBase,b:derExp}}};var preluGradConfig2={kernelName:Prelu2,inputsToSave:["x","alpha"],gradFunc:(dy,saved)=>{let[x,alpha]=saved,mask=greater2(x,0);return{x:()=>where2(mask,dy,mul2(dy,alpha)),alpha:()=>{let res=where2(mask,zerosLike3(dy),mul2(dy,x)),reduceAxes=getReductionAxes2(alpha.shape,dy.shape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,alpha.shape)}}}};var reciprocalGradConfig2={kernelName:Reciprocal2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,neg2(square2(x)))}}};var relu6GradConfig2={kernelName:Relu63,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved,mask=mul2(lessEqual2(x,6),step2(x));return{x:()=>mul2(dy,cast2(mask,"float32"))}}};var reluGradConfig2={kernelName:Relu3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,cast2(step2(x),"float32"))}}};var reshapeGradConfig2={kernelName:Reshape3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>reshape2(dy,x.shape)}}};var resizeBilinearGradConfig2={kernelName:ResizeBilinear2,inputsToSave:["images"],gradFunc:(dy,saved,attrs)=>{let[images]=saved,backPropKernelFunc=backend3=>{let{alignCorners}=attrs;return backend3.resizeBilinearBackprop(dy,images,alignCorners)},inputs={images},imagesDer=()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,ResizeBilinearGrad2,attrs);return{images:imagesDer}}};var resizeNearestNeighborGradConfig2={kernelName:ResizeNearestNeighbor2,inputsToSave:["images"],gradFunc:(dy,saved,attrs)=>{let[images]=saved,backPropKernelFunc=backend3=>{let{alignCorners}=attrs;return backend3.resizeNearestNeighborBackprop(dy,images,alignCorners)},inputs={images},imagesDer=()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,ResizeNearestNeighborGrad2,attrs);return{images:imagesDer}}};var reverseGradConfig2={kernelName:Reverse2,gradFunc:(dy,saved,attrs)=>{let{dims}=attrs,axes=parseAxisParam2(dims,dy.shape);return{x:()=>reverse2(dy,axes)}}};var roundGradConfig2={kernelName:Round2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var rsqrtGradConfig2={kernelName:Rsqrt2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>neg2(div2(dy,mul2(pow2(x,1.5),2)))}}};var selectV2PoolGradConfig2={kernelName:SelectV22,inputsToSave:["condition"],gradFunc:(dy,saved)=>{let[condition]=saved;return{condition:()=>cast2(zerosLike3(condition),"float32"),t:()=>mul2(dy,cast2(condition,dy.dtype)),e:()=>mul2(dy,cast2(logicalNot3(condition),dy.dtype))}}};var seluGradConfig2={kernelName:Selu3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let mask=greater2(x,scalar2(0)),scaleAlpha2=scalar2(SELU_SCALEALPHA2),scale3=scalar2(SELU_SCALE2),greaterThanZeroDer=mul2(dy,scale3),lessEqualZeroDer=mul2(mul2(dy,scaleAlpha2),exp2(cast2(x,"float32")));return where2(mask,greaterThanZeroDer,lessEqualZeroDer)}}}};var sigmoidGradConfig2={kernelName:Sigmoid3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(dy,mul2(y,sub2(scalar2(1),y)))}}};var signGradConfig2={kernelName:Sign2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var sinGradConfig2={kernelName:Sin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(cos2(cast2(x,"float32")),dy)}}};var sinhGradConfig2={kernelName:Sinh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(cosh2(cast2(x,"float32")),dy)}}};var sliceGradConfig2={kernelName:Slice2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{begin,size}=attrs,inputShape=x.shape,[begin_,size_]=parseSliceParams2(x,begin,size),paddings=[];for(let i=0;ipad2(dy,paddings)}}};var softmaxGradConfig2={kernelName:Softmax4,outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[y]=saved,{dim}=attrs,keepDims=!0,dyTimesY=mul2(dy,y);return{logits:()=>sub2(dyTimesY,mul2(sum3(dyTimesY,[dim],keepDims),y))}}};var softplusGradConfig2={kernelName:Softplus3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,sigmoid3(x))}}};var spaceToBatchNDGradConfig2={kernelName:SpaceToBatchND2,gradFunc:(dy,saved,attrs)=>{let{blockShape,paddings}=attrs;return{x:()=>batchToSpaceND2(dy,blockShape,paddings)}}};var splitVGradConfig2={kernelName:SplitV2,gradFunc:(dy,saved,attrs)=>{let{axis}=attrs;return{x:()=>concat2(dy,axis)}}};var sqrtGradConfig2={kernelName:Sqrt2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,mul2(sqrt2(cast2(x,"float32")),2))}}};var squareGradConfig2={kernelName:Square2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,mul2(cast2(x,"float32"),2))}}};var squaredDifferenceGradConfig2={kernelName:SquaredDifference2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,two=scalar2(2),derA=()=>mul2(dy,mul2(two,sub2(a,b))),derB=()=>mul2(dy,mul2(two,sub2(b,a)));return{a:derA,b:derB}}};var stepGradConfig2={kernelName:Step2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var subGradConfig2={kernelName:Sub2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=dy,reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let res=dy,reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(neg2(res),b.shape)};return{a:derA,b:derB}}};var sumGradConfig2={kernelName:Sum2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,expandedDyShape=x.shape.slice(),{axis}=attrs,axes=parseAxisParam2(axis,x.shape);axes.forEach(axis2=>{expandedDyShape[axis2]=1});let expandedDy=reshape2(dy,expandedDyShape),derX=mul2(expandedDy,ones4(x.shape,"float32"));return{x:()=>derX}}};var tanGradConfig2={kernelName:Tan2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,square2(cos2(x)))}}};var tanhGradConfig2={kernelName:Tanh3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(sub2(scalar2(1),square2(y)),dy)}}};var tileGradConfig2={kernelName:Tile2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{reps}=attrs,derX=()=>{let xGrad=zerosLike3(x);if(x.rank===1)for(let i=0;i{let transposeAttrs=attrs,{perm}=transposeAttrs,undoPerm=getUndoAxesPermutation2(perm);return{x:()=>transpose2(dy,undoPerm)}}};var unpackGradConfig2={kernelName:Unpack2,gradFunc:(dy,saved,attrs)=>{let unpackAttrs=attrs,{axis}=unpackAttrs;return{value:()=>stack2(dy,axis)}}};var unsortedSegmentSumGradConfig2={kernelName:UnsortedSegmentSum2,inputsToSave:["segmentIds"],gradFunc:(dy,saved)=>{let[segmentIds]=saved,derX=()=>gatherDropNegatives2(dy,segmentIds);return{x:derX}}};function gatherDropNegatives2(x,indices){let zeroClippedIndices=maximum2(indices,zerosLike3(indices)),gathered=gather2(x,zeroClippedIndices),isPositive=greaterEqual2(indices,scalar2(0,"int32")),numIters=gathered.rank-isPositive.rank;for(let i=0;i({x:()=>zerosLike3(dy)})};var gradConfigs2=[absGradConfig2,acosGradConfig2,acoshGradConfig2,addGradConfig2,addNGradConfig2,argMaxGradConfig2,argMinGradConfig2,asinGradConfig2,asinhGradConfig2,atan2GradConfig2,atanGradConfig2,atanhGradConfig2,avgPool3DGradConfig2,avgPoolGradConfig2,batchMatMulGradConfig2,batchToSpaceNDGradConfig2,broadcastToGradConfig2,castGradConfig2,ceilGradConfig2,clipByValueGradConfig2,concatGradConfig2,conv2DBackpropInputGradConfig2,conv2DGradConfig2,conv3DGradConfig2,cosGradConfig2,coshGradConfig2,cumsumGradConfig2,depthwiseConv2dNativeGradConfig2,dilation2dGradConfig2,divGradConfig2,eluGradConfig2,erfGradConfig2,expGradConfig2,expm1GradConfig2,floorDivGradConfig2,floorGradConfig2,fusedBatchNormGradConfig2,gatherGradConfig2,greaterEqualGradConfig2,identityGradConfig2,isFiniteGradConfig2,isInfGradConfig2,isNanGradConfig2,log1pGradConfig2,logGradConfig2,logSoftmaxGradConfig2,lrnGradConfig2,maxGradConfig2,maxGradConfig2,maximumGradConfig2,maxPool3DGradConfig2,maxPoolGradConfig2,minGradConfig2,minimumGradConfig2,mirrorPadGradConfig2,modGradConfig2,multiplyGradConfig2,negateGradConfig2,oneHotGradConfig2,onesLikeGradConfig2,padV2GradConfig2,padV2GradConfig2,powGradConfig2,preluGradConfig2,reciprocalGradConfig2,relu6GradConfig2,reluGradConfig2,reshapeGradConfig2,resizeBilinearGradConfig2,resizeNearestNeighborGradConfig2,reverseGradConfig2,roundGradConfig2,rsqrtGradConfig2,selectV2PoolGradConfig2,seluGradConfig2,sigmoidGradConfig2,signGradConfig2,sinGradConfig2,sinhGradConfig2,sliceGradConfig2,softmaxGradConfig2,softplusGradConfig2,spaceToBatchNDGradConfig2,spaceToBatchNDGradConfig2,splitVGradConfig2,splitVGradConfig2,sqrtGradConfig2,squaredDifferenceGradConfig2,squareGradConfig2,stepGradConfig2,subGradConfig2,sumGradConfig2,tanGradConfig2,tanhGradConfig2,tileGradConfig2,transposeGradConfig2,unpackGradConfig2,unsortedSegmentSumGradConfig2,zerosLikeGradConfig2];for(let gradientConfig of gradConfigs2)registerGradient2(gradientConfig);Tensor2.prototype.abs=function(){return this.throwIfDisposed(),abs2(this)};Tensor2.prototype.acos=function(){return this.throwIfDisposed(),acos2(this)};Tensor2.prototype.acosh=function(){return this.throwIfDisposed(),acosh2(this)};Tensor2.prototype.addStrict=function(x){return this.throwIfDisposed(),addStrict2(this,x)};Tensor2.prototype.add=function(b){return this.throwIfDisposed(),add4(this,b)};Tensor2.prototype.all=function(axis,keepDims){return this.throwIfDisposed(),all2(this,axis,keepDims)};Tensor2.prototype.any=function(axis,keepDims){return this.throwIfDisposed(),any2(this,axis,keepDims)};Tensor2.prototype.argMax=function(axis){return this.throwIfDisposed(),argMax2(this,axis)};Tensor2.prototype.argMin=function(axis){return this.throwIfDisposed(),argMin2(this,axis)};Tensor2.prototype.asScalar=function(){return this.throwIfDisposed(),assert3(this.size===1,()=>"The array must have only 1 element."),reshape2(this,[])};Tensor2.prototype.asType=function(dtype){return this.throwIfDisposed(),cast2(this,dtype)};Tensor2.prototype.as1D=function(){return this.throwIfDisposed(),reshape2(this,[this.size])};Tensor2.prototype.as2D=function(rows,columns){return this.throwIfDisposed(),reshape2(this,[rows,columns])};Tensor2.prototype.as3D=function(rows,columns,depth){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth])};Tensor2.prototype.as4D=function(rows,columns,depth,depth2){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth,depth2])};Tensor2.prototype.as5D=function(rows,columns,depth,depth2,depth3){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth,depth2,depth3])};Tensor2.prototype.asin=function(){return this.throwIfDisposed(),asin2(this)};Tensor2.prototype.asinh=function(){return this.throwIfDisposed(),asinh2(this)};Tensor2.prototype.atan=function(){return this.throwIfDisposed(),atan3(this)};Tensor2.prototype.atan2=function(b){return this.throwIfDisposed(),atan22(this,b)};Tensor2.prototype.atanh=function(){return this.throwIfDisposed(),atanh2(this)};Tensor2.prototype.avgPool=function(filterSize,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),avgPool5(this,filterSize,strides,pad7,dimRoundingMode)};Tensor2.prototype.batchToSpaceND=function(blockShape,crops){return this.throwIfDisposed(),batchToSpaceND2(this,blockShape,crops)};Tensor2.prototype.batchNorm=function(mean7,variance,offset,scale3,varianceEpsilon){return this.throwIfDisposed(),batchNorm4(this,mean7,variance,offset,scale3,varianceEpsilon)};Tensor2.prototype.broadcastTo=function(shape){return this.throwIfDisposed(),broadcastTo2(this,shape)};Tensor2.prototype.cast=function(dtype){return this.throwIfDisposed(),cast2(this,dtype)};Tensor2.prototype.ceil=function(){return this.throwIfDisposed(),ceil2(this)};Tensor2.prototype.clipByValue=function(min9,max11){return this.throwIfDisposed(),clipByValue2(this,min9,max11)};Tensor2.prototype.concat=function(x,axis){return this.throwIfDisposed(),x instanceof Tensor2&&(x=[x]),concat2([this,...x],axis)};Tensor2.prototype.conv1d=function(filter,stride,pad7,dataFormat,dilation,dimRoundingMode){return this.throwIfDisposed(),conv1d2(this,filter,stride,pad7,dataFormat,dilation,dimRoundingMode)};Tensor2.prototype.conv2dTranspose=function(filter,outputShape,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),conv2dTranspose3(this,filter,outputShape,strides,pad7,dimRoundingMode)};Tensor2.prototype.conv2d=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return this.throwIfDisposed(),conv2d2(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.cos=function(){return this.throwIfDisposed(),cos2(this)};Tensor2.prototype.cosh=function(){return this.throwIfDisposed(),cosh2(this)};Tensor2.prototype.cumsum=function(axis,exclusive,reverse8){return this.throwIfDisposed(),cumsum2(this,axis,exclusive,reverse8)};Tensor2.prototype.depthToSpace=function(blockSize,dataFormat){return this.throwIfDisposed(),depthToSpace3(this,blockSize,dataFormat)};Tensor2.prototype.depthwiseConv2D=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return deprecationWarn2("depthwiseConv2D is deprecated, use depthwiseConv2d instead"),this.throwIfDisposed(),depthwiseConv2d6(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.depthwiseConv2d=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return this.throwIfDisposed(),depthwiseConv2d6(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.dilation2d=function(filter,strides,pad7,dilations,dataFormat){return this.throwIfDisposed(),dilation2d2(this,filter,strides,pad7,dilations,dataFormat)};Tensor2.prototype.divNoNan=function(b){return this.throwIfDisposed(),divNoNan2(this,b)};Tensor2.prototype.divStrict=function(x){return this.throwIfDisposed(),divStrict2(this,x)};Tensor2.prototype.div=function(b){return this.throwIfDisposed(),div2(this,b)};Tensor2.prototype.dot=function(b){return this.throwIfDisposed(),dot2(this,b)};Tensor2.prototype.elu=function(){return this.throwIfDisposed(),elu2(this)};Tensor2.prototype.equalStrict=function(x){return this.throwIfDisposed(),equalStrict2(this,x)};Tensor2.prototype.equal=function(b){return this.throwIfDisposed(),equal2(this,b)};Tensor2.prototype.erf=function(){return this.throwIfDisposed(),erf2(this)};Tensor2.prototype.exp=function(){return this.throwIfDisposed(),exp2(this)};Tensor2.prototype.expandDims=function(axis){return this.throwIfDisposed(),expandDims3(this,axis)};Tensor2.prototype.expm1=function(){return this.throwIfDisposed(),expm12(this)};Tensor2.prototype.fft=function(){return this.throwIfDisposed(),fft2(this)};Tensor2.prototype.flatten=function(){return this.throwIfDisposed(),reshape2(this,[this.size])};Tensor2.prototype.floor=function(){return this.throwIfDisposed(),floor2(this)};Tensor2.prototype.floorDiv=function(b){return this.throwIfDisposed(),floorDiv2(this,b)};Tensor2.prototype.gather=function(indices,axis){return this.throwIfDisposed(),gather2(this,indices,axis)};Tensor2.prototype.greaterEqualStrict=function(x){return this.throwIfDisposed(),greaterEqualStrict2(this,x)};Tensor2.prototype.greaterEqual=function(b){return this.throwIfDisposed(),greaterEqual2(this,b)};Tensor2.prototype.greaterStrict=function(x){return this.throwIfDisposed(),greaterStrict2(this,x)};Tensor2.prototype.greater=function(b){return this.throwIfDisposed(),greater2(this,b)};Tensor2.prototype.ifft=function(){return this.throwIfDisposed(),ifft2(this)};Tensor2.prototype.irfft=function(){return this.throwIfDisposed(),irfft2(this)};Tensor2.prototype.isFinite=function(){return this.throwIfDisposed(),isFinite4(this)};Tensor2.prototype.isInf=function(){return this.throwIfDisposed(),isInf3(this)};Tensor2.prototype.isNaN=function(){return this.throwIfDisposed(),isNaN4(this)};Tensor2.prototype.leakyRelu=function(alpha){return this.throwIfDisposed(),leakyRelu2(this,alpha)};Tensor2.prototype.lessEqualStrict=function(x){return this.throwIfDisposed(),lessEqualStrict2(this,x)};Tensor2.prototype.lessEqual=function(b){return this.throwIfDisposed(),lessEqual2(this,b)};Tensor2.prototype.lessStrict=function(x){return this.throwIfDisposed(),lessStrict2(this,x)};Tensor2.prototype.less=function(b){return this.throwIfDisposed(),less2(this,b)};Tensor2.prototype.localResponseNormalization=function(depthRadius,bias,alpha,beta){return this.throwIfDisposed(),localResponseNormalization2(this,depthRadius,bias,alpha,beta)};Tensor2.prototype.logSigmoid=function(){return this.throwIfDisposed(),logSigmoid2(this)};Tensor2.prototype.logSoftmax=function(axis){return this.throwIfDisposed(),logSoftmax2(this,axis)};Tensor2.prototype.logSumExp=function(axis,keepDims){return this.throwIfDisposed(),logSumExp2(this,axis,keepDims)};Tensor2.prototype.log=function(){return this.throwIfDisposed(),log2(this)};Tensor2.prototype.log1p=function(){return this.throwIfDisposed(),log1p2(this)};Tensor2.prototype.logicalAnd=function(b){return this.throwIfDisposed(),logicalAnd2(this,b)};Tensor2.prototype.logicalNot=function(){return this.throwIfDisposed(),logicalNot3(this)};Tensor2.prototype.logicalOr=function(b){return this.throwIfDisposed(),logicalOr2(this,b)};Tensor2.prototype.logicalXor=function(b){return this.throwIfDisposed(),logicalXor2(this,b)};Tensor2.prototype.matMul=function(b,transposeA,transposeB){return this.throwIfDisposed(),matMul3(this,b,transposeA,transposeB)};Tensor2.prototype.maxPool=function(filterSize,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),maxPool5(this,filterSize,strides,pad7,dimRoundingMode)};Tensor2.prototype.max=function(axis,keepDims){return this.throwIfDisposed(),max2(this,axis,keepDims)};Tensor2.prototype.maximumStrict=function(x){return this.throwIfDisposed(),maximumStrict2(this,x)};Tensor2.prototype.maximum=function(b){return this.throwIfDisposed(),maximum2(this,b)};Tensor2.prototype.mean=function(axis,keepDims){return this.throwIfDisposed(),mean2(this,axis,keepDims)};Tensor2.prototype.min=function(axis,keepDims){return this.throwIfDisposed(),min2(this,axis,keepDims)};Tensor2.prototype.minimumStrict=function(x){return this.throwIfDisposed(),minimumStrict2(this,x)};Tensor2.prototype.minimum=function(b){return this.throwIfDisposed(),minimum2(this,b)};Tensor2.prototype.mirrorPad=function(paddings,mode){return this.throwIfDisposed(),mirrorPad3(this,paddings,mode)};Tensor2.prototype.modStrict=function(x){return this.throwIfDisposed(),modStrict2(this,x)};Tensor2.prototype.mod=function(b){return this.throwIfDisposed(),mod2(this,b)};Tensor2.prototype.mulStrict=function(x){return this.throwIfDisposed(),mulStrict2(this,x)};Tensor2.prototype.mul=function(b){return this.throwIfDisposed(),mul2(this,b)};Tensor2.prototype.neg=function(){return this.throwIfDisposed(),neg2(this)};Tensor2.prototype.norm=function(ord,axis,keepDims){return this.throwIfDisposed(),norm2(this,ord,axis,keepDims)};Tensor2.prototype.notEqualStrict=function(x){return this.throwIfDisposed(),notEqualStrict2(this,x)};Tensor2.prototype.notEqual=function(b){return this.throwIfDisposed(),notEqual4(this,b)};Tensor2.prototype.oneHot=function(depth,onValue=1,offValue=0){return this.throwIfDisposed(),oneHot3(this,depth,onValue,offValue)};Tensor2.prototype.onesLike=function(){return this.throwIfDisposed(),onesLike3(this)};Tensor2.prototype.pad=function(paddings,constantValue){return this.throwIfDisposed(),pad2(this,paddings,constantValue)};Tensor2.prototype.pool=function(windowShape,poolingType,padding,dilationRate,strides){return this.throwIfDisposed(),pool2(this,windowShape,poolingType,padding,dilationRate,strides)};Tensor2.prototype.powStrict=function(exp14){return this.throwIfDisposed(),powStrict2(this,exp14)};Tensor2.prototype.pow=function(exp14){return this.throwIfDisposed(),pow2(this,exp14)};Tensor2.prototype.prelu=function(alpha){return this.throwIfDisposed(),prelu2(this,alpha)};Tensor2.prototype.prod=function(axis,keepDims){return this.throwIfDisposed(),prod2(this,axis,keepDims)};Tensor2.prototype.reciprocal=function(){return this.throwIfDisposed(),reciprocal2(this)};Tensor2.prototype.relu=function(){return this.throwIfDisposed(),relu2(this)};Tensor2.prototype.relu6=function(){return this.throwIfDisposed(),relu62(this)};Tensor2.prototype.reshapeAs=function(x){return this.throwIfDisposed(),reshape2(this,x.shape)};Tensor2.prototype.reshape=function(shape){return this.throwIfDisposed(),reshape2(this,shape)};Tensor2.prototype.resizeBilinear=function(newShape2D,alignCorners){return this.throwIfDisposed(),resizeBilinear3(this,newShape2D,alignCorners)};Tensor2.prototype.resizeNearestNeighbor=function(newShape2D,alignCorners){return this.throwIfDisposed(),resizeNearestNeighbor2(this,newShape2D,alignCorners)};Tensor2.prototype.reverse=function(axis){return this.throwIfDisposed(),reverse2(this,axis)};Tensor2.prototype.rfft=function(){return this.throwIfDisposed(),rfft2(this)};Tensor2.prototype.round=function(){return this.throwIfDisposed(),round3(this)};Tensor2.prototype.rsqrt=function(){return this.throwIfDisposed(),rsqrt2(this)};Tensor2.prototype.selu=function(){return this.throwIfDisposed(),selu2(this)};Tensor2.prototype.separableConv2d=function(depthwiseFilter,pointwiseFilter,strides,pad7,dilation,dataFormat){return this.throwIfDisposed(),separableConv2d3(this,depthwiseFilter,pointwiseFilter,strides,pad7,dilation,dataFormat)};Tensor2.prototype.sigmoid=function(){return this.throwIfDisposed(),sigmoid3(this)};Tensor2.prototype.sign=function(){return this.throwIfDisposed(),sign2(this)};Tensor2.prototype.sin=function(){return this.throwIfDisposed(),sin2(this)};Tensor2.prototype.sinh=function(){return this.throwIfDisposed(),sinh2(this)};Tensor2.prototype.slice=function(begin,size){return this.throwIfDisposed(),slice2(this,begin,size)};Tensor2.prototype.softmax=function(dim){return this.throwIfDisposed(),softmax2(this,dim)};Tensor2.prototype.softplus=function(){return this.throwIfDisposed(),softplus2(this)};Tensor2.prototype.spaceToBatchND=function(blockShape,paddings){return this.throwIfDisposed(),spaceToBatchND3(this,blockShape,paddings)};Tensor2.prototype.split=function(numOrSizeSplits,axis){return this.throwIfDisposed(),split2(this,numOrSizeSplits,axis)};Tensor2.prototype.sqrt=function(){return this.throwIfDisposed(),sqrt2(this)};Tensor2.prototype.square=function(){return this.throwIfDisposed(),square2(this)};Tensor2.prototype.squaredDifference=function(b){return this.throwIfDisposed(),squaredDifference4(this,b)};Tensor2.prototype.squaredDifferenceStrict=function(x){return this.throwIfDisposed(),squaredDifferenceStrict2(this,x)};Tensor2.prototype.squeeze=function(axis){return this.throwIfDisposed(),squeeze2(this,axis)};Tensor2.prototype.stack=function(x,axis){this.throwIfDisposed();let tensorsToBeStacked=x instanceof Tensor2?[this,x]:[this,...x];return stack2(tensorsToBeStacked,axis)};Tensor2.prototype.step=function(alpha){return this.throwIfDisposed(),step2(this,alpha)};Tensor2.prototype.stridedSlice=function(begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask){return this.throwIfDisposed(),stridedSlice3(this,begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask)};Tensor2.prototype.subStrict=function(x){return this.throwIfDisposed(),subStrict2(this,x)};Tensor2.prototype.sub=function(b){return this.throwIfDisposed(),sub2(this,b)};Tensor2.prototype.sum=function(axis,keepDims){return this.throwIfDisposed(),sum3(this,axis,keepDims)};Tensor2.prototype.tan=function(){return this.throwIfDisposed(),tan2(this)};Tensor2.prototype.tanh=function(){return this.throwIfDisposed(),tanh3(this)};Tensor2.prototype.tile=function(reps){return this.throwIfDisposed(),tile2(this,reps)};Tensor2.prototype.toBool=function(){return this.throwIfDisposed(),cast2(this,"bool")};Tensor2.prototype.toFloat=function(){return this.throwIfDisposed(),cast2(this,"float32")};Tensor2.prototype.toInt=function(){return this.throwIfDisposed(),cast2(this,"int32")};Tensor2.prototype.topk=function(k,sorted){return this.throwIfDisposed(),topk2(this,k,sorted)};Tensor2.prototype.transpose=function(perm){return this.throwIfDisposed(),transpose2(this,perm)};Tensor2.prototype.unique=function(axis){return this.throwIfDisposed(),unique2(this,axis)};Tensor2.prototype.unsortedSegmentSum=function(segmentIds,numSegments){return this.throwIfDisposed(),unsortedSegmentSum2(this,segmentIds,numSegments)};Tensor2.prototype.unstack=function(axis){return this.throwIfDisposed(),unstack2(this,axis)};Tensor2.prototype.where=function(condition,x){return this.throwIfDisposed(),where2(condition,this,x)};Tensor2.prototype.zerosLike=function(){return this.throwIfDisposed(),zerosLike3(this)};function imageToSquare(input2,inputSize,centerImage=!1){let{Image,Canvas}=env2.getEnv();if(!(input2 instanceof Image||input2 instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input2),scale3=inputSize/Math.max(dims.height,dims.width),width=scale3*dims.width,height=scale3*dims.height,targetCanvas=createCanvas2({width:inputSize,height:inputSize}),inputCanvas=input2 instanceof Canvas?input2:createCanvasFromMedia(input2),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input2)){this._imageTensors[idx]=input2,this._inputDimensions[idx]=input2.shape;return}if(isTensor4D(input2)){let batchSize=input2.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input2,this._inputDimensions[idx]=input2.shape.slice(1);return}let canvas=input2 instanceof env2.getEnv().Canvas?input2:createCanvasFromMedia(input2);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range2(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tidy2(()=>{let inputTensors=range2(this.batchSize,0,1).map(batchIdx=>{let input2=this.getInput(batchIdx);if(input2 instanceof Tensor2){let imgTensor=isTensor4D(input2)?input2:input2.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=image2.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input2 instanceof env2.getEnv().Canvas)return browser_exports2.fromPixels(imageToSquare(input2,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input2}`)}),batchTensor=stack2(inputTensors.map(t=>cast2(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input2,i)=>{if(!isMediaElement(input2)&&!isTensor3D(input2)&&!isTensor4D(input2))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input2)){let batchSize=input2.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input2=>isMediaElement(input2)&&awaitMediaLoaded(input2))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input2,detections){let{Canvas}=env2.getEnv(),canvas=input2;if(!(input2 instanceof Canvas)){let netInput=await toNetInput(input2);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas2({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init2){let fetch3=env2.getEnv().fetch,res=await fetch3(url,init2);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return io_exports.loadWeights(manifest,modelBaseUri)}function matchDimensions(input2,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input2.width=width,input2.height=height,{width,height}}var NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor163){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor163}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor163})=>{this.reassignParamFromPath(path,tensor163.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable4})=>{let tensor163=tensor4(variable4.dataSync());variable4.dispose(),this.reassignParamFromPath(path,tensor163)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor163})=>Array.from(tensor163.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env2.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights2=io_exports.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights2(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}};function depthwiseSeparableConv(x,params,stride){return tidy(()=>{let out=separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=add2(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tidy(()=>{let out1=relu(isFirstLayer?add2(conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=relu(add2(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return relu(add2(out1,add2(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tidy(()=>{let out1=relu(isFirstLayer?add2(conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=relu(add2(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=relu(add2(out1,add2(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return relu(add2(out1,add2(out2,add2(out3,out4))))})}function convLayer(x,params,padding="same",withRelu=!1){return tidy(()=>{let out=add2(conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor163=weightMap[originalPath];if(!isTensor(tensor163,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor163}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor163}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input2){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}};function fullyConnectedLayer(x,params){return tidy(()=>add2(matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input2){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tidy(()=>{let bottleneckFeatures=input2 instanceof NetInput?this.faceFeatureExtractor.forwardInput(input2):input2;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input2){return tidy(()=>softmax(this.runNet(input2)))}async forward(input2){return this.forwardInput(await toNetInput(input2))}async predictExpressions(input2){let netInput=await toNetInput(input2),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round2(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range2(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range2(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return add2(conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(relu(out),params.separable_conv1,[1,1]),out=maxPool(out,[3,3],[2,2],"same"),out=add2(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(relu(out),params.separable_conv2,[1,1]),out=add2(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input2){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(256)),out=relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range2(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input2){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tidy(()=>{let bottleneckFeatures=input2 instanceof NetInput?this.faceFeatureExtractor.forwardInput(input2):input2,pooled=avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input2){return tidy(()=>{let{age,gender}=this.runNet(input2);return{age,gender:softmax(gender)}})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async predictAgeAndGender(input2){let netInput=await toNetInput(input2),out=await this.forwardInput(netInput),ages=unstack(out.age),genders=unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale3=inputSize/Math.max(height,width);return{width:width*scale3,height:height*scale3}}),batchSize=inputDimensions.length;return tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>stack([fill([68],fillX,"float32"),fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding2=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding2(batchIdx,(w,h)=>wgetPadding2(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input2){return tidy(()=>{let out=this.runNet(input2);return this.postProcess(out,input2.inputSize,input2.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async detectLandmarks(input2){let netInput=await toNetInput(input2),landmarkTensors=tidy(()=>unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven2(i)),yCoords=landmarksArray.filter((_,i)=>!isEven2(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input2){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};function scale2(x,params){return add2(mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=conv2d(x,filters,strides,padding);return out=add2(out,bias),out=scale2(out,params.scale),withRelu?relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tidy(()=>transpose(tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tensor1d(extractWeights(numWeights)),biases=tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale3=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale3}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tidy(()=>transpose(tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale3=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale3}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=add2(out,x),out=relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=avgPool(x,2,2,"valid"),zeros10=zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=zeros(padShapeX);out=concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=zeros(padShapeY);out=concat([out,zerosH],2)}return pooled=isPad?concat([pooled,zeros10],3):pooled,out=add2(pooled,out),out=relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input2){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(256)),out=convDown(normalized,params.conv32_down);out=maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=matMul(globalAvg,params.fc);return fullyConnected})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async computeFaceDescriptor(input2){let netInput=await toNetInput(input2),faceDescriptorTensors=tidy(()=>unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tensor1d(extractWeights(numChannels)),batch_norm_offset=tensor1d(extractWeights(numChannels)),batch_norm_mean=tensor1d(extractWeights(numChannels)),batch_norm_variance=tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function pointwiseConvLayer(x,params,strides){return tidy(()=>{let out=conv2d(x,params.filters,strides,"same");return out=add2(out,params.batch_norm_offset),clipByValue(out,0,6)})}var epsilon3=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tidy(()=>{let out=depthwiseConv2d(x,params.filters,strides,"same");return out=batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon3),clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function getCenterCoordinatesAndSizesLayer(x){let vec=unstack(transpose(x,[1,0])),sizes=[sub(vec[2],vec[0]),sub(vec[3],vec[1])],centers=[add2(vec[0],div(sizes[0],scalar(2))),add2(vec[1],div(sizes[1],scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=unstack(transpose(x1,[1,0])),div0_out=div(mul(exp(div(vec[2],scalar(5))),sizes[0]),scalar(2)),add0_out=add2(mul(div(vec[0],scalar(10)),sizes[0]),centers[0]),div1_out=div(mul(exp(div(vec[3],scalar(5))),sizes[1]),scalar(2)),add1_out=add2(mul(div(vec[1],scalar(10)),sizes[1]),centers[1]);return transpose(stack([sub(add0_out,div0_out),sub(add1_out,div1_out),add2(add0_out,div0_out),add2(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(reshape(tile(params.extra_dim,[batchSize,1,1]),[-1,4]),reshape(boxPredictions,[-1,4]));boxes=reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=sigmoid(slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=unstack(boxes),scoresByBatch=unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}function boxPredictionLayer(x,params){return tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input2){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(512,!1),"float32"),x=sub(mul(batchTensor,scalar(.007843137718737125)),scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async locateFaces(input2,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input2),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression4(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME2="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",isNumber3=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber3(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber3(a.x)&&isNumber3(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber3)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}function leaky(x){return tidy(()=>{let min9=mul(x,scalar(.10000000149011612));return add2(relu(sub(x,min9)),min9)})}function convWithBatchNorm(x,params){return tidy(()=>{let out=pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=conv2d(out,params.conv.filters,[1,1],"valid"),out=sub(out,params.bn.sub),out=mul(out,params.bn.truediv),out=add2(out,params.conv.bias),leaky(out)})}function depthwiseSeparableConv3(x,params){return tidy(()=>{let out=pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=add2(out,params.bias),leaky(out)})}function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub30=tensor1d(extractWeights(size)),truediv=tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub30,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub30=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub30,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input2,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input2,inputSize){return await this.forwardInput(await toNetInput(input2),inputSize)}async detect(input2,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input2),out=await this.forwardInput(netInput,inputSize),out0=tidy(()=>unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression2(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid2(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid2(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max11,curr)=>max11.classScore>curr.classScore?max11:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input2,forwardParams){let objectDetections=await this.detect(input2,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME2}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function extractAllFacesAndComputeResults(parentResults,input2,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input2 instanceof Tensor?await extractFaceTensors(input2,faceBoxes):await extractFaces(input2,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input2,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input2,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input2,forwardParams){let objectDetections=await this.detect(input2,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input2,options)=>nets.ssdMobilenetv1.locateFaces(input2,options),tinyFaceDetector=(input2,options)=>nets.tinyFaceDetector.locateFaces(input2,options),tinyYolov23=(input2,options)=>nets.tinyYolov2.locateFaces(input2,options),detectFaceLandmarks=input2=>nets.faceLandmark68Net.detectLandmarks(input2),detectFaceLandmarksTiny=input2=>nets.faceLandmark68TinyNet.detectLandmarks(input2),computeFaceDescriptor=input2=>nets.faceRecognitionNet.computeFaceDescriptor(input2),recognizeFaceExpressions=input2=>nets.faceExpressionNet.predictExpressions(input2),predictAgeAndGender=input2=>nets.ageGenderNet.predictAgeAndGender(input2),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input2,extractedFaces){super();this.parentTask=parentTask;this.input=input2;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input2,extractedFaces){super();this.parentTask=parentTask;this.input=input2;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input2){super();this.parentTask=parentTask;this.input=input2}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input2,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input2;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input2,options=new SsdMobilenetv1Options){super();this.input=input2;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input:input2,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input3=>nets.tinyFaceDetector.locateFaces(input3,options):options instanceof SsdMobilenetv1Options?input3=>nets.ssdMobilenetv1.locateFaces(input3,options):options instanceof TinyYolov2Options?input3=>nets.tinyYolov2.locateFaces(input3,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input2)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input2,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input2,options)}function detectAllFaces(input2,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input2,options)}async function allFacesSsdMobilenetv1(input2,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input2,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input2,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input2,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count2=1,createUniqueLabel=()=>`person ${count2++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json18){let labeledDescriptors=json18.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json18.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version3="0.8.9",node=typeof process!="undefined",browser=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version4={faceapi:version3,node,browser};export{AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,TinyYolov2SizeType,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas2 as createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw_exports as draw,env2 as env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression2 as nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid2 as sigmoid,ssdMobilenetv1,tfjs_esm_exports as tf,tinyFaceDetector,tinyYolov23 as tinyYolov2,toNetInput,utils_exports as utils,validateConfig,version4 as version}; + rank ${$x.rank}.`),assert3(isInt2(depthRadius),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${depthRadius}.`);let x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]]));let forward=(backend3,save)=>{let y=backend3.localResponseNormalization4D(x4D,depthRadius,bias,alpha,beta);return save([x4D,y]),y},inputs={x:x4D},attrs={depthRadius,bias,alpha,beta},res=ENGINE2.runKernelFunc(forward,inputs,null,LRN2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var localResponseNormalization2=op2({localResponseNormalization_:localResponseNormalization_2});function log_2(x){let $x=convertToTensor2(x,"x","log"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.log($x);return save([$x]),res},inputs,null,Log2)}var log2=op2({log_:log_2});function log1p_2(x){let $x=convertToTensor2(x,"x","log1p"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.log1p($x);return save([$x]),res},inputs,null,Log1p2)}var log1p2=op2({log1p_:log1p_2});function customGrad2(f){return ENGINE2.customGrad(f)}function neg_2(x){let $x=convertToTensor2(x,"x","neg"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.neg($x),inputs,null,Negate2)}var neg2=op2({neg_:neg_2});function softplus_2(x){let $x=convertToTensor2(x,"x","softplus"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.softplus($x);return save([$x]),res},inputs,null,Softplus3)}var softplus2=op2({softplus_:softplus_2});function logSigmoid_2(x){let $x=convertToTensor2(x,"x","logSigmoid"),customOp=customGrad2(x2=>{let value=neg2(softplus2(neg2(x2))),gradFunc=dy=>{let derX=mul2(dy,sigmoid3(neg2(x2)));return derX};return{value,gradFunc}});return customOp($x)}var logSigmoid2=op2({logSigmoid_:logSigmoid_2});function max_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","max"),forward=(backend3,save)=>{let origAxes=parseAxisParam2(axis,$x.shape),axes=origAxes,permutedAxes=getAxesPermutation2(axes,$x.rank),maxInput=$x;permutedAxes!=null&&(maxInput=transpose2($x,permutedAxes),axes=getInnerMostAxes2(axes.length,maxInput.rank));let y=backend3.max(maxInput,axes);permutedAxes!=null&&maxInput.dispose();let res=y;if(keepDims){let expandedShape=expandShapeToKeepDim2(res.shape,parseAxisParam2(axis,$x.shape));res=reshape2(res,expandedShape),y.dispose()}return save([$x,res]),res},inputs={x:$x},attrs={reductionIndices:axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Max2,attrs)}var max2=op2({max_:max_2});function sub_2(a,b){let $a=convertToTensor2(a,"a","sub"),$b=convertToTensor2(b,"b","sub");[$a,$b]=makeTypesMatch2($a,$b);let forward=(backend3,save)=>{let res=backend3.subtract($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Sub2)}var sub2=op2({sub_:sub_2});function sum_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","sum");$x.dtype==="bool"&&($x=cast2($x,"int32"));let forward=(backend3,save)=>{save([$x]);let axes=parseAxisParam2(axis,$x.shape),permutation=getAxesPermutation2(axes,$x.rank),reductionAxes=axes,permutedX=$x;permutation!=null&&(permutedX=transpose2($x,permutation),reductionAxes=getInnerMostAxes2(reductionAxes.length,$x.rank));let value=backend3.sum(permutedX,reductionAxes);if(keepDims){let newShape=expandShapeToKeepDim2(value.shape,axes);value=reshape2(value,newShape)}return value},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Sum2,attrs)}var sum3=op2({sum_:sum_2});function logSoftmax_2(logits,axis=-1){let $logits=convertToTensor2(logits,"logits","logSoftmax");if(axis===-1&&(axis=$logits.rank-1),axis!==$logits.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${$logits.rank} and axis was ${axis}`);let forward=(backend3,save)=>{let keepDims=!0,xMax=max2(logits,axis,!0),shifted=sub2(logits,xMax),value=sub2(cast2(shifted,"float32"),log2(sum3(exp2(shifted),axis,keepDims)));return save([value]),value},inputs={logits:$logits},attrs={axis};return ENGINE2.runKernelFunc(forward,inputs,null,LogSoftmax3,attrs)}var logSoftmax2=op2({logSoftmax_:logSoftmax_2});function logSumExp_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","logSumExp"),axes=parseAxisParam2(axis,$x.shape),xMax=max2($x,axes,!0),a=sub2($x,xMax),b=exp2(a),c=sum3(b,axes),d=log2(c),res=add4(reshape2(xMax,d.shape),d);if(keepDims){let newShape=expandShapeToKeepDim2(res.shape,axes);return reshape2(res,newShape)}return res}var logSumExp2=op2({logSumExp_:logSumExp_2});function logicalAnd_2(a,b){let $a=convertToTensor2(a,"a","logicalAnd","bool"),$b=convertToTensor2(b,"b","logicalAnd","bool");assertAndGetBroadcastShape2($a.shape,$b.shape);let inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(backend3=>backend3.logicalAnd($a,$b),inputs,null,LogicalAnd2)}var logicalAnd2=op2({logicalAnd_:logicalAnd_2});function logicalNot_2(x){let $x=convertToTensor2(x,"x","logicalNot","bool"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.logicalNot($x),inputs,null,LogicalNot2)}var logicalNot3=op2({logicalNot_:logicalNot_2});function logicalOr_2(a,b){let $a=convertToTensor2(a,"a","logicalOr","bool"),$b=convertToTensor2(b,"b","logicalOr","bool");assertAndGetBroadcastShape2($a.shape,$b.shape);let inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(backend3=>backend3.logicalOr($a,$b),inputs,null,LogicalOr2)}var logicalOr2=op2({logicalOr_:logicalOr_2});function logicalXor_2(a,b){let $a=convertToTensor2(a,"a","logicalXor","bool"),$b=convertToTensor2(b,"b","logicalXor","bool");return assertAndGetBroadcastShape2($a.shape,$b.shape),logicalAnd2(logicalOr2(a,b),logicalNot3(logicalAnd2(a,b)))}var logicalXor2=op2({logicalXor_:logicalXor_2});function maxPool_2(x,filterSize,strides,pad7,dimRoundingMode){let $x=convertToTensor2(x,"x","maxPool"),dilations=1,x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(x4D.rank===4,()=>`Error in maxPool: input must be rank 4 but got rank ${x4D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=(backend3,save)=>{let convInfo=computePool2DInfo2(x4D.shape,filterSize,strides,1,pad7,dimRoundingMode),y;return convInfo.filterWidth===1&&convInfo.filterHeight===1&&arraysEqual2(convInfo.inShape,convInfo.outShape)?y=x4D.clone():y=backend3.maxPool(x4D,convInfo),save([x4D,y]),y},inputs={x:x4D},attrs={filterSize,strides,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,MaxPool2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var maxPool5=op2({maxPool_:maxPool_2});function zeros2(shape,dtype="float32"){if(dtype==="complex64"){let real9=zeros2(shape,"float32"),imag9=zeros2(shape,"float32");return complex2(real9,imag9)}let values=makeZerosTypedArray2(sizeFromShape2(shape),dtype);return ENGINE2.makeTensor(values,shape,dtype)}function ones4(shape,dtype="float32"){if(dtype==="complex64"){let real9=ones4(shape,"float32"),imag9=zeros2(shape,"float32");return complex2(real9,imag9)}let values=makeOnesTypedArray2(sizeFromShape2(shape),dtype);return ENGINE2.makeTensor(values,shape,dtype)}function mean_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","mean"),axes=parseAxisParam2(axis,$x.shape),shapes=computeOutAndReduceShapes2($x.shape,axes),reduceShape=shapes[1],reduceSize=sizeFromShape2(reduceShape),inputs={x:$x},attrs={axis,keepDims},forward=()=>{let reduceSizeScalar=scalar2(reduceSize),xReduce=reduceSizeScalar.dtype===$x.dtype?$x:cast2($x,reduceSizeScalar.dtype),res=div2(xReduce,reduceSizeScalar);return sum3(res,axis,keepDims)},customOp=customGrad2(x2=>{let value=ENGINE2.runKernelFunc(forward,inputs,null,Mean2,attrs),gradFunc=dy=>{let expandedDyShape=x2.shape.slice();axes.forEach(axis2=>{expandedDyShape[axis2]=1});let expandedDy=reshape2(dy,expandedDyShape),derX=div2(mul2(expandedDy,ones4(x2.shape,"float32")),reduceSize);return derX};return{value,gradFunc}});return customOp($x)}var mean2=op2({mean_:mean_2});function min_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","min"),forward=(backend3,save)=>{let origAxes=parseAxisParam2(axis,$x.shape),axes=origAxes,permutedAxes=getAxesPermutation2(axes,$x.rank),minInput=$x;permutedAxes!=null&&(minInput=transpose2($x,permutedAxes),axes=getInnerMostAxes2(axes.length,$x.rank));let y=backend3.min(minInput,axes);permutedAxes!=null&&minInput.dispose();let res=y;if(keepDims){let expandedShape=expandShapeToKeepDim2(res.shape,origAxes);res=reshape2(y,expandedShape),y.dispose()}return save([$x,res]),res},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Min2,attrs)}var min2=op2({min_:min_2});function minimum_2(a,b){let $a=convertToTensor2(a,"a","minimum"),$b=convertToTensor2(b,"b","minimum");[$a,$b]=makeTypesMatch2($a,$b),$a.dtype==="bool"&&($a=cast2($a,"int32"),$b=cast2($b,"int32")),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.minimum($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Minimum3)}var minimum2=op2({minimum_:minimum_2});function mirrorPad_2(x,paddings,mode){assert3(mode==="reflect"||mode==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${mode}.`);let $x=convertToTensor2(x,"x","mirrorPad");if($x.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");assert3(paddings.length===$x.rank,()=>`Padding doesn't match input. Must be ${$x.rank}. Got ${paddings.length}.`);let shapeOffset=mode==="reflect"?1:0;for(let i=0;i<$x.rank;i++)assert3(paddings[i].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),assert3(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}`);let attrs={paddings,mode},inputs={x:$x};return ENGINE2.runKernel(MirrorPad2,inputs,attrs)}var mirrorPad3=op2({mirrorPad_:mirrorPad_2});function mod_2(a,b){let $a=convertToTensor2(a,"a","mod"),$b=convertToTensor2(b,"b","mod");[$a,$b]=makeTypesMatch2($a,$b);let forward=(backend3,save)=>{let res=backend3.mod($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Mod2)}var mod2=op2({mod_:mod_2});function square_2(x){let $x=convertToTensor2(x,"x","square"),attrs={},inputsToSave=[$x],outputsToSave=[];return ENGINE2.runKernelFunc((backend3,save)=>(save([$x]),backend3.square($x)),{x:$x},null,"Square",attrs,inputsToSave,outputsToSave)}var square2=op2({square_:square_2});function notEqual_2(a,b){let $a=convertToTensor2(a,"a","notEqual"),$b=convertToTensor2(b,"b","notEqual");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=backend3=>backend3.notEqual($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,NotEqual2)}var notEqual4=op2({notEqual_:notEqual_2});function real_2(input2){let $input=convertToTensor2(input2,"input","real"),forward=backend3=>backend3.real($input),inputs={input:$input};return ENGINE2.runKernelFunc(forward,inputs,null,Real2)}var real2=op2({real_:real_2});function onesLike_2(x){let $x=convertToTensor2(x,"x","onesLike"),forward=(backend3,save)=>{if($x.dtype==="complex64"){let r=onesLike3(real2($x)),i=zerosLike3(imag2($x));return complex2(r,i)}return backend3.onesLike($x)},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,OnesLike2)}var onesLike3=op2({onesLike_:onesLike_2});function pad_2(x,paddings,constantValue=0){let $x=convertToTensor2(x,"x","pad");if($x.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let forward=(backend3,save)=>(save([$x]),backend3.pad($x,paddings,constantValue)),attrs={paddings,constantValue},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,PadV22,attrs)}var pad2=op2({pad_:pad_2});function spaceToBatchND_2(x,blockShape,paddings){let $x=convertToTensor2(x,"x","spaceToBatchND");assert3($x.rank>=1+blockShape.length,()=>`input rank ${$x.rank} should be > than [blockShape] ${blockShape.length}`),assert3(paddings.length===blockShape.length,()=>`paddings.shape[0] ${paddings.length} must be equal to [blockShape] ${blockShape.length}`),assert3($x.shape.reduce((a,b,i)=>i>0&&i<=blockShape.length?a&&(b+paddings[i-1][0]+paddings[i-1][1])%blockShape[i-1]===0:a,!0),()=>`input spatial dimensions ${$x.shape.slice(1)} with paddings ${paddings.toString()} must be divisible by blockShapes ${blockShape.toString()}`);let forward=backend3=>backend3.spaceToBatchND($x,blockShape,paddings),inputs={x:$x},attrs={blockShape,paddings};return ENGINE2.runKernelFunc(forward,inputs,null,SpaceToBatchND2,attrs)}var spaceToBatchND3=op2({spaceToBatchND_:spaceToBatchND_2});function pool_2(input2,windowShape,poolingType,pad7,dilations,strides){dilations==null&&(dilations=[1,1]),strides==null&&(strides=1),pad7===0&&(pad7="valid");let $x=convertToTensor2(input2,"x","maxPool"),x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`);let convInfo=computePool2DInfo2(x4D.shape,windowShape,strides,dilations,pad7),dilation=[convInfo.dilationHeight,convInfo.dilationWidth],basePadding;pad7==="same"?basePadding=withSpaceToBatchBasePaddings2([convInfo.filterHeight,convInfo.filterWidth],dilation):basePadding=[[0,0],[0,0]];let isDilationOne=dilation[0]===1&&dilation[1]===1,[adjustedPadding,adjustedCrops]=requiredSpaceToBatchPaddings2([convInfo.inHeight,convInfo.inWidth],dilation,basePadding),convertedPad=isDilationOne?pad7:"valid",convertedX=isDilationOne?x4D:spaceToBatchND3(x4D,dilation,adjustedPadding),forwardOp=poolingType==="avg"?()=>avgPool5(convertedX,windowShape,strides,convertedPad):()=>maxPool5(convertedX,windowShape,strides,convertedPad),y=forwardOp(),res=isDilationOne?y:batchToSpaceND2(y,dilation,adjustedCrops);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}function requiredSpaceToBatchPaddings2(inputShape,blockShape,basePadding){let padStart=basePadding.map(b=>b[0]),origPadEnd=basePadding.map(b=>b[1]),fullInputShape=inputShape.concat(padStart,origPadEnd),padEndExtra=blockShape.map((b,i)=>(b-fullInputShape[i]%b)%b),padEnd=origPadEnd.map((s,i)=>s+padEndExtra[i]),paddings=blockShape.map((_,i)=>[padStart[i],padEnd[i]]),crops=blockShape.map((_,i)=>[0,padEndExtra[i]]);return[paddings,crops]}function withSpaceToBatchBasePaddings2(filterShape,dilation){let dilatedFilterShape=filterShape.map((s,i)=>s+(s-1)*(dilation[i]-1)),padExtraShape=dilatedFilterShape.map(s=>s-1),padExtraStart=padExtraShape.map(s=>Math.floor(s/2)),padExtraEnd=padExtraShape.map((s,i)=>s-padExtraStart[i]);return padExtraShape.map((_,i)=>[padExtraStart[i],padExtraEnd[i]])}var pool2=op2({pool_:pool_2});function pow_2(base2,exp14){let $base=convertToTensor2(base2,"base","pow"),$exp=convertToTensor2(exp14,"exp","pow");[$base,$exp]=makeTypesMatch2($base,$exp);let inputs={a:$base,b:$exp},forward=(backend3,save)=>{let y=backend3.pow($base,$exp);return save([$base,$exp,y]),y};return ENGINE2.runKernelFunc(forward,inputs,null,Pow2)}var pow2=op2({pow_:pow_2});function prelu_2(x,alpha){let $x=convertToTensor2(x,"x","prelu"),$alpha=convertToTensor2(alpha,"alpha","prelu"),forward=(backend3,save)=>{let res=backend3.prelu($x,$alpha);return save([$x,$alpha]),res},inputs={x:$x,alpha:$alpha};return ENGINE2.runKernelFunc(forward,inputs,null,Prelu2)}var prelu2=op2({prelu_:prelu_2});function prod_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","prod");$x.dtype==="bool"&&($x=cast2($x,"int32"));let forward=backend3=>{let axes=parseAxisParam2(axis,$x.shape),permutation=getAxesPermutation2(axes,$x.rank),reductionAxes=axes,permutedX=$x;permutation!=null&&(permutedX=transpose2($x,permutation),reductionAxes=getInnerMostAxes2(reductionAxes.length,$x.rank));let value=backend3.prod(permutedX,reductionAxes);if(keepDims){let newShape=expandShapeToKeepDim2(value.shape,axes);value=reshape2(value,newShape)}return value},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Prod2,attrs)}var prod2=op2({prod_:prod_2});function tensor1d2(values,dtype){assertNonNull2(values);let inferredShape=inferShape2(values,dtype);if(inferredShape.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");let shape=null;return makeTensor2(values,shape,inferredShape,dtype)}function range3(start,stop,step9=1,dtype="float32"){if(step9===0)throw new Error("Cannot have a step of zero");let forward=()=>{let sameStartStop=start===stop,increasingRangeNegativeStep=start1;if(sameStartStop||increasingRangeNegativeStep||decreasingRangePositiveStep)return zeros2([0],dtype);let numElements=Math.abs(Math.ceil((stop-start)/step9)),values=makeZerosTypedArray2(numElements,dtype);stop{let res=backend3.reciprocal($x);return save([$x]),res},inputs,null,Reciprocal2)}var reciprocal2=op2({reciprocal_:reciprocal_2});function relu_2(x){let $x=convertToTensor2(x,"x","relu"),forward=(backend3,save)=>(save([$x]),$x.dtype==="bool"?cast2($x,"int32"):backend3.relu($x)),inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Relu3)}var relu2=op2({relu_:relu_2});function relu6_2(x){let $x=convertToTensor2(x,"x","relu6"),forward=(backend3,save)=>(save([$x]),$x.dtype==="bool"?cast2($x,"int32"):backend3.relu6($x)),inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Relu63)}var relu62=op2({relu6_:relu6_2});function reverse_2(x,axis){let $x=convertToTensor2(x,"x","reverse"),forward=backend3=>{let axes=parseAxisParam2(axis,$x.shape);if($x.rank===0)return clone2($x);let res=backend3.reverse($x,axes);return reshape2(res,$x.shape)},inputs={x:$x},attrs={dims:axis};return ENGINE2.runKernelFunc(forward,inputs,null,Reverse2,attrs)}var reverse2=op2({reverse_:reverse_2});function round_2(x){let $x=convertToTensor2(x,"x","round"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.round($x),inputs,null,Round2)}var round3=op2({round_:round_2});function rsqrt_2(x){let $x=convertToTensor2(x,"x","rsqrt"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.rsqrt($x);return save([$x]),res},inputs,null,Rsqrt2)}var rsqrt2=op2({rsqrt_:rsqrt_2});function selu_2(x){let $x=convertToTensor2(x,"x","selu"),forward=(backend3,save)=>{let res=backend3.selu($x);return save([$x]),res},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Selu3)}var selu2=op2({selu_:selu_2});function separableConv2d_2(x,depthwiseFilter,pointwiseFilter,strides,pad7,dilation=[1,1],dataFormat="NHWC"){let $x=convertToTensor2(x,"x","separableConv2d"),$depthwiseFilter=convertToTensor2(depthwiseFilter,"depthwiseFilter","separableConv2d"),$pointwiseFilter=convertToTensor2(pointwiseFilter,"pointwiseFilter","separableConv2d"),x4D=$x,reshapedTo4D=!1;if($x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),dataFormat==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");assert3(x4D.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${x4D.rank}.`),assert3($depthwiseFilter.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${$depthwiseFilter.rank}.`),assert3($pointwiseFilter.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${$depthwiseFilter.rank}.`),assert3($pointwiseFilter.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${$pointwiseFilter.shape[0]}.`),assert3($pointwiseFilter.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${$pointwiseFilter.shape[1]}.`);let inChannels=$depthwiseFilter.shape[2],channelMultiplier=$depthwiseFilter.shape[3];assert3($pointwiseFilter.shape[2]===inChannels*channelMultiplier,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${inChannels*channelMultiplier}, but got ${$pointwiseFilter.shape[2]}.`);let depthwise=depthwiseConv2d6(x4D,$depthwiseFilter,strides,pad7,dataFormat,dilation),pointwiseStride=1,res=conv2d2(depthwise,$pointwiseFilter,pointwiseStride,"valid",dataFormat);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var separableConv2d3=op2({separableConv2d_:separableConv2d_2});function sign_2(x){let $x=convertToTensor2(x,"x","sign"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.sign($x),inputs,null,Sign2)}var sign2=op2({sign_:sign_2});function sin_2(x){let $x=convertToTensor2(x,"x","sin"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sin($x);return save([$x]),res},inputs,null,Sin2)}var sin2=op2({sin_:sin_2});function sinh_2(x){let $x=convertToTensor2(x,"x","sinh"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sinh($x);return save([$x]),res},inputs,null,Sinh2)}var sinh2=op2({sinh_:sinh_2});function softmax_2(logits,dim=-1){let $logits=convertToTensor2(logits,"logits","softmax","float32");if(dim===-1&&(dim=$logits.rank-1),dim!==$logits.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${$logits.rank} and dim was ${dim}`);let inputs={logits:$logits},attrs={dim};return ENGINE2.runKernelFunc((backend3,save)=>{let y=backend3.softmax($logits,dim);return save([y]),y},inputs,null,Softmax4,attrs)}var softmax2=op2({softmax_:softmax_2});function fft_2(input2){assert3(input2.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${input2.dtype}.`);let inputs={input:input2};return ENGINE2.runKernelFunc(backend3=>{let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,input2D=input2.as2D(batch,innerDimensionSize),result=backend3.fft(input2D);return result.reshape(input2.shape)},inputs,null,FFT2)}var fft2=op2({fft_:fft_2});function ifft_2(input2){assert3(input2.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${input2.dtype}.`);let inputs={input:input2};return ENGINE2.runKernelFunc(backend3=>{let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,input2D=reshape2(input2,[batch,innerDimensionSize]),result=backend3.ifft(input2D);return reshape2(result,input2.shape)},inputs,null,IFFT2)}var ifft2=op2({ifft_:ifft_2});function irfft_2(input2){let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,ret;if(innerDimensionSize<=2){let complexInput=reshape2(input2,[batch,innerDimensionSize]);ret=ifft2(complexInput)}else{let outputShape=[batch,2*(innerDimensionSize-1)],realInput=reshape2(real2(input2),[batch,innerDimensionSize]),imagInput=reshape2(imag2(input2),[batch,innerDimensionSize]),realConjugate=reverse2(slice2(realInput,[0,1],[batch,innerDimensionSize-2]),1),imagConjugate=mul2(reverse2(slice2(imagInput,[0,1],[batch,innerDimensionSize-2]),1),scalar2(-1)),r=concat2([realInput,realConjugate],1),i=concat2([imagInput,imagConjugate],1),complexInput=reshape2(complex2(r,i),[outputShape[0],outputShape[1]]);ret=ifft2(complexInput)}if(ret=real2(ret),input2.rank===3&&input2.shape[0]!==0){let temp=ret,batch2=input2.shape[0];ret=reshape2(ret,[batch2,ret.shape[0]/batch2,ret.shape[1]]),temp.dispose()}return ret}var irfft2=op2({irfft_:irfft_2});function prepareSplitSize2(x,numOrSizeSplits,axis=0){let splitSizes=[];if(typeof numOrSizeSplits=="number")assert3(x.shape[axis]%numOrSizeSplits===0,()=>"Number of splits must evenly divide the axis."),splitSizes=new Array(numOrSizeSplits).fill(x.shape[axis]/numOrSizeSplits);else{let numOfNegs=numOrSizeSplits.reduce((count2,value)=>(value===-1&&(count2+=1),count2),0);assert3(numOfNegs<=1,()=>"There should be only one negative value in split array.");let negIndex=numOrSizeSplits.indexOf(-1);if(negIndex!==-1){let total=numOrSizeSplits.reduce((a,b)=>b>0?a+b:a);numOrSizeSplits[negIndex]=x.shape[axis]-total}assert3(x.shape[axis]===numOrSizeSplits.reduce((a,b)=>a+b),()=>"The sum of sizes must match the size of the axis dimension."),splitSizes=numOrSizeSplits}return splitSizes}function split_2(x,numOrSizeSplits,axis=0){let $x=convertToTensor2(x,"x","split"),forward=(backend3,_)=>{let $axis=parseAxisParam2(axis,$x.shape)[0],splitSizes=prepareSplitSize2($x,numOrSizeSplits,$axis);return backend3.split($x,splitSizes,$axis)},inputs={x:$x},attr={numOrSizeSplits,axis};return ENGINE2.runKernelFunc(forward,inputs,null,SplitV2,attr)}var split2=op2({split_:split_2});function rfft_2(input2,fftLength){assert3(input2.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${input2.dtype}`);let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,adjustedInput;if(fftLength!=null&&fftLength0),size=input2.shape.map(v=>v);size[input2.shape.length-1]=fftLength,adjustedInput=slice2(input2,begin,size),innerDimensionSize=fftLength}else if(fftLength!=null&&fftLength>innerDimensionSize){let zerosShape=input2.shape.map(v=>v);zerosShape[input2.shape.length-1]=fftLength-innerDimensionSize,adjustedInput=concat2([input2,zeros2(zerosShape)],input2.shape.length-1),innerDimensionSize=fftLength}else adjustedInput=input2;let zerosInput=zerosLike3(adjustedInput),complexInput=reshape2(complex2(adjustedInput,zerosInput),[batch,innerDimensionSize]),ret=fft2(complexInput),half=Math.floor(innerDimensionSize/2)+1,realValues=real2(ret),imagValues=imag2(ret),realComplexConjugate=split2(realValues,[half,innerDimensionSize-half],realValues.shape.length-1),imagComplexConjugate=split2(imagValues,[half,innerDimensionSize-half],imagValues.shape.length-1),outputShape=adjustedInput.shape.slice();return outputShape[adjustedInput.shape.length-1]=half,reshape2(complex2(realComplexConjugate[0],imagComplexConjugate[0]),outputShape)}var rfft2=op2({rfft_:rfft_2});function sqrt_2(x){let $x=convertToTensor2(x,"x","sqrt"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sqrt($x);return save([$x]),res},inputs,null,Sqrt2)}var sqrt2=op2({sqrt_:sqrt_2});function squaredDifference_2(a,b){let $a=convertToTensor2(a,"a","squaredDifference"),$b=convertToTensor2(b,"b","squaredDifference");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.squaredDifference($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b},attrs={};return ENGINE2.runKernelFunc(forward,inputs,null,SquaredDifference2,attrs)}var squaredDifference4=op2({squaredDifference_:squaredDifference_2});function squeeze_2(x,axis){let $x=convertToTensor2(x,"x","squeeze");return reshape2($x,squeezeShape2($x.shape,axis).newShape)}var squeeze2=op2({squeeze_:squeeze_2});function stack_2(tensors,axis=0){let $tensors=convertToTensorArray2(tensors,"tensors","stack");if(assert3($tensors.length>=1,()=>"Pass at least one tensor to tf.stack"),$tensors.length===1)return expandDims3($tensors[0],axis);let rank=$tensors[0].rank,shape=$tensors[0].shape,dtype=$tensors[0].dtype;assert3(axis<=rank,()=>"Axis must be <= rank of the tensor"),$tensors.forEach(t=>{assertShapesMatch2(shape,t.shape,"All tensors passed to stack must have matching shapes"),assert3(dtype===t.dtype,()=>"All tensors passed to stack must have matching dtypes")});let expandedTensors=$tensors.map(t=>expandDims3(t,axis));return concat2(expandedTensors,axis)}var stack2=op2({stack_:stack_2});function step_2(x,alpha=0){let $x=convertToTensor2(x,"x","step"),inputs={x:$x},attrs={alpha};return ENGINE2.runKernelFunc(backend3=>backend3.step($x,alpha),inputs,null,Step2,attrs)}var step2=op2({step_:step_2});function stridedSlice_2(x,begin,end,strides,beginMask=0,endMask=0,ellipsisMask=0,newAxisMask=0,shrinkAxisMask=0){let $x=convertToTensor2(x,"x","stridedSlice"),forward=backend3=>{strides==null&&(strides=new Array(begin.length));let ellipsisAxes=maskToAxes2(ellipsisMask);if(ellipsisAxes.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(ellipsisMask!==0&&newAxisMask!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(ellipsisMask!==0&&shrinkAxisMask!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let numInterpolatedAxes=$x.rank-begin.length,expandAxes=maskToAxes2(newAxisMask),newShape=$x.shape.slice();expandAxes.forEach(axis=>{begin[axis]=0,end[axis]=1,newShape.splice(axis,0,1)}),$x=reshape2($x,newShape);let{begin:normalizedBegin,end:normalizedEnd,strides:normalizedStrides}=getNormalizedAxes2($x.shape,ellipsisAxes,numInterpolatedAxes,begin,end,strides,beginMask,endMask,ellipsisMask);begin=normalizedBegin,end=normalizedEnd,strides=normalizedStrides;let shrinkAxes=maskToAxes2(shrinkAxisMask);shrinkAxes.forEach(axis=>{end[axis]=begin[axis]+1,strides[axis]=1});let size=computeOutShape5(begin,end,strides),outShape=size.filter((_,axis)=>shrinkAxes.indexOf(axis)===-1),nonStrided=strides.every(v=>v===1);if(nonStrided)return reshape2(slice2($x,begin,size),outShape);let res=backend3.stridedSlice($x,begin,end,strides);return reshape2(res,outShape)},inputs={x:$x},attrs={begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask};return ENGINE2.runKernelFunc(forward,inputs,null,StridedSlice2,attrs)}var stridedSlice3=op2({stridedSlice_:stridedSlice_2});function tan_2(x){let $x=convertToTensor2(x,"x","tan"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.tan($x);return save([$x]),res},inputs,null,Tan2)}var tan2=op2({tan_:tan_2});function tensor2d2(values,shape,dtype){if(assertNonNull2(values),shape!=null&&shape.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let inferredShape=inferShape2(values,dtype);if(inferredShape.length!==2&&inferredShape.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(inferredShape.length===1&&shape==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return makeTensor2(values,shape,inferredShape,dtype)}function topk_2(x,k=1,sorted=!0){let $x=convertToTensor2(x,"x","topk");if($x.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let lastDim=$x.shape[$x.shape.length-1];if(k>lastDim)throw new Error(`'k' passed to topk() must be <= the last dimension (${lastDim}) but got ${k}`);let inputs={x:$x},attrs={k,sorted},[values,indices]=ENGINE2.runKernelFunc(b=>b.topk($x,k,sorted),inputs,null,TopK2,attrs);return{values,indices}}var topk2=op2({topk_:topk_2});function unique_2(x,axis=0){let $x=convertToTensor2(x,"x","unique",null);assert3($x.rank>0,()=>"The input tensor must be at least 1D");let inputs={x:$x},attrs={axis},[values,indices]=ENGINE2.runKernel(Unique2,inputs,attrs);return{values,indices}}var unique2=op2({unique_:unique_2});function unsortedSegmentSum_2(x,segmentIds,numSegments){let $x=convertToTensor2(x,"x","unsortedSegmentSum"),$segmentIds=convertToTensor2(segmentIds,"segmentIds","unsortedSegmentSum","int32");assert3(isInt2(numSegments),()=>"numSegments must be of dtype int");let inputs={x:$x,segmentIds:$segmentIds},attrs={numSegments},forward=(backend3,save)=>{let res=backend3.unsortedSegmentSum($x,$segmentIds,numSegments);return save([$segmentIds]),res};return ENGINE2.runKernelFunc(forward,inputs,null,UnsortedSegmentSum2,attrs)}var unsortedSegmentSum2=op2({unsortedSegmentSum_:unsortedSegmentSum_2});function unstack_2(x,axis=0){let $x=convertToTensor2(x,"x","unstack");assert3(axis>=-$x.shape.length&&axis<$x.shape.length,()=>`Axis = ${axis} is not in [-${$x.shape.length}, ${$x.shape.length})`),axis<0&&(axis+=$x.shape.length);let inputs={value:$x},attrs={axis},forward=backend3=>backend3.unstack($x,axis);return ENGINE2.runKernelFunc(forward,inputs,null,Unpack2,attrs)}var unstack2=op2({unstack_:unstack_2});function notEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","notEqualStrict"),$b=convertToTensor2(b,"b","notEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in notEqualStrict: "),notEqual4($a,$b)}function lessStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","lessStrict"),$b=convertToTensor2(b,"b","lessStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in lessStrict: "),less2($a,$b)}function equalStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","equalStrict"),$b=convertToTensor2(b,"b","equalStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in equalStrict: "),equal2($a,$b)}function lessEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","lessEqualStrict"),$b=convertToTensor2(b,"b","lessEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in lessEqualStrict: "),lessEqual2($a,$b)}function greaterStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","greaterStrict"),$b=convertToTensor2(b,"b","greaterStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in greaterStrict: "),greater2($a,$b)}function greaterEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","greaterEqualStrict"),$b=convertToTensor2(b,"b","greaterEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in greaterEqualStrict: "),greaterEqual2($a,$b)}var equalStrict2=op2({equalStrict_:equalStrict_2}),greaterEqualStrict2=op2({greaterEqualStrict_:greaterEqualStrict_2}),greaterStrict2=op2({greaterStrict_:greaterStrict_2}),lessEqualStrict2=op2({lessEqualStrict_:lessEqualStrict_2}),lessStrict2=op2({lessStrict_:lessStrict_2}),notEqualStrict2=op2({notEqualStrict_:notEqualStrict_2});function addStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","addStrict"),$b=convertToTensor2(b,"b","addStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in addStrict: "),add4($a,$b)}function subStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","subStrict"),$b=convertToTensor2(b,"b","subStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in subStrict: "),sub2($a,$b)}function powStrict_2(base2,exp14){return deprecationWarn2("strict variants of ops have been deprecated and will be removed in future"),assertShapesMatch2(base2.shape,exp14.shape,"Error in powStrict: "),pow2(base2,exp14)}function mulStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","mul"),$b=convertToTensor2(b,"b","mul");return assertShapesMatch2($a.shape,$b.shape,"Error in multiplyStrict: "),mul2($a,$b)}function divStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","div"),$b=convertToTensor2(b,"b","div");return assertShapesMatch2($a.shape,$b.shape,"Error in divideStrict: "),div2($a,$b)}function modStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","modStrict"),$b=convertToTensor2(b,"b","modStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in modStrict: "),mod2($a,$b)}function minimumStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","minimumStrict"),$b=convertToTensor2(b,"b","minimumStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in minimumStrict: "),minimum2($a,$b)}function maximumStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","maximumStrict"),$b=convertToTensor2(b,"b","maximumStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in maximumStrict: "),maximum2($a,$b)}function squaredDifferenceStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","squaredDifferenceStrict"),$b=convertToTensor2(b,"b","squaredDifferenceStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in squaredDifferenceStrict: "),squaredDifference4($a,$b)}var addStrict2=op2({addStrict_:addStrict_2}),divStrict2=op2({divStrict_:divStrict_2}),maximumStrict2=op2({maximumStrict_:maximumStrict_2}),minimumStrict2=op2({minimumStrict_:minimumStrict_2}),modStrict2=op2({modStrict_:modStrict_2}),mulStrict2=op2({mulStrict_:mulStrict_2}),powStrict2=op2({powStrict_:powStrict_2}),squaredDifferenceStrict2=op2({squaredDifferenceStrict_:squaredDifferenceStrict_2}),subStrict2=op2({subStrict_:subStrict_2});function norm_2(x,ord="euclidean",axis=null,keepDims=!1){x=convertToTensor2(x,"x","norm");let norm6=normImpl2(x,ord,axis),keepDimsShape=norm6.shape;if(keepDims){let axes=parseAxisParam2(axis,x.shape);keepDimsShape=expandShapeToKeepDim2(norm6.shape,axes)}return reshape2(norm6,keepDimsShape)}function normImpl2(x,p2,axis=null){if(x.rank===0)return abs2(x);if(x.rank!==1&&axis===null)return normImpl2(reshape2(x,[-1]),p2,axis);if(x.rank===1||typeof axis=="number"||Array.isArray(axis)&&axis.length===1){if(p2===1)return sum3(abs2(x),axis);if(p2===Infinity)return max2(abs2(x),axis);if(p2===-Infinity)return min2(abs2(x),axis);if(p2==="euclidean"||p2===2)return sqrt2(sum3(pow2(abs2(x),scalar2(2,"int32")),axis));throw new Error(`Error in norm: invalid ord value: ${p2}`)}if(Array.isArray(axis)&&axis.length===2){if(p2===1)return max2(sum3(abs2(x),axis[0]),axis[1]-1);if(p2===Infinity)return max2(sum3(abs2(x),axis[1]),axis[0]);if(p2===-Infinity)return min2(sum3(abs2(x),axis[1]),axis[0]);if(p2==="fro"||p2==="euclidean")return sqrt2(sum3(square2(x),axis));throw new Error(`Error in norm: invalid ord value: ${p2}`)}throw new Error(`Error in norm: invalid axis: ${axis}`)}var norm2=op2({norm_:norm_2});function enclosingPowerOfTwo2(value){return Math.floor(Math.pow(2,Math.ceil(Math.log(value)/Math.log(2))))}function cosineWindow2(windowLength,a,b){let even=1-windowLength%2,newValues=new Float32Array(windowLength);for(let i=0;i`Error in conv2dDerFilter: input must be rank 4, but got shape ${x4D.shape}.`),assert3(dy4D.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${dy4D.shape}.`),assert3(filterShape.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${filterShape}.`);let inDepth=dataFormat==="NHWC"?x4D.shape[3]:x4D.shape[1],outDepth=dataFormat==="NHWC"?dy4D.shape[3]:dy4D.shape[1];assert3(inDepth===filterShape[2],()=>`Error in conv2dDerFilter: depth of input ${inDepth}) must match input depth in filter (${filterShape[2]}.`),assert3(outDepth===filterShape[3],()=>`Error in conv2dDerFilter: depth of dy (${outDepth}) must match output depth for filter (${filterShape[3]}).`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let dilations=1,$dataFormat=convertConv2DDataFormat2(dataFormat),convInfo=computeConv2DInfo2(x4D.shape,filterShape,strides,dilations,pad7,dimRoundingMode,!1,$dataFormat);return backend3.conv2dDerFilter(x4D,dy4D,convInfo)},inputs={x:x4D,dy:dy4D},attrs={strides,pad:pad7,dataFormat,dimRoundingMode,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,Conv2DBackpropFilter2,attrs)}var conv2DBackpropFilter3=op2({conv2DBackpropFilter_:conv2DBackpropFilter_2});function depthwiseConv2dNativeBackpropFilter_2(x,dy,filterShape,strides,pad7,dilations=[1,1],dimRoundingMode){let x4D=x;x.rank===3&&(x4D=reshape2(x,[1,x.shape[0],x.shape[1],x.shape[2]]));let dy4D=dy;dy4D.rank===3&&(dy4D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2]]));let forward=backend3=>{let convInfo=computeConv2DInfo2(x.shape,filterShape,strides,dilations,pad7,dimRoundingMode,!0);return backend3.depthwiseConv2DDerFilter(x4D,dy4D,convInfo)},inputs={x:x4D,dy:dy4D},attrs={strides,pad:pad7,dimRoundingMode,dilations,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNativeBackpropFilter2,attrs)}var depthwiseConv2dNativeBackpropFilter3=op2({depthwiseConv2dNativeBackpropFilter_:depthwiseConv2dNativeBackpropFilter_2});function depthwiseConv2dNativeBackpropInput_2(xShape,dy,filter,strides,pad7,dilations=[1,1],dimRoundingMode){let dy4D=dy,reshapedTo4D=!1;dy.rank===3&&(reshapedTo4D=!0,dy4D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2]]));let forward=backend3=>{let convInfo=computeConv2DInfo2(xShape,filter.shape,strides,dilations,pad7,dimRoundingMode,!0);return backend3.depthwiseConv2DDerInput(dy4D,filter,convInfo)},inputs={dy:dy4D,filter},attrs={strides,pad:pad7,dimRoundingMode,dilations,inputShape:xShape},res=ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNativeBackpropInput2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var depthwiseConv2dNativeBackpropInput3=op2({depthwiseConv2dNativeBackpropInput_:depthwiseConv2dNativeBackpropInput_2});function hammingWindow_2(windowLength){return cosineWindow2(windowLength,.54,.46)}var hammingWindow2=op2({hammingWindow_:hammingWindow_2});function hannWindow_2(windowLength){return cosineWindow2(windowLength,.5,.5)}var hannWindow2=op2({hannWindow_:hannWindow_2});function frame_2(signal3,frameLength,frameStep,padEnd=!1,padValue=0){let start=0,output=[];for(;start+frameLength<=signal3.size;)output.push(slice2(signal3,start,frameLength)),start+=frameStep;if(padEnd)for(;start`Error in cropAndResize: image must be rank 4,but got rank ${$image.rank}.`),assert3($boxes.rank===2&&$boxes.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${numBoxes},4] but had shape ${$boxes.shape}.`),assert3($boxInd.rank===1&&$boxInd.shape[0]===numBoxes,()=>`Error in cropAndResize: boxInd must be have size [${numBoxes}] but had shape ${$boxes.shape}.`),assert3(cropSize.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${cropSize.length}.`),assert3(cropSize[0]>=1&&cropSize[1]>=1,()=>`cropSize must be atleast [1,1], but was ${cropSize}`),assert3(method==="bilinear"||method==="nearest",()=>`method must be bilinear or nearest, but was ${method}`);let forward=backend3=>backend3.cropAndResize($image,$boxes,$boxInd,cropSize,method,extrapolationValue),inputs={image:$image,boxes:$boxes,boxInd:$boxInd},attrs={method,extrapolationValue,cropSize},res=ENGINE2.runKernelFunc(forward,inputs,null,CropAndResize2,attrs);return res}var cropAndResize3=op2({cropAndResize_:cropAndResize_2});function flipLeftRight_2(image3){let $image=convertToTensor2(image3,"image","flipLeftRight","float32");assert3($image.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${$image.rank}.`);let inputs={image:$image},res=ENGINE2.runKernel(FlipLeftRight2,inputs,{});return res}var flipLeftRight3=op2({flipLeftRight_:flipLeftRight_2});function rotateWithOffset_2(image3,radians,fillValue=0,center=.5){let $image=convertToTensor2(image3,"image","rotateWithOffset","float32");assert3($image.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${$image.rank}.`);let inputs={image:$image},attrs={radians,fillValue,center},res=ENGINE2.runKernel(RotateWithOffset2,inputs,attrs);return res}var rotateWithOffset3=op2({rotateWithOffset_:rotateWithOffset_2});function nonMaxSuppSanityCheck2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma){iouThreshold==null&&(iouThreshold=.5),scoreThreshold==null&&(scoreThreshold=Number.NEGATIVE_INFINITY),softNmsSigma==null&&(softNmsSigma=0);let numBoxes=boxes.shape[0];return maxOutputSize=Math.min(maxOutputSize,numBoxes),assert3(0<=iouThreshold&&iouThreshold<=1,()=>`iouThreshold must be in [0, 1], but was '${iouThreshold}'`),assert3(boxes.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${boxes.rank}'`),assert3(boxes.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${boxes.shape[1]}`),assert3(scores.rank===1,()=>"scores must be a 1D tensor"),assert3(scores.shape[0]===numBoxes,()=>`scores has incompatible shape with boxes. Expected ${numBoxes}, but was ${scores.shape[0]}`),assert3(0<=softNmsSigma&&softNmsSigma<=1,()=>`softNmsSigma must be in [0, 1], but was '${softNmsSigma}'`),{maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma}}function nonMaxSuppression_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),inputs=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold);maxOutputSize=inputs.maxOutputSize,iouThreshold=inputs.iouThreshold,scoreThreshold=inputs.scoreThreshold;let attrs={maxOutputSize,iouThreshold,scoreThreshold};return ENGINE2.runKernelFunc(b=>b.nonMaxSuppression($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold),{boxes:$boxes,scores:$scores},null,NonMaxSuppressionV32,attrs)}var nonMaxSuppression3=op2({nonMaxSuppression_:nonMaxSuppression_2});function binaryInsert2(arr,element,comparator){let index=binarySearch2(arr,element,comparator),insertionPoint=index<0?-(index+1):index;arr.splice(insertionPoint,0,element)}function binarySearch2(arr,target,comparator){return binarySearch_2(arr,target,comparator||defaultComparator2)}function defaultComparator2(a,b){return a>b?1:a>>1);let compareResult=comparator(target,arr[middle]);compareResult>0?left=middle+1:(right=middle,found=!compareResult)}return found?left:-left-1}function nonMaxSuppressionV3Impl3(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,0).selectedIndices}function nonMaxSuppressionV4Impl4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,padToMaxOutputSize){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,0,!1,padToMaxOutputSize,!0)}function nonMaxSuppressionV5Impl4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma,!0)}function nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma,returnScoresTensor=!1,padToMaxOutputSize=!1,returnValidOutputs=!1){let candidates=[];for(let i=0;iscoreThreshold&&candidates.push({score:scores[i],boxIndex:i,suppressBeginIndex:0});candidates.sort(ascendingComparator2);let scale3=softNmsSigma>0?-.5/softNmsSigma:0,selectedIndices=[],selectedScores=[];for(;selectedIndices.length0;){let candidate=candidates.pop(),{score:originalScore,boxIndex,suppressBeginIndex}=candidate;if(originalScore=suppressBeginIndex;--j){let iou3=intersectionOverUnion2(boxes,boxIndex,selectedIndices[j]);if(iou3>=iouThreshold){ignoreCandidate=!0;break}if(candidate.score=candidate.score*suppressWeight2(iouThreshold,scale3,iou3),candidate.score<=scoreThreshold)break}candidate.suppressBeginIndex=selectedIndices.length,ignoreCandidate||(candidate.score===originalScore?(selectedIndices.push(boxIndex),selectedScores.push(candidate.score)):candidate.score>scoreThreshold&&binaryInsert2(candidates,candidate,ascendingComparator2))}let validOutputs=selectedIndices.length,elemsToPad=maxOutputSize-validOutputs;padToMaxOutputSize&&elemsToPad>0&&(selectedIndices.push(...new Array(elemsToPad).fill(0)),selectedScores.push(...new Array(elemsToPad).fill(0)));let result={selectedIndices:tensor1d2(selectedIndices,"int32")};return returnScoresTensor&&(result.selectedScores=tensor1d2(selectedScores,"float32")),returnValidOutputs&&(result.validOutputs=scalar2(validOutputs,"int32")),result}function intersectionOverUnion2(boxes,i,j){let iCoord=boxes.subarray(i*4,i*4+4),jCoord=boxes.subarray(j*4,j*4+4),yminI=Math.min(iCoord[0],iCoord[2]),xminI=Math.min(iCoord[1],iCoord[3]),ymaxI=Math.max(iCoord[0],iCoord[2]),xmaxI=Math.max(iCoord[1],iCoord[3]),yminJ=Math.min(jCoord[0],jCoord[2]),xminJ=Math.min(jCoord[1],jCoord[3]),ymaxJ=Math.max(jCoord[0],jCoord[2]),xmaxJ=Math.max(jCoord[1],jCoord[3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function suppressWeight2(iouThreshold,scale3,iou3){let weight=Math.exp(scale3*iou3*iou3);return iou3<=iouThreshold?weight:0}function ascendingComparator2(c1,c2){return c1.score-c2.score||c1.score===c2.score&&c2.boxIndex-c1.boxIndex}async function nonMaxSuppressionAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),inputs=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold);maxOutputSize=inputs.maxOutputSize,iouThreshold=inputs.iouThreshold,scoreThreshold=inputs.scoreThreshold;let boxesAndScores=await Promise.all([$boxes.data(),$scores.data()]),boxesVals=boxesAndScores[0],scoresVals=boxesAndScores[1],res=nonMaxSuppressionV3Impl3(boxesVals,scoresVals,maxOutputSize,iouThreshold,scoreThreshold);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionAsync2=nonMaxSuppressionAsync_2;function nonMaxSuppressionWithScore_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,softNmsSigma=0){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);maxOutputSize=params.maxOutputSize,iouThreshold=params.iouThreshold,scoreThreshold=params.scoreThreshold,softNmsSigma=params.softNmsSigma;let inputs={boxes:$boxes,scores:$scores},attrs={maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma},result=ENGINE2.runKernel(NonMaxSuppressionV52,inputs,attrs);return{selectedIndices:result[0],selectedScores:result[1]}}var nonMaxSuppressionWithScore2=op2({nonMaxSuppressionWithScore_:nonMaxSuppressionWithScore_2});async function nonMaxSuppressionWithScoreAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,softNmsSigma=0){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);maxOutputSize=params.maxOutputSize,iouThreshold=params.iouThreshold,scoreThreshold=params.scoreThreshold,softNmsSigma=params.softNmsSigma;let boxesAndScores=await Promise.all([$boxes.data(),$scores.data()]),boxesVals=boxesAndScores[0],scoresVals=boxesAndScores[1],res=nonMaxSuppressionV5Impl4(boxesVals,scoresVals,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionWithScoreAsync2=nonMaxSuppressionWithScoreAsync_2;function nonMaxSuppressionPadded_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,padToMaxOutputSize=!1){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,null),$maxOutputSize=params.maxOutputSize,$iouThreshold=params.iouThreshold,$scoreThreshold=params.scoreThreshold,inputs={boxes:$boxes,scores:$scores},attrs={maxOutputSize:$maxOutputSize,iouThreshold:$iouThreshold,scoreThreshold:$scoreThreshold,padToMaxOutputSize},result=ENGINE2.runKernel(NonMaxSuppressionV42,inputs,attrs);return{selectedIndices:result[0],validOutputs:result[1]}}var nonMaxSuppressionPadded2=op2({nonMaxSuppressionPadded_:nonMaxSuppressionPadded_2});async function nonMaxSuppressionPaddedAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,padToMaxOutputSize=!1){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,null),$maxOutputSize=params.maxOutputSize,$iouThreshold=params.iouThreshold,$scoreThreshold=params.scoreThreshold,[boxesVals,scoresVals]=await Promise.all([$boxes.data(),$scores.data()]),res=nonMaxSuppressionV4Impl4(boxesVals,scoresVals,$maxOutputSize,$iouThreshold,$scoreThreshold,padToMaxOutputSize);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionPaddedAsync2=nonMaxSuppressionPaddedAsync_2;function resizeBilinear_2(images,size,alignCorners=!1){let $images=convertToTensor2(images,"images","resizeBilinear");assert3($images.rank===3||$images.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${$images.rank}.`),assert3(size.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${size}.`);let batchImages=$images,reshapedTo4D=!1;$images.rank===3&&(reshapedTo4D=!0,batchImages=reshape2($images,[1,$images.shape[0],$images.shape[1],$images.shape[2]]));let[newHeight,newWidth]=size,forward=(backend3,save)=>(save([batchImages]),backend3.resizeBilinear(batchImages,newHeight,newWidth,alignCorners)),inputs={images:batchImages},attrs={alignCorners,size},res=ENGINE2.runKernelFunc(forward,inputs,null,ResizeBilinear2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var resizeBilinear3=op2({resizeBilinear_:resizeBilinear_2});function resizeNearestNeighbor_2(images,size,alignCorners=!1){let $images=convertToTensor2(images,"images","resizeNearestNeighbor");assert3($images.rank===3||$images.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${$images.rank}.`),assert3(size.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${size}.`),assert3($images.dtype==="float32"||$images.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let batchImages=$images,reshapedTo4D=!1;$images.rank===3&&(reshapedTo4D=!0,batchImages=reshape2($images,[1,$images.shape[0],$images.shape[1],$images.shape[2]]));let[newHeight,newWidth]=size,inputs={images:batchImages},attrs={alignCorners,size},forward=(backend3,save)=>(save([batchImages]),backend3.resizeNearestNeighbor(batchImages,newHeight,newWidth,alignCorners)),res=ENGINE2.runKernelFunc(forward,inputs,null,ResizeNearestNeighbor2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var resizeNearestNeighbor2=op2({resizeNearestNeighbor_:resizeNearestNeighbor_2});function bandPart_2(a,numLower,numUpper){assert3(numLower%1===0,()=>`bandPart(): numLower must be an integer, got ${numLower}.`),assert3(numUpper%1===0,()=>`bandPart(): numUpper must be an integer, got ${numUpper}.`);let $a=convertToTensor2(a,"a","bandPart");assert3($a.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${$a.rank}.`);let shape=$a.shape,[M,N]=$a.shape.slice(-2);if(!(numLower<=M))throw new Error(`bandPart(): numLower (${numLower}) must not be greater than the number of rows (${M}).`);if(!(numUpper<=N))throw new Error(`bandPart(): numUpper (${numUpper}) must not be greater than the number of columns (${N}).`);numLower<0&&(numLower=M),numUpper<0&&(numUpper=N);let i=reshape2(range3(0,M,1,"int32"),[-1,1]),j=range3(0,N,1,"int32"),ij=sub2(i,j),inBand=logicalAnd2(lessEqual2(ij,scalar2(+numLower,"int32")),greaterEqual2(ij,scalar2(-numUpper,"int32"))),zero=zeros2([M,N],$a.dtype);return reshape2(stack2(unstack2(reshape2($a,[-1,M,N])).map(mat=>where2(inBand,mat,zero))),shape)}var bandPart2=op2({bandPart_:bandPart_2});function gramSchmidt_2(xs){let inputIsTensor2D;if(Array.isArray(xs)){inputIsTensor2D=!1,assert3(xs!=null&&xs.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let dim=xs[0].shape[0];for(let i=1;i`Gram-Schmidt: Non-unique lengths found in the input vectors: (${xs[i].shape[0]} vs. ${dim})`)}else inputIsTensor2D=!0,xs=split2(xs,xs.shape[0],0).map(x=>squeeze2(x,[0]));assert3(xs.length<=xs[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${xs.length}) exceeds number of dimensions (${xs[0].shape[0]}).`);let ys=[],xs1d=xs;for(let i=0;i{let x=xs1d[i];if(i>0)for(let j=0;j=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${x.rank}`),x.rank===2)return qr2d2(x,fullMatrices);{let outerDimsProd=x.shape.slice(0,x.shape.length-2).reduce((value,prev)=>value*prev),x2ds=unstack2(reshape2(x,[outerDimsProd,x.shape[x.shape.length-2],x.shape[x.shape.length-1]]),0),q2ds=[],r2ds=[];x2ds.forEach(x2d=>{let[q2d,r2d]=qr2d2(x2d,fullMatrices);q2ds.push(q2d),r2ds.push(r2d)});let q=reshape2(stack2(q2ds,0),x.shape),r=reshape2(stack2(r2ds,0),x.shape);return[q,r]}}function qr2d2(x,fullMatrices=!1){return ENGINE2.tidy(()=>{assert3(x.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${x.shape.length}D Tensor.`);let m=x.shape[0],n=x.shape[1],q=eye2(m),r=clone2(x),one2D=tensor2d2([[1]],[1,1]),w=clone2(one2D),iters=m>=n?n:m;for(let j=0;j{let rjEnd1=slice2(r,[j,j],[m-j,1]),normX=norm2(rjEnd1),rjj=slice2(r,[j,j],[1,1]),s=where2(greater2(rjj,0),tensor2d2([[-1]]),tensor2d2([[1]])),u1=sub2(rjj,mul2(s,normX)),wPre=div2(rjEnd1,u1);wPre.shape[0]===1?w=clone2(one2D):w=concat2([one2D,slice2(wPre,[1,0],[wPre.shape[0]-1,wPre.shape[1]])],0);let tau=neg2(div2(matMul3(s,u1),normX)),rjEndAll=slice2(r,[j,0],[m-j,n]),tauTimesW=mul2(tau,w),wT=transpose2(w);if(j===0)r=sub2(rjEndAll,matMul3(tauTimesW,matMul3(wT,rjEndAll)));else{let rTimesTau=sub2(rjEndAll,matMul3(tauTimesW,matMul3(wT,rjEndAll)));r=concat2([slice2(r,[0,0],[j,n]),rTimesTau],0)}let tawTimesWT=transpose2(tauTimesW),qAllJEnd=slice2(q,[0,j],[m,q.shape[1]-j]);if(j===0)q=sub2(qAllJEnd,matMul3(matMul3(qAllJEnd,w),tawTimesWT));else{let qTimesTau=sub2(qAllJEnd,matMul3(matMul3(qAllJEnd,w),tawTimesWT));q=concat2([slice2(q,[0,0],[m,j]),qTimesTau],1)}return[w,r,q]}),dispose2([rTemp,wTemp,qTemp])}return!fullMatrices&&m>n&&(q=slice2(q,[0,0],[m,n]),r=slice2(r,[0,0],[n,n])),[q,r]})}var qr2=op2({qr_:qr_2});var Reduction2;(function(Reduction3){Reduction3[Reduction3.NONE=0]="NONE",Reduction3[Reduction3.MEAN=1]="MEAN",Reduction3[Reduction3.SUM=2]="SUM",Reduction3[Reduction3.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(Reduction2||(Reduction2={}));function computeWeightedLoss_2(losses3,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $losses=convertToTensor2(losses3,"losses","computeWeightedLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","computeWeightedLoss"));let weightedLoss=$weights==null?$losses:mul2($losses,$weights);if(reduction===Reduction2.NONE)return weightedLoss;if(reduction===Reduction2.SUM)return sum3(weightedLoss);if(reduction===Reduction2.MEAN){if($weights==null)return mean2(weightedLoss);{let broadcastFactor=$losses.size/$weights.size,result=div2(sum3(weightedLoss),sum3($weights));return broadcastFactor>1?div2(result,scalar2(broadcastFactor)):result}}if(reduction===Reduction2.SUM_BY_NONZERO_WEIGHTS){if($weights==null)return div2(sum3(weightedLoss),scalar2($losses.size));{let broadcastedWeights=mul2($weights,ones4($losses.shape)),numNonZeros=cast2(sum3(notEqual4(broadcastedWeights,scalar2(0))),"float32");return div2(sum3(weightedLoss),numNonZeros)}}throw Error(`Unknown reduction: ${reduction}`)}var computeWeightedLoss3=op2({computeWeightedLoss_:computeWeightedLoss_2});function absoluteDifference_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","absoluteDifference"),$predictions=convertToTensor2(predictions,"predictions","absoluteDifference"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","absoluteDifference")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in absoluteDifference: ");let losses3=abs2(sub2($labels,$predictions));return computeWeightedLoss3(losses3,$weights,reduction)}var absoluteDifference2=op2({absoluteDifference_:absoluteDifference_2});function cosineDistance_2(labels,predictions,axis,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","cosineDistance"),$predictions=convertToTensor2(predictions,"predictions","cosineDistance"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","cosineDistance")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in cosineDistance: ");let one=scalar2(1),losses3=sub2(one,sum3(mul2($labels,$predictions),axis,!0));return computeWeightedLoss3(losses3,$weights,reduction)}var cosineDistance2=op2({cosineDistance_:cosineDistance_2});function hingeLoss_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","hingeLoss"),$predictions=convertToTensor2(predictions,"predictions","hingeLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","hingeLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in hingeLoss: ");let one=scalar2(1);$labels=sub2(mul2(scalar2(2),$labels),one);let losses3=relu2(sub2(one,mul2($labels,$predictions)));return computeWeightedLoss3(losses3,$weights,reduction)}var hingeLoss2=op2({hingeLoss_:hingeLoss_2});function huberLoss_2(labels,predictions,weights,delta=1,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","huberLoss"),$predictions=convertToTensor2(predictions,"predictions","huberLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","huberLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in huberLoss: ");let deltaScalar=scalar2(delta),error=abs2(sub2($predictions,$labels)),quadratic=minimum2(error,deltaScalar),linear=sub2(error,quadratic),losses3=add4(mul2(scalar2(.5),square2(quadratic)),mul2(deltaScalar,linear));return computeWeightedLoss3(losses3,$weights,reduction)}var huberLoss2=op2({huberLoss_:huberLoss_2});function logLoss_2(labels,predictions,weights,epsilon4=1e-7,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","logLoss"),$predictions=convertToTensor2(predictions,"predictions","logLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","logLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in logLoss: ");let one=scalar2(1),epsilonScalar=scalar2(epsilon4),l13=neg2(mul2($labels,log2(add4($predictions,epsilonScalar)))),l23=mul2(sub2(one,$labels),log2(add4(sub2(one,$predictions),epsilonScalar))),losses3=sub2(l13,l23);return computeWeightedLoss3(losses3,$weights,reduction)}var logLoss2=op2({logLoss_:logLoss_2});function meanSquaredError_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","meanSquaredError"),$predictions=convertToTensor2(predictions,"predictions","meanSquaredError"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","meanSquaredError")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in meanSquaredError: ");let losses3=squaredDifference4($labels,$predictions);return computeWeightedLoss3(losses3,$weights,reduction)}var meanSquaredError4=op2({meanSquaredError_:meanSquaredError_2});function sigmoidCrossEntropyWithLogits_2(labels,logits){let $labels=convertToTensor2(labels,"labels","sigmoidCrossEntropyWithLogits"),$logits=convertToTensor2(logits,"logits","sigmoidCrossEntropyWithLogits");assertShapesMatch2($labels.shape,$logits.shape,"Error in sigmoidCrossEntropyWithLogits: ");let maxOutput=relu2($logits),outputXTarget=mul2($logits,$labels),sigmoidOutput=log1p2(exp2(neg2(abs2($logits))));return add4(sub2(maxOutput,outputXTarget),sigmoidOutput)}function sigmoidCrossEntropy_2(multiClassLabels,logits,weights,labelSmoothing=0,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $multiClassLabels=convertToTensor2(multiClassLabels,"multiClassLabels","sigmoidCrossEntropy"),$logits=convertToTensor2(logits,"logits","sigmoidCrossEntropy"),$weights=null;if(weights!=null&&($weights=convertToTensor2(weights,"weights","sigmoidCrossEntropy")),assertShapesMatch2($multiClassLabels.shape,$logits.shape,"Error in sigmoidCrossEntropy: "),labelSmoothing>0){let labelSmoothingScalar=scalar2(labelSmoothing),one=scalar2(1),half=scalar2(.5);$multiClassLabels=add4(mul2($multiClassLabels,sub2(one,labelSmoothingScalar)),mul2(half,labelSmoothingScalar))}let losses3=sigmoidCrossEntropyWithLogits_2($multiClassLabels,$logits);return computeWeightedLoss3(losses3,$weights,reduction)}var sigmoidCrossEntropy2=op2({sigmoidCrossEntropy_:sigmoidCrossEntropy_2});function softmaxCrossEntropyWithLogits_2(labels,logits,dim=-1){if(dim===-1&&(dim=logits.rank-1),dim!==logits.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${logits.rank} and dim was ${dim}`);let customOp=customGrad2((labels2,logits2,save)=>{let keepDims=!0,lse=logSumExp2(logits2,[dim],keepDims),logResult=sub2(cast2(logits2,"float32"),lse);save([labels2,logResult]);let costVector=neg2(mul2(logResult,labels2)),value=sum3(costVector,[dim]),gradFunc=(dy,saved)=>{let[labels3,logResult2]=saved,dyShape=expandShapeToKeepDim2(dy.shape,[dim]);return[mul2(reshape2(dy,dyShape),sub2(cast2(labels3,"float32"),exp2(logResult2))),mul2(reshape2(dy,dyShape),sub2(exp2(logResult2),cast2(labels3,"float32")))]};return{value,gradFunc}});return customOp(labels,logits)}function softmaxCrossEntropy_2(onehotLabels,logits,weights,labelSmoothing=0,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $onehotLabels=convertToTensor2(onehotLabels,"onehotLabels","softmaxCrossEntropy"),$logits=convertToTensor2(logits,"logits","softmaxCrossEntropy"),$weights=null;if(weights!=null&&($weights=convertToTensor2(weights,"weights","softmaxCrossEntropy")),assertShapesMatch2($onehotLabels.shape,$logits.shape,"Error in softmaxCrossEntropy: "),labelSmoothing>0){let labelSmoothingScalar=scalar2(labelSmoothing),one=scalar2(1),numClasses=scalar2($onehotLabels.shape[1]);$onehotLabels=add4(mul2($onehotLabels,sub2(one,labelSmoothingScalar)),div2(labelSmoothingScalar,numClasses))}let losses3=softmaxCrossEntropyWithLogits_2($onehotLabels,$logits);return computeWeightedLoss3(losses3,$weights,reduction)}var softmaxCrossEntropy2=op2({softmaxCrossEntropy_:softmaxCrossEntropy_2});var spectral2={fft:fft2,ifft:ifft2,rfft:rfft2,irfft:irfft2},signal2={hammingWindow:hammingWindow2,hannWindow:hannWindow2,frame:frame2,stft:stft2},image2={flipLeftRight:flipLeftRight3,resizeNearestNeighbor:resizeNearestNeighbor2,resizeBilinear:resizeBilinear3,rotateWithOffset:rotateWithOffset3,cropAndResize:cropAndResize3,nonMaxSuppression:nonMaxSuppression3,nonMaxSuppressionAsync:nonMaxSuppressionAsync2,nonMaxSuppressionWithScore:nonMaxSuppressionWithScore2,nonMaxSuppressionWithScoreAsync:nonMaxSuppressionWithScoreAsync2,nonMaxSuppressionPadded:nonMaxSuppressionPadded2,nonMaxSuppressionPaddedAsync:nonMaxSuppressionPaddedAsync2},linalg2={bandPart:bandPart2,gramSchmidt:gramSchmidt2,qr:qr2},losses2={absoluteDifference:absoluteDifference2,computeWeightedLoss:computeWeightedLoss3,cosineDistance:cosineDistance2,hingeLoss:hingeLoss2,huberLoss:huberLoss2,logLoss:logLoss2,meanSquaredError:meanSquaredError4,sigmoidCrossEntropy:sigmoidCrossEntropy2,softmaxCrossEntropy:softmaxCrossEntropy2};var SELU_SCALEALPHA2=1.7580993408473768,SELU_SCALE2=1.0507009873554805;var absGradConfig2={kernelName:Abs2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,step2(cast2(x,"float32"),-1))}}};var acosGradConfig2={kernelName:Acos2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=square2(cast2(x,"float32")),b=sqrt2(sub2(scalar2(1),a));return neg2(div2(dy,b))}}}};var acoshGradConfig2={kernelName:Acosh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=sqrt2(sub2(square2(cast2(x,"float32")),1));return div2(dy,a)}}}};var addGradConfig2={kernelName:Add3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=dy,reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let res=dy,reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,b.shape)};return{a:derA,b:derB}}};var addNGradConfig2={kernelName:AddN2,saveAllInputs:!0,gradFunc:(dy,saved)=>{let ders={};return saved.forEach((_,i)=>{ders[i]=()=>dy.clone()}),ders}};var argMaxGradConfig2={kernelName:ArgMax2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>zerosLike3(x)}}};var argMinGradConfig2={kernelName:ArgMin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>zerosLike3(x)}}};var asinGradConfig2={kernelName:Asin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,sqrt2(sub2(scalar2(1),square2(cast2(x,"float32")))))}}};var asinhGradConfig2={kernelName:Asinh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=sqrt2(add4(scalar2(1),square2(cast2(x,"float32"))));return div2(dy,a)}}}};var atan2GradConfig2={kernelName:Atan22,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let d=add4(square2(a),square2(b)),res=mul2(dy,div2(b,d)),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let d=add4(square2(a),square2(b)),res=neg2(mul2(dy,div2(a,d))),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,b.shape)};return{a:derA,b:derB}}};var atanGradConfig2={kernelName:Atan3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,add4(square2(cast2(x,"float32")),1))}}};var atanhGradConfig2={kernelName:Atanh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,sub2(scalar2(1),square2(cast2(x,"float32"))))}}};function avgPool3dBackprop_2(dy,input2,filterSize,strides,dilations=[1,1,1],pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","avgPool3dBackprop"),$input=convertToTensor2(input2,"input","avgPool3dBackprop"),dy5D=$dy,input5D=$input,reshapedTo5D=!1;$input.rank===4&&(reshapedTo5D=!0,dy5D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2],$dy.shape[3]]),input5D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2],$input.shape[3]])),assert3(dy5D.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${dy5D.rank}.`),assert3(input5D.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${input5D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool3DInfo2(input5D.shape,filterSize,strides,dilations,pad7,dimRoundingMode);return backend3.avgPool3dBackprop(dy5D,input5D,convInfo)},inputs={dy:dy5D,input:input5D},attrs={filterSize,strides,dilations,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,AvgPool3DBackprop2,attrs);return reshapedTo5D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3],res.shape[4]]):res}var avgPool3dBackprop2=op2({avgPool3dBackprop_:avgPool3dBackprop_2});var avgPool3DGradConfig2={kernelName:AvgPool3D2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{filterSize,strides,dilations,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1,1]:dilations;return{x:()=>avgPool3dBackprop2(dy,x,filterSize,strides,$dilations,pad7,dimRoundingMode)}}};function avgPoolBackprop_2(dy,input2,filterSize,strides,pad7){let $dy=convertToTensor2(dy,"dy","avgPoolBackprop"),$input=convertToTensor2(input2,"input","avgPoolBackprop");assert3($input.rank===$dy.rank,()=>`Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`);let input4D=$input,dy4D=$dy,reshapedTo4D=!1;$input.rank===3&&(reshapedTo4D=!0,input4D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2]]),dy4D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2]])),assert3(dy4D.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${dy4D.rank}.`),assert3(input4D.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${input4D.rank}.`);let forward=backend3=>{let convInfo=computePool2DInfo2(input4D.shape,filterSize,strides,1,pad7);return backend3.avgPoolBackprop(dy4D,input4D,convInfo)},inputs={dy:dy4D,input:input4D},attrs={filterSize,strides,pad:pad7},res=ENGINE2.runKernelFunc(forward,inputs,null,AvgPoolBackprop2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var avgPoolBackprop4=op2({avgPoolBackprop_:avgPoolBackprop_2});var avgPoolGradConfig2={kernelName:AvgPool2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{filterSize,strides,pad:pad7}=attrs;return{x:()=>avgPoolBackprop4(dy,x,filterSize,strides,pad7)}}};var batchMatMulGradConfig2={kernelName:BatchMatMul2,inputsToSave:["a","b"],gradFunc:(dy,saved,attrs)=>{let[a,b]=saved,{transposeA,transposeB}=attrs;return!transposeA&&!transposeB?{a:()=>matMul3(dy,b,!1,!0),b:()=>matMul3(a,dy,!0,!1)}:!transposeA&&transposeB?{a:()=>matMul3(dy,b,!1,!1),b:()=>matMul3(dy,a,!0,!1)}:transposeA&&!transposeB?{a:()=>matMul3(b,dy,!1,!0),b:()=>matMul3(a,dy,!1,!1)}:{a:()=>matMul3(b,dy,!0,!0),b:()=>matMul3(dy,a,!0,!0)}}};var batchToSpaceNDGradConfig2={kernelName:BatchToSpaceND2,gradFunc:(dy,saved,attrs)=>{let{blockShape,crops}=attrs;return{x:()=>spaceToBatchND3(dy,blockShape,crops)}}};var broadcastToGradConfig2={kernelName:BroadcastTo2,gradFunc:(dy,saved,attrs)=>{let broadCastToAttrs=attrs,inputShape=broadCastToAttrs.inputShape,outputShape=broadCastToAttrs.shape,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)throw new Error(`broadcastTo(): [${inputShape}] cannot be broadcast to [${outputShape}].`);let axes=[];for(let i=0;i1&&axes.push(i);return{x:()=>sum3(dy,axes,!0)}}};var castGradConfig2={kernelName:Cast2,gradFunc:dy=>({x:()=>dy.clone()})};var ceilGradConfig2={kernelName:Ceil2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var clipByValueGradConfig2={kernelName:ClipByValue2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{clipValueMin,clipValueMax}=attrs;return{x:()=>where2(logicalAnd2(greaterEqual2(x,clipValueMin),lessEqual2(x,clipValueMax)),dy,zerosLike3(dy))}}};var concatGradConfig2={kernelName:Concat2,saveAllInputs:!0,gradFunc:(dy,saved,attrs)=>{let shapes=saved.map(t=>t.shape),{axis}=attrs,$axis=parseAxisParam2(axis,saved[0].shape)[0],sizeSplits=shapes.map(s=>s[$axis]),derTensors=split2(dy,sizeSplits,$axis);return derTensors.map(t=>()=>t)}};var conv2DGradConfig2={kernelName:Conv2D3,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let[x4D,$filter]=saved,{dilations,strides,pad:pad7,dataFormat}=attrs;return assert3(tupleValuesAreOne2(dilations),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${dilations}'`),{x:()=>conv2DBackpropInput4(x4D.shape,dy,$filter,strides,pad7,dataFormat),filter:()=>conv2DBackpropFilter3(x4D,dy,$filter.shape,strides,pad7,dataFormat)}}};var conv2DBackpropInputGradConfig2={kernelName:Conv2DBackpropInput2,inputsToSave:["dy","filter"],gradFunc:(ddx,saved,attrs)=>{let[dy,filter]=saved,{strides,pad:pad7,dataFormat,dimRoundingMode}=attrs;return{dy:()=>conv2d2(ddx,filter,strides,pad7,dataFormat,1,dimRoundingMode),filter:()=>conv2DBackpropFilter3(ddx,dy,filter.shape,strides,pad7,dataFormat,dimRoundingMode)}}};function conv3DBackpropFilter_2(x,dy,filterShape,strides,pad7){let x5D=x;x.rank===4&&(x5D=reshape2(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]));let dy5D=dy;dy5D.rank===4&&(dy5D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2],dy.shape[3]])),assert3(x5D.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${x5D.shape}.`),assert3(dy5D.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${dy5D.shape}.`),assert3(filterShape.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${filterShape}.`),assert3(x5D.shape[4]===filterShape[3],()=>`Error in conv3dDerFilter: depth of input ${x5D.shape[4]}) must match input depth in filter (${filterShape[3]}.`),assert3(dy5D.shape[4]===filterShape[4],()=>`Error in conv3dDerFilter: depth of dy (${dy5D.shape[4]}) must match output depth for filter (${filterShape[4]}).`);let forward=backend3=>{let dilations=1,convInfo=computeConv3DInfo2(x5D.shape,filterShape,strides,dilations,pad7);return backend3.conv3dDerFilter(x5D,dy5D,convInfo)},inputs={x:x5D,dy:dy5D},attrs={strides,pad:pad7,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,Conv3DBackpropFilterV22,attrs)}var conv3DBackpropFilter2=op2({conv3DBackpropFilter_:conv3DBackpropFilter_2});var conv3DGradConfig2={kernelName:Conv3D3,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let{dilations,strides,pad:pad7}=attrs;assert3(tupleValuesAreOne2(dilations),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${dilations}'`);let[x5D,$filter]=saved;return{x:()=>conv3DBackpropInput2(x5D.shape,dy,$filter,strides,pad7),filter:()=>conv3DBackpropFilter2(x5D,dy,$filter.shape,strides,pad7)}}};var cosGradConfig2={kernelName:Cos2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(neg2(sin2(cast2(x,"float32"))),dy)}}};var coshGradConfig2={kernelName:Cosh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(sinh2(cast2(x,"float32")),dy)}}};var cumsumGradConfig2={kernelName:Cumsum2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{axis,exclusive,reverse:reverse8}=attrs;return{x:()=>{let permutation=getAxesPermutation2([axis],x.rank),out=cumsum2(dy,axis,exclusive,!reverse8);return permutation!=null&&(out=transpose2(out,permutation)),out}}}};var depthwiseConv2dNativeGradConfig2={kernelName:DepthwiseConv2dNative2,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let{dilations,strides,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1]:dilations;assert3(tupleValuesAreOne2($dilations),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${$dilations}'`);let[x,filter]=saved;return assert3(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),assert3(filter.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${filter.rank}.`),assert3(x.shape[3]===filter.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${filter.shape[2]}.`),assert3(eitherStridesOrDilationsAreOne2(strides,$dilations),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${strides} and dilations '${$dilations}'.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`),{x:()=>depthwiseConv2dNativeBackpropInput3(x.shape,dy,filter,strides,pad7,dilations,dimRoundingMode),filter:()=>depthwiseConv2dNativeBackpropFilter3(x,dy,filter.shape,strides,pad7,dilations,dimRoundingMode)}}};var dilation2dGradConfig2={kernelName:Dilation2D2,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let[x,filter]=saved,inputInputs={x,filter,dy},filterInputs={x,filter,dy};return{x:()=>ENGINE2.runKernel(Dilation2DBackpropInput2,inputInputs,attrs),filter:()=>ENGINE2.runKernel(Dilation2DBackpropFilter2,filterInputs,attrs)}}};var divGradConfig2={kernelName:Div2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=div2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);reduceAxes.length>0&&(res=reshape2(sum3(res,reduceAxes),b.shape));let tmp=square2(b);return neg2(div2(res,cast2(tmp,"float32")))};return{a:derA,b:derB}}};var eluGradConfig2={kernelName:Elu3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved,backPropKernelFunc=backend3=>backend3.eluDer(dy,y),inputs={dy,y};return{x:()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,EluGrad2)}}};var erfGradConfig2={kernelName:Erf2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved,a=mul2(exp2(neg2(square2(x))),2/Math.sqrt(Math.PI));return{x:()=>mul2(dy,a)}}};var expGradConfig2={kernelName:Exp2,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(dy,y)}}};var expm1GradConfig2={kernelName:Expm12,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,exp2(x))}}};var floorGradConfig2={kernelName:Floor2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var floorDivGradConfig2={kernelName:FloorDiv2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=div2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);reduceAxes.length>0&&(res=reshape2(sum3(res,reduceAxes),b.shape));let tmp=square2(b);return neg2(div2(res,cast2(tmp,"float32")))};return{a:derA,b:derB}}};var fusedBatchNormGradConfig2={kernelName:FusedBatchNorm2,inputsToSave:["x","mean","variance","scale"],gradFunc:(dy,saved,attrs)=>{let{varianceEpsilon}=attrs,[x,mean7,variance,scale3]=saved,scaleValue=scale3==null?scalar2(1):scale3,reductionAxes=getReductionAxes2(mean7.shape,x.shape),tileShape=[];if(mean7.rank===1){for(let i=0;imean7.rank===1?reshape2(mul2(mul2(dy,tile2(reshape2(oneOverSqrtVariance,[1,1,1,mean7.shape[0]]),tileShape)),scaleValue),x.shape):reshape2(mul2(mul2(dy,oneOverSqrtVariance),scaleValue),x.shape),derMean=()=>{let meanDer=mul2(mul2(oneOverSqrtVariance,scalar2(-1)),dyTimesScaleValue);return mean7.rank===1&&(meanDer=sum3(meanDer,reductionAxes)),reshape2(meanDer,mean7.shape)},derVariance=()=>{let varianceDer=mul2(mul2(minusHalfRCube,xMinusMean),dyTimesScaleValue);return mean7.rank===1&&(varianceDer=sum3(varianceDer,reductionAxes)),reshape2(varianceDer,mean7.shape)},derScale=()=>{let xMinusMean2TimesRsqrt=mul2(xMinusMean,oneOverSqrtVariance),scaleDer=mul2(dy,xMinusMean2TimesRsqrt);return mean7.rank===1&&(scaleDer=sum3(scaleDer,reductionAxes)),reshape2(scaleDer,mean7.shape)},derOffset=()=>{let offsetDer=dy;return mean7.rank===1&&(offsetDer=sum3(offsetDer,reductionAxes)),reshape2(offsetDer,mean7.shape)};return{x:derX,mean:derMean,variance:derVariance,scale:derScale,offset:derOffset}}};var gatherGradConfig2={kernelName:GatherV22,inputsToSave:["x","indices"],gradFunc:(dy,saved,attrs)=>{let[x,indices]=saved,{axis}=attrs,parsedAxis=parseAxisParam2(axis,x.shape)[0],derX=()=>{let paramsShape=x.shape,indicesSize=indices.size,outerShape=paramsShape.slice(0,parsedAxis),outerDims=outerShape.length,innerShape=paramsShape.slice(axis,paramsShape.length).slice(1),innerDims=innerShape.length,outerAxesIndices=arrayRange2(0,outerDims),innerAxesIndices=arrayRange2(outerDims+1,outerDims+1+innerDims),valuesShape=arrayConcat2([outerShape,[indicesSize],innerShape]),values=reshape2(dy,valuesShape),reshapedIndices=reshape2(indices,[indicesSize]),transposeDims=arrayConcat2([[outerDims],outerAxesIndices,innerAxesIndices]),valuesTranspose=transpose2(values,transposeDims),paramsGrad=unsortedSegmentSum2(valuesTranspose,reshapedIndices,x.shape[parsedAxis]),invertTransposeDims=getUndoAxesPermutation2(transposeDims);return paramsGrad=transpose2(paramsGrad,invertTransposeDims),paramsGrad};return{x:derX,indices:()=>indices}}};function arrayRange2(start,stop){let result=[];for(let i=start;i{let[a,b]=saved;return{a:()=>zerosLike3(a),b:()=>zerosLike3(b)}}};var identityGradConfig2={kernelName:Identity3,gradFunc:dy=>({x:()=>cast2(dy,"float32")})};var isFiniteGradConfig2={kernelName:IsFinite2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var isInfGradConfig2={kernelName:IsInf2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var isNanGradConfig2={kernelName:IsNan2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var log1pGradConfig2={kernelName:Log1p2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,add4(x,1))}}};var logGradConfig2={kernelName:Log2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,cast2(x,"float32"))}}};var logSoftmaxGradConfig2={kernelName:LogSoftmax3,inputsToSave:[],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[value]=saved,{axis}=attrs;return{logits:()=>{let keepDims=!0,softmax7=exp2(value);return sub2(dy,mul2(sum3(dy,axis,keepDims),softmax7))}}}};function localResponseNormalizationBackprop_2(x,y,dy,depthRadius=5,bias=1,alpha=1,beta=.5){let forward=backend3=>backend3.LRNGrad(dy,x,y,depthRadius,bias,alpha,beta),inputs={x,y,dy},attrs={depthRadius,bias,alpha,beta};return ENGINE2.runKernelFunc(forward,inputs,null,LRNBackprop2,attrs)}var localResponseNormalizationBackprop2=op2({localResponseNormalizationBackprop_:localResponseNormalizationBackprop_2});var lrnGradConfig2={kernelName:LRN2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{depthRadius,bias,alpha,beta}=attrs;return{x:()=>localResponseNormalizationBackprop2(x,y,dy,depthRadius,bias,alpha,beta)}}};function gradForMinAndMax2(dy,y,xOrig,origAxes){return y.rank{let dx=mul2(dy,cast2(equal2(xOrig,y),dy.dtype));return dx}}}var maxGradConfig2={kernelName:Max2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let maxAttrs=attrs,{reductionIndices}=maxAttrs,x=saved[0],y=saved[1],origAxes=parseAxisParam2(reductionIndices,x.shape),maxGrad=gradForMinAndMax2(dy,y,x,origAxes);return{x:()=>maxGrad.x()}}};var maximumGradConfig2={kernelName:Maximum3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,derA=()=>mul2(dy,cast2(greaterEqual2(a,b),"float32")),derB=()=>mul2(dy,cast2(less2(a,b),"float32"));return{a:derA,b:derB}}};function maxPool3dBackprop_2(dy,input2,output,filterSize,strides,dilations=[1,1,1],pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","maxPool3dBackprop"),$input=convertToTensor2(input2,"input","maxPool3dBackprop"),$output=convertToTensor2(output,"output","maxPool3dBackprop"),dy5D=$dy,input5D=$input,output5D=$output,reshapedTo5D=!1;$input.rank===4&&(reshapedTo5D=!0,dy5D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2],$dy.shape[3]]),input5D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2],$input.shape[3]]),output5D=reshape2($output,[1,$output.shape[0],$output.shape[1],$output.shape[2],$output.shape[3]])),assert3(dy5D.rank===5,()=>`Error in maxPool3dBackprop: dy must be rank 5 but got rank ${dy5D.rank}.`),assert3(input5D.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${input5D.rank}.`),assert3(output5D.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${output5D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool3DInfo2(input5D.shape,filterSize,strides,dilations,pad7,dimRoundingMode);return backend3.maxPool3dBackprop(dy5D,input5D,output5D,convInfo)},inputs={dy:dy5D,input:input5D,output:output5D},attrs={filterSize,strides,dilations,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,MaxPool3DBackprop2,attrs);return reshapedTo5D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3],res.shape[4]]):res}var maxPool3dBackprop2=op2({maxPool3dBackprop_:maxPool3dBackprop_2});var maxPool3DGradConfig2={kernelName:MaxPool3D2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{filterSize,strides,dilations,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1,1]:dilations;return{x:()=>maxPool3dBackprop2(dy,x,y,filterSize,strides,$dilations,pad7,dimRoundingMode)}}};function maxPoolBackprop_2(dy,input2,output,filterSize,strides,pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","maxPoolBackprop"),$input=convertToTensor2(input2,"input","maxPoolBackprop"),$output=convertToTensor2(output,"output","maxPoolBackprop");assert3($input.rank===$dy.rank,()=>`Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`),assert3($dy.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${$dy.rank}.`),assert3($input.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${$input.rank}.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool2DInfo2($input.shape,filterSize,strides,1,pad7,dimRoundingMode);return backend3.maxPoolBackprop($dy,$input,$output,convInfo)},inputs={dy:$dy,input:$input,output:$output},attrs={filterSize,strides,pad:pad7,dimRoundingMode};return ENGINE2.runKernelFunc(forward,inputs,null,MaxPoolBackprop2,attrs)}var maxPoolBackprop4=op2({maxPoolBackprop_:maxPoolBackprop_2});var maxPoolGradConfig2={kernelName:MaxPool2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{filterSize,strides,pad:pad7}=attrs;return{x:()=>maxPoolBackprop4(dy,x,y,filterSize,strides,pad7)}}};var minGradConfig2={kernelName:Min2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let minAttrs=attrs,{axis}=minAttrs,[x,y]=saved,origAxes=parseAxisParam2(axis,x.shape),minGrad=gradForMinAndMax2(dy,y,x,origAxes);return{x:()=>minGrad.x()}}};var minimumGradConfig2={kernelName:Minimum3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,derA=()=>mul2(dy,cast2(lessEqual2(a,b),"float32")),derB=()=>mul2(dy,cast2(greater2(a,b),"float32"));return{a:derA,b:derB}}};var mirrorPadGradConfig2={kernelName:MirrorPad2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let x=saved[0],{paddings}=attrs,begin=paddings.map(p2=>p2[0]);return{x:()=>slice2(dy,begin,x.shape)}}};var modGradConfig2={kernelName:Mod2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(dy,reduceAxes),a.shape):dy},derB=()=>{let res=mul2(dy,neg2(floor2(div2(a,b)))),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),b.shape):res};return{a:derA,b:derB}}};var multiplyGradConfig2={kernelName:Multiply3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=mul2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),b.shape):res};return{a:derA,b:derB}}};var negateGradConfig2={kernelName:Negate2,gradFunc:dy=>({x:()=>neg2(dy)})};var oneHotGradConfig2={kernelName:OneHot2,inputsToSave:["indices"],gradFunc:(dy,saved)=>{let indices=saved[0];return{indices:()=>zeros2(indices.shape,"float32")}}};var onesLikeGradConfig2={kernelName:OnesLike2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var padV2GradConfig2={kernelName:PadV22,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let x=saved[0],{paddings}=attrs,begin=paddings.map(p2=>p2[0]);return{x:()=>slice2(dy,begin,x.shape)}}};var powGradConfig2={kernelName:Pow2,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(dy,saved)=>{let[a,b,y]=saved,base2=a,exp14=b,outShape=assertAndGetBroadcastShape2(base2.shape,exp14.shape),derBase=()=>{let expFloat=cast2(exp14,"float32"),res=mul2(dy,mul2(expFloat,pow2(base2,sub2(expFloat,scalar2(1))))),reduceAxes=getReductionAxes2(base2.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,base2.shape)},derExp=()=>{let condition=greater2(base2,0),logBase=where2(condition,log2(base2),zerosLike3(base2)),res=mul2(dy,mul2(y,logBase)),reduceAxes=getReductionAxes2(exp14.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,exp14.shape)};return{a:derBase,b:derExp}}};var preluGradConfig2={kernelName:Prelu2,inputsToSave:["x","alpha"],gradFunc:(dy,saved)=>{let[x,alpha]=saved,mask=greater2(x,0);return{x:()=>where2(mask,dy,mul2(dy,alpha)),alpha:()=>{let res=where2(mask,zerosLike3(dy),mul2(dy,x)),reduceAxes=getReductionAxes2(alpha.shape,dy.shape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,alpha.shape)}}}};var reciprocalGradConfig2={kernelName:Reciprocal2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,neg2(square2(x)))}}};var relu6GradConfig2={kernelName:Relu63,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved,mask=mul2(lessEqual2(x,6),step2(x));return{x:()=>mul2(dy,cast2(mask,"float32"))}}};var reluGradConfig2={kernelName:Relu3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,cast2(step2(x),"float32"))}}};var reshapeGradConfig2={kernelName:Reshape3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>reshape2(dy,x.shape)}}};var resizeBilinearGradConfig2={kernelName:ResizeBilinear2,inputsToSave:["images"],gradFunc:(dy,saved,attrs)=>{let[images]=saved,backPropKernelFunc=backend3=>{let{alignCorners}=attrs;return backend3.resizeBilinearBackprop(dy,images,alignCorners)},inputs={images},imagesDer=()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,ResizeBilinearGrad2,attrs);return{images:imagesDer}}};var resizeNearestNeighborGradConfig2={kernelName:ResizeNearestNeighbor2,inputsToSave:["images"],gradFunc:(dy,saved,attrs)=>{let[images]=saved,backPropKernelFunc=backend3=>{let{alignCorners}=attrs;return backend3.resizeNearestNeighborBackprop(dy,images,alignCorners)},inputs={images},imagesDer=()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,ResizeNearestNeighborGrad2,attrs);return{images:imagesDer}}};var reverseGradConfig2={kernelName:Reverse2,gradFunc:(dy,saved,attrs)=>{let{dims}=attrs,axes=parseAxisParam2(dims,dy.shape);return{x:()=>reverse2(dy,axes)}}};var roundGradConfig2={kernelName:Round2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var rsqrtGradConfig2={kernelName:Rsqrt2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>neg2(div2(dy,mul2(pow2(x,1.5),2)))}}};var selectV2PoolGradConfig2={kernelName:SelectV22,inputsToSave:["condition"],gradFunc:(dy,saved)=>{let[condition]=saved;return{condition:()=>cast2(zerosLike3(condition),"float32"),t:()=>mul2(dy,cast2(condition,dy.dtype)),e:()=>mul2(dy,cast2(logicalNot3(condition),dy.dtype))}}};var seluGradConfig2={kernelName:Selu3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let mask=greater2(x,scalar2(0)),scaleAlpha2=scalar2(SELU_SCALEALPHA2),scale3=scalar2(SELU_SCALE2),greaterThanZeroDer=mul2(dy,scale3),lessEqualZeroDer=mul2(mul2(dy,scaleAlpha2),exp2(cast2(x,"float32")));return where2(mask,greaterThanZeroDer,lessEqualZeroDer)}}}};var sigmoidGradConfig2={kernelName:Sigmoid3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(dy,mul2(y,sub2(scalar2(1),y)))}}};var signGradConfig2={kernelName:Sign2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var sinGradConfig2={kernelName:Sin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(cos2(cast2(x,"float32")),dy)}}};var sinhGradConfig2={kernelName:Sinh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(cosh2(cast2(x,"float32")),dy)}}};var sliceGradConfig2={kernelName:Slice2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{begin,size}=attrs,inputShape=x.shape,[begin_,size_]=parseSliceParams2(x,begin,size),paddings=[];for(let i=0;ipad2(dy,paddings)}}};var softmaxGradConfig2={kernelName:Softmax4,outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[y]=saved,{dim}=attrs,keepDims=!0,dyTimesY=mul2(dy,y);return{logits:()=>sub2(dyTimesY,mul2(sum3(dyTimesY,[dim],keepDims),y))}}};var softplusGradConfig2={kernelName:Softplus3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,sigmoid3(x))}}};var spaceToBatchNDGradConfig2={kernelName:SpaceToBatchND2,gradFunc:(dy,saved,attrs)=>{let{blockShape,paddings}=attrs;return{x:()=>batchToSpaceND2(dy,blockShape,paddings)}}};var splitVGradConfig2={kernelName:SplitV2,gradFunc:(dy,saved,attrs)=>{let{axis}=attrs;return{x:()=>concat2(dy,axis)}}};var sqrtGradConfig2={kernelName:Sqrt2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,mul2(sqrt2(cast2(x,"float32")),2))}}};var squareGradConfig2={kernelName:Square2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,mul2(cast2(x,"float32"),2))}}};var squaredDifferenceGradConfig2={kernelName:SquaredDifference2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,two=scalar2(2),derA=()=>mul2(dy,mul2(two,sub2(a,b))),derB=()=>mul2(dy,mul2(two,sub2(b,a)));return{a:derA,b:derB}}};var stepGradConfig2={kernelName:Step2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var subGradConfig2={kernelName:Sub2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=dy,reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let res=dy,reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(neg2(res),b.shape)};return{a:derA,b:derB}}};var sumGradConfig2={kernelName:Sum2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,expandedDyShape=x.shape.slice(),{axis}=attrs,axes=parseAxisParam2(axis,x.shape);axes.forEach(axis2=>{expandedDyShape[axis2]=1});let expandedDy=reshape2(dy,expandedDyShape),derX=mul2(expandedDy,ones4(x.shape,"float32"));return{x:()=>derX}}};var tanGradConfig2={kernelName:Tan2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,square2(cos2(x)))}}};var tanhGradConfig2={kernelName:Tanh3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(sub2(scalar2(1),square2(y)),dy)}}};var tileGradConfig2={kernelName:Tile2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{reps}=attrs,derX=()=>{let xGrad=zerosLike3(x);if(x.rank===1)for(let i=0;i{let transposeAttrs=attrs,{perm}=transposeAttrs,undoPerm=getUndoAxesPermutation2(perm);return{x:()=>transpose2(dy,undoPerm)}}};var unpackGradConfig2={kernelName:Unpack2,gradFunc:(dy,saved,attrs)=>{let unpackAttrs=attrs,{axis}=unpackAttrs;return{value:()=>stack2(dy,axis)}}};var unsortedSegmentSumGradConfig2={kernelName:UnsortedSegmentSum2,inputsToSave:["segmentIds"],gradFunc:(dy,saved)=>{let[segmentIds]=saved,derX=()=>gatherDropNegatives2(dy,segmentIds);return{x:derX}}};function gatherDropNegatives2(x,indices){let zeroClippedIndices=maximum2(indices,zerosLike3(indices)),gathered=gather2(x,zeroClippedIndices),isPositive=greaterEqual2(indices,scalar2(0,"int32")),numIters=gathered.rank-isPositive.rank;for(let i=0;i({x:()=>zerosLike3(dy)})};var gradConfigs2=[absGradConfig2,acosGradConfig2,acoshGradConfig2,addGradConfig2,addNGradConfig2,argMaxGradConfig2,argMinGradConfig2,asinGradConfig2,asinhGradConfig2,atan2GradConfig2,atanGradConfig2,atanhGradConfig2,avgPool3DGradConfig2,avgPoolGradConfig2,batchMatMulGradConfig2,batchToSpaceNDGradConfig2,broadcastToGradConfig2,castGradConfig2,ceilGradConfig2,clipByValueGradConfig2,concatGradConfig2,conv2DBackpropInputGradConfig2,conv2DGradConfig2,conv3DGradConfig2,cosGradConfig2,coshGradConfig2,cumsumGradConfig2,depthwiseConv2dNativeGradConfig2,dilation2dGradConfig2,divGradConfig2,eluGradConfig2,erfGradConfig2,expGradConfig2,expm1GradConfig2,floorDivGradConfig2,floorGradConfig2,fusedBatchNormGradConfig2,gatherGradConfig2,greaterEqualGradConfig2,identityGradConfig2,isFiniteGradConfig2,isInfGradConfig2,isNanGradConfig2,log1pGradConfig2,logGradConfig2,logSoftmaxGradConfig2,lrnGradConfig2,maxGradConfig2,maxGradConfig2,maximumGradConfig2,maxPool3DGradConfig2,maxPoolGradConfig2,minGradConfig2,minimumGradConfig2,mirrorPadGradConfig2,modGradConfig2,multiplyGradConfig2,negateGradConfig2,oneHotGradConfig2,onesLikeGradConfig2,padV2GradConfig2,padV2GradConfig2,powGradConfig2,preluGradConfig2,reciprocalGradConfig2,relu6GradConfig2,reluGradConfig2,reshapeGradConfig2,resizeBilinearGradConfig2,resizeNearestNeighborGradConfig2,reverseGradConfig2,roundGradConfig2,rsqrtGradConfig2,selectV2PoolGradConfig2,seluGradConfig2,sigmoidGradConfig2,signGradConfig2,sinGradConfig2,sinhGradConfig2,sliceGradConfig2,softmaxGradConfig2,softplusGradConfig2,spaceToBatchNDGradConfig2,spaceToBatchNDGradConfig2,splitVGradConfig2,splitVGradConfig2,sqrtGradConfig2,squaredDifferenceGradConfig2,squareGradConfig2,stepGradConfig2,subGradConfig2,sumGradConfig2,tanGradConfig2,tanhGradConfig2,tileGradConfig2,transposeGradConfig2,unpackGradConfig2,unsortedSegmentSumGradConfig2,zerosLikeGradConfig2];for(let gradientConfig of gradConfigs2)registerGradient2(gradientConfig);Tensor2.prototype.abs=function(){return this.throwIfDisposed(),abs2(this)};Tensor2.prototype.acos=function(){return this.throwIfDisposed(),acos2(this)};Tensor2.prototype.acosh=function(){return this.throwIfDisposed(),acosh2(this)};Tensor2.prototype.addStrict=function(x){return this.throwIfDisposed(),addStrict2(this,x)};Tensor2.prototype.add=function(b){return this.throwIfDisposed(),add4(this,b)};Tensor2.prototype.all=function(axis,keepDims){return this.throwIfDisposed(),all2(this,axis,keepDims)};Tensor2.prototype.any=function(axis,keepDims){return this.throwIfDisposed(),any2(this,axis,keepDims)};Tensor2.prototype.argMax=function(axis){return this.throwIfDisposed(),argMax2(this,axis)};Tensor2.prototype.argMin=function(axis){return this.throwIfDisposed(),argMin2(this,axis)};Tensor2.prototype.asScalar=function(){return this.throwIfDisposed(),assert3(this.size===1,()=>"The array must have only 1 element."),reshape2(this,[])};Tensor2.prototype.asType=function(dtype){return this.throwIfDisposed(),cast2(this,dtype)};Tensor2.prototype.as1D=function(){return this.throwIfDisposed(),reshape2(this,[this.size])};Tensor2.prototype.as2D=function(rows,columns){return this.throwIfDisposed(),reshape2(this,[rows,columns])};Tensor2.prototype.as3D=function(rows,columns,depth){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth])};Tensor2.prototype.as4D=function(rows,columns,depth,depth2){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth,depth2])};Tensor2.prototype.as5D=function(rows,columns,depth,depth2,depth3){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth,depth2,depth3])};Tensor2.prototype.asin=function(){return this.throwIfDisposed(),asin2(this)};Tensor2.prototype.asinh=function(){return this.throwIfDisposed(),asinh2(this)};Tensor2.prototype.atan=function(){return this.throwIfDisposed(),atan3(this)};Tensor2.prototype.atan2=function(b){return this.throwIfDisposed(),atan22(this,b)};Tensor2.prototype.atanh=function(){return this.throwIfDisposed(),atanh2(this)};Tensor2.prototype.avgPool=function(filterSize,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),avgPool5(this,filterSize,strides,pad7,dimRoundingMode)};Tensor2.prototype.batchToSpaceND=function(blockShape,crops){return this.throwIfDisposed(),batchToSpaceND2(this,blockShape,crops)};Tensor2.prototype.batchNorm=function(mean7,variance,offset,scale3,varianceEpsilon){return this.throwIfDisposed(),batchNorm4(this,mean7,variance,offset,scale3,varianceEpsilon)};Tensor2.prototype.broadcastTo=function(shape){return this.throwIfDisposed(),broadcastTo2(this,shape)};Tensor2.prototype.cast=function(dtype){return this.throwIfDisposed(),cast2(this,dtype)};Tensor2.prototype.ceil=function(){return this.throwIfDisposed(),ceil2(this)};Tensor2.prototype.clipByValue=function(min9,max11){return this.throwIfDisposed(),clipByValue2(this,min9,max11)};Tensor2.prototype.concat=function(x,axis){return this.throwIfDisposed(),x instanceof Tensor2&&(x=[x]),concat2([this,...x],axis)};Tensor2.prototype.conv1d=function(filter,stride,pad7,dataFormat,dilation,dimRoundingMode){return this.throwIfDisposed(),conv1d2(this,filter,stride,pad7,dataFormat,dilation,dimRoundingMode)};Tensor2.prototype.conv2dTranspose=function(filter,outputShape,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),conv2dTranspose3(this,filter,outputShape,strides,pad7,dimRoundingMode)};Tensor2.prototype.conv2d=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return this.throwIfDisposed(),conv2d2(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.cos=function(){return this.throwIfDisposed(),cos2(this)};Tensor2.prototype.cosh=function(){return this.throwIfDisposed(),cosh2(this)};Tensor2.prototype.cumsum=function(axis,exclusive,reverse8){return this.throwIfDisposed(),cumsum2(this,axis,exclusive,reverse8)};Tensor2.prototype.depthToSpace=function(blockSize,dataFormat){return this.throwIfDisposed(),depthToSpace3(this,blockSize,dataFormat)};Tensor2.prototype.depthwiseConv2D=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return deprecationWarn2("depthwiseConv2D is deprecated, use depthwiseConv2d instead"),this.throwIfDisposed(),depthwiseConv2d6(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.depthwiseConv2d=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return this.throwIfDisposed(),depthwiseConv2d6(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.dilation2d=function(filter,strides,pad7,dilations,dataFormat){return this.throwIfDisposed(),dilation2d2(this,filter,strides,pad7,dilations,dataFormat)};Tensor2.prototype.divNoNan=function(b){return this.throwIfDisposed(),divNoNan2(this,b)};Tensor2.prototype.divStrict=function(x){return this.throwIfDisposed(),divStrict2(this,x)};Tensor2.prototype.div=function(b){return this.throwIfDisposed(),div2(this,b)};Tensor2.prototype.dot=function(b){return this.throwIfDisposed(),dot2(this,b)};Tensor2.prototype.elu=function(){return this.throwIfDisposed(),elu2(this)};Tensor2.prototype.equalStrict=function(x){return this.throwIfDisposed(),equalStrict2(this,x)};Tensor2.prototype.equal=function(b){return this.throwIfDisposed(),equal2(this,b)};Tensor2.prototype.erf=function(){return this.throwIfDisposed(),erf2(this)};Tensor2.prototype.exp=function(){return this.throwIfDisposed(),exp2(this)};Tensor2.prototype.expandDims=function(axis){return this.throwIfDisposed(),expandDims3(this,axis)};Tensor2.prototype.expm1=function(){return this.throwIfDisposed(),expm12(this)};Tensor2.prototype.fft=function(){return this.throwIfDisposed(),fft2(this)};Tensor2.prototype.flatten=function(){return this.throwIfDisposed(),reshape2(this,[this.size])};Tensor2.prototype.floor=function(){return this.throwIfDisposed(),floor2(this)};Tensor2.prototype.floorDiv=function(b){return this.throwIfDisposed(),floorDiv2(this,b)};Tensor2.prototype.gather=function(indices,axis){return this.throwIfDisposed(),gather2(this,indices,axis)};Tensor2.prototype.greaterEqualStrict=function(x){return this.throwIfDisposed(),greaterEqualStrict2(this,x)};Tensor2.prototype.greaterEqual=function(b){return this.throwIfDisposed(),greaterEqual2(this,b)};Tensor2.prototype.greaterStrict=function(x){return this.throwIfDisposed(),greaterStrict2(this,x)};Tensor2.prototype.greater=function(b){return this.throwIfDisposed(),greater2(this,b)};Tensor2.prototype.ifft=function(){return this.throwIfDisposed(),ifft2(this)};Tensor2.prototype.irfft=function(){return this.throwIfDisposed(),irfft2(this)};Tensor2.prototype.isFinite=function(){return this.throwIfDisposed(),isFinite4(this)};Tensor2.prototype.isInf=function(){return this.throwIfDisposed(),isInf3(this)};Tensor2.prototype.isNaN=function(){return this.throwIfDisposed(),isNaN4(this)};Tensor2.prototype.leakyRelu=function(alpha){return this.throwIfDisposed(),leakyRelu2(this,alpha)};Tensor2.prototype.lessEqualStrict=function(x){return this.throwIfDisposed(),lessEqualStrict2(this,x)};Tensor2.prototype.lessEqual=function(b){return this.throwIfDisposed(),lessEqual2(this,b)};Tensor2.prototype.lessStrict=function(x){return this.throwIfDisposed(),lessStrict2(this,x)};Tensor2.prototype.less=function(b){return this.throwIfDisposed(),less2(this,b)};Tensor2.prototype.localResponseNormalization=function(depthRadius,bias,alpha,beta){return this.throwIfDisposed(),localResponseNormalization2(this,depthRadius,bias,alpha,beta)};Tensor2.prototype.logSigmoid=function(){return this.throwIfDisposed(),logSigmoid2(this)};Tensor2.prototype.logSoftmax=function(axis){return this.throwIfDisposed(),logSoftmax2(this,axis)};Tensor2.prototype.logSumExp=function(axis,keepDims){return this.throwIfDisposed(),logSumExp2(this,axis,keepDims)};Tensor2.prototype.log=function(){return this.throwIfDisposed(),log2(this)};Tensor2.prototype.log1p=function(){return this.throwIfDisposed(),log1p2(this)};Tensor2.prototype.logicalAnd=function(b){return this.throwIfDisposed(),logicalAnd2(this,b)};Tensor2.prototype.logicalNot=function(){return this.throwIfDisposed(),logicalNot3(this)};Tensor2.prototype.logicalOr=function(b){return this.throwIfDisposed(),logicalOr2(this,b)};Tensor2.prototype.logicalXor=function(b){return this.throwIfDisposed(),logicalXor2(this,b)};Tensor2.prototype.matMul=function(b,transposeA,transposeB){return this.throwIfDisposed(),matMul3(this,b,transposeA,transposeB)};Tensor2.prototype.maxPool=function(filterSize,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),maxPool5(this,filterSize,strides,pad7,dimRoundingMode)};Tensor2.prototype.max=function(axis,keepDims){return this.throwIfDisposed(),max2(this,axis,keepDims)};Tensor2.prototype.maximumStrict=function(x){return this.throwIfDisposed(),maximumStrict2(this,x)};Tensor2.prototype.maximum=function(b){return this.throwIfDisposed(),maximum2(this,b)};Tensor2.prototype.mean=function(axis,keepDims){return this.throwIfDisposed(),mean2(this,axis,keepDims)};Tensor2.prototype.min=function(axis,keepDims){return this.throwIfDisposed(),min2(this,axis,keepDims)};Tensor2.prototype.minimumStrict=function(x){return this.throwIfDisposed(),minimumStrict2(this,x)};Tensor2.prototype.minimum=function(b){return this.throwIfDisposed(),minimum2(this,b)};Tensor2.prototype.mirrorPad=function(paddings,mode){return this.throwIfDisposed(),mirrorPad3(this,paddings,mode)};Tensor2.prototype.modStrict=function(x){return this.throwIfDisposed(),modStrict2(this,x)};Tensor2.prototype.mod=function(b){return this.throwIfDisposed(),mod2(this,b)};Tensor2.prototype.mulStrict=function(x){return this.throwIfDisposed(),mulStrict2(this,x)};Tensor2.prototype.mul=function(b){return this.throwIfDisposed(),mul2(this,b)};Tensor2.prototype.neg=function(){return this.throwIfDisposed(),neg2(this)};Tensor2.prototype.norm=function(ord,axis,keepDims){return this.throwIfDisposed(),norm2(this,ord,axis,keepDims)};Tensor2.prototype.notEqualStrict=function(x){return this.throwIfDisposed(),notEqualStrict2(this,x)};Tensor2.prototype.notEqual=function(b){return this.throwIfDisposed(),notEqual4(this,b)};Tensor2.prototype.oneHot=function(depth,onValue=1,offValue=0){return this.throwIfDisposed(),oneHot3(this,depth,onValue,offValue)};Tensor2.prototype.onesLike=function(){return this.throwIfDisposed(),onesLike3(this)};Tensor2.prototype.pad=function(paddings,constantValue){return this.throwIfDisposed(),pad2(this,paddings,constantValue)};Tensor2.prototype.pool=function(windowShape,poolingType,padding,dilationRate,strides){return this.throwIfDisposed(),pool2(this,windowShape,poolingType,padding,dilationRate,strides)};Tensor2.prototype.powStrict=function(exp14){return this.throwIfDisposed(),powStrict2(this,exp14)};Tensor2.prototype.pow=function(exp14){return this.throwIfDisposed(),pow2(this,exp14)};Tensor2.prototype.prelu=function(alpha){return this.throwIfDisposed(),prelu2(this,alpha)};Tensor2.prototype.prod=function(axis,keepDims){return this.throwIfDisposed(),prod2(this,axis,keepDims)};Tensor2.prototype.reciprocal=function(){return this.throwIfDisposed(),reciprocal2(this)};Tensor2.prototype.relu=function(){return this.throwIfDisposed(),relu2(this)};Tensor2.prototype.relu6=function(){return this.throwIfDisposed(),relu62(this)};Tensor2.prototype.reshapeAs=function(x){return this.throwIfDisposed(),reshape2(this,x.shape)};Tensor2.prototype.reshape=function(shape){return this.throwIfDisposed(),reshape2(this,shape)};Tensor2.prototype.resizeBilinear=function(newShape2D,alignCorners){return this.throwIfDisposed(),resizeBilinear3(this,newShape2D,alignCorners)};Tensor2.prototype.resizeNearestNeighbor=function(newShape2D,alignCorners){return this.throwIfDisposed(),resizeNearestNeighbor2(this,newShape2D,alignCorners)};Tensor2.prototype.reverse=function(axis){return this.throwIfDisposed(),reverse2(this,axis)};Tensor2.prototype.rfft=function(){return this.throwIfDisposed(),rfft2(this)};Tensor2.prototype.round=function(){return this.throwIfDisposed(),round3(this)};Tensor2.prototype.rsqrt=function(){return this.throwIfDisposed(),rsqrt2(this)};Tensor2.prototype.selu=function(){return this.throwIfDisposed(),selu2(this)};Tensor2.prototype.separableConv2d=function(depthwiseFilter,pointwiseFilter,strides,pad7,dilation,dataFormat){return this.throwIfDisposed(),separableConv2d3(this,depthwiseFilter,pointwiseFilter,strides,pad7,dilation,dataFormat)};Tensor2.prototype.sigmoid=function(){return this.throwIfDisposed(),sigmoid3(this)};Tensor2.prototype.sign=function(){return this.throwIfDisposed(),sign2(this)};Tensor2.prototype.sin=function(){return this.throwIfDisposed(),sin2(this)};Tensor2.prototype.sinh=function(){return this.throwIfDisposed(),sinh2(this)};Tensor2.prototype.slice=function(begin,size){return this.throwIfDisposed(),slice2(this,begin,size)};Tensor2.prototype.softmax=function(dim){return this.throwIfDisposed(),softmax2(this,dim)};Tensor2.prototype.softplus=function(){return this.throwIfDisposed(),softplus2(this)};Tensor2.prototype.spaceToBatchND=function(blockShape,paddings){return this.throwIfDisposed(),spaceToBatchND3(this,blockShape,paddings)};Tensor2.prototype.split=function(numOrSizeSplits,axis){return this.throwIfDisposed(),split2(this,numOrSizeSplits,axis)};Tensor2.prototype.sqrt=function(){return this.throwIfDisposed(),sqrt2(this)};Tensor2.prototype.square=function(){return this.throwIfDisposed(),square2(this)};Tensor2.prototype.squaredDifference=function(b){return this.throwIfDisposed(),squaredDifference4(this,b)};Tensor2.prototype.squaredDifferenceStrict=function(x){return this.throwIfDisposed(),squaredDifferenceStrict2(this,x)};Tensor2.prototype.squeeze=function(axis){return this.throwIfDisposed(),squeeze2(this,axis)};Tensor2.prototype.stack=function(x,axis){this.throwIfDisposed();let tensorsToBeStacked=x instanceof Tensor2?[this,x]:[this,...x];return stack2(tensorsToBeStacked,axis)};Tensor2.prototype.step=function(alpha){return this.throwIfDisposed(),step2(this,alpha)};Tensor2.prototype.stridedSlice=function(begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask){return this.throwIfDisposed(),stridedSlice3(this,begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask)};Tensor2.prototype.subStrict=function(x){return this.throwIfDisposed(),subStrict2(this,x)};Tensor2.prototype.sub=function(b){return this.throwIfDisposed(),sub2(this,b)};Tensor2.prototype.sum=function(axis,keepDims){return this.throwIfDisposed(),sum3(this,axis,keepDims)};Tensor2.prototype.tan=function(){return this.throwIfDisposed(),tan2(this)};Tensor2.prototype.tanh=function(){return this.throwIfDisposed(),tanh3(this)};Tensor2.prototype.tile=function(reps){return this.throwIfDisposed(),tile2(this,reps)};Tensor2.prototype.toBool=function(){return this.throwIfDisposed(),cast2(this,"bool")};Tensor2.prototype.toFloat=function(){return this.throwIfDisposed(),cast2(this,"float32")};Tensor2.prototype.toInt=function(){return this.throwIfDisposed(),cast2(this,"int32")};Tensor2.prototype.topk=function(k,sorted){return this.throwIfDisposed(),topk2(this,k,sorted)};Tensor2.prototype.transpose=function(perm){return this.throwIfDisposed(),transpose2(this,perm)};Tensor2.prototype.unique=function(axis){return this.throwIfDisposed(),unique2(this,axis)};Tensor2.prototype.unsortedSegmentSum=function(segmentIds,numSegments){return this.throwIfDisposed(),unsortedSegmentSum2(this,segmentIds,numSegments)};Tensor2.prototype.unstack=function(axis){return this.throwIfDisposed(),unstack2(this,axis)};Tensor2.prototype.where=function(condition,x){return this.throwIfDisposed(),where2(condition,this,x)};Tensor2.prototype.zerosLike=function(){return this.throwIfDisposed(),zerosLike3(this)};function imageToSquare(input2,inputSize,centerImage=!1){let{Image,Canvas}=env2.getEnv();if(!(input2 instanceof Image||input2 instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input2),scale3=inputSize/Math.max(dims.height,dims.width),width=scale3*dims.width,height=scale3*dims.height,targetCanvas=createCanvas2({width:inputSize,height:inputSize}),inputCanvas=input2 instanceof Canvas?input2:createCanvasFromMedia(input2),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input2)){this._imageTensors[idx]=input2,this._inputDimensions[idx]=input2.shape;return}if(isTensor4D(input2)){let batchSize=input2.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input2,this._inputDimensions[idx]=input2.shape.slice(1);return}let canvas=input2 instanceof env2.getEnv().Canvas?input2:createCanvasFromMedia(input2);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range2(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tidy2(()=>{let inputTensors=range2(this.batchSize,0,1).map(batchIdx=>{let input2=this.getInput(batchIdx);if(input2 instanceof Tensor2){let imgTensor=isTensor4D(input2)?input2:input2.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=image2.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input2 instanceof env2.getEnv().Canvas)return browser_exports2.fromPixels(imageToSquare(input2,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input2}`)}),batchTensor=stack2(inputTensors.map(t=>cast2(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input2,i)=>{if(!isMediaElement(input2)&&!isTensor3D(input2)&&!isTensor4D(input2))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input2)){let batchSize=input2.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input2=>isMediaElement(input2)&&awaitMediaLoaded(input2))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input2,detections){let{Canvas}=env2.getEnv(),canvas=input2;if(!(input2 instanceof Canvas)){let netInput=await toNetInput(input2);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas2({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init2){let fetch3=env2.getEnv().fetch,res=await fetch3(url,init2);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return io_exports.loadWeights(manifest,modelBaseUri)}function matchDimensions(input2,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input2.width=width,input2.height=height,{width,height}}var NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor163){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor163}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor163})=>{this.reassignParamFromPath(path,tensor163.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable4})=>{let tensor163=tensor4(variable4.dataSync());variable4.dispose(),this.reassignParamFromPath(path,tensor163)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor163})=>Array.from(tensor163.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env2.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights2=io_exports.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights2(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}};function depthwiseSeparableConv(x,params,stride){return tidy(()=>{let out=separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=add2(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tidy(()=>{let out1=relu(isFirstLayer?add2(conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=relu(add2(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return relu(add2(out1,add2(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tidy(()=>{let out1=relu(isFirstLayer?add2(conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=relu(add2(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=relu(add2(out1,add2(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return relu(add2(out1,add2(out2,add2(out3,out4))))})}function convLayer(x,params,padding="same",withRelu=!1){return tidy(()=>{let out=add2(conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor163=weightMap[originalPath];if(!isTensor(tensor163,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor163}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor163}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input2){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}};function fullyConnectedLayer(x,params){return tidy(()=>add2(matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input2){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tidy(()=>{let bottleneckFeatures=input2 instanceof NetInput?this.faceFeatureExtractor.forwardInput(input2):input2;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input2){return tidy(()=>softmax(this.runNet(input2)))}async forward(input2){return this.forwardInput(await toNetInput(input2))}async predictExpressions(input2){let netInput=await toNetInput(input2),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round2(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range2(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range2(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return add2(conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(relu(out),params.separable_conv1,[1,1]),out=maxPool(out,[3,3],[2,2],"same"),out=add2(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(relu(out),params.separable_conv2,[1,1]),out=add2(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input2){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(256)),out=relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range2(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input2){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tidy(()=>{let bottleneckFeatures=input2 instanceof NetInput?this.faceFeatureExtractor.forwardInput(input2):input2,pooled=avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input2){return tidy(()=>{let{age,gender}=this.runNet(input2);return{age,gender:softmax(gender)}})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async predictAgeAndGender(input2){let netInput=await toNetInput(input2),out=await this.forwardInput(netInput),ages=unstack(out.age),genders=unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale3=inputSize/Math.max(height,width);return{width:width*scale3,height:height*scale3}}),batchSize=inputDimensions.length;return tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>stack([fill([68],fillX,"float32"),fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding2=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding2(batchIdx,(w,h)=>wgetPadding2(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input2){return tidy(()=>{let out=this.runNet(input2);return this.postProcess(out,input2.inputSize,input2.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async detectLandmarks(input2){let netInput=await toNetInput(input2),landmarkTensors=tidy(()=>unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven2(i)),yCoords=landmarksArray.filter((_,i)=>!isEven2(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input2){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};function scale2(x,params){return add2(mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=conv2d(x,filters,strides,padding);return out=add2(out,bias),out=scale2(out,params.scale),withRelu?relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tidy(()=>transpose(tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tensor1d(extractWeights(numWeights)),biases=tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale3=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale3}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tidy(()=>transpose(tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale3=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale3}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=add2(out,x),out=relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=avgPool(x,2,2,"valid"),zeros10=zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=zeros(padShapeX);out=concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=zeros(padShapeY);out=concat([out,zerosH],2)}return pooled=isPad?concat([pooled,zeros10],3):pooled,out=add2(pooled,out),out=relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input2){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(256)),out=convDown(normalized,params.conv32_down);out=maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=matMul(globalAvg,params.fc);return fullyConnected})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async computeFaceDescriptor(input2){let netInput=await toNetInput(input2),faceDescriptorTensors=tidy(()=>unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tensor1d(extractWeights(numChannels)),batch_norm_offset=tensor1d(extractWeights(numChannels)),batch_norm_mean=tensor1d(extractWeights(numChannels)),batch_norm_variance=tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function pointwiseConvLayer(x,params,strides){return tidy(()=>{let out=conv2d(x,params.filters,strides,"same");return out=add2(out,params.batch_norm_offset),clipByValue(out,0,6)})}var epsilon3=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tidy(()=>{let out=depthwiseConv2d(x,params.filters,strides,"same");return out=batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon3),clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function getCenterCoordinatesAndSizesLayer(x){let vec=unstack(transpose(x,[1,0])),sizes=[sub(vec[2],vec[0]),sub(vec[3],vec[1])],centers=[add2(vec[0],div(sizes[0],scalar(2))),add2(vec[1],div(sizes[1],scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=unstack(transpose(x1,[1,0])),div0_out=div(mul(exp(div(vec[2],scalar(5))),sizes[0]),scalar(2)),add0_out=add2(mul(div(vec[0],scalar(10)),sizes[0]),centers[0]),div1_out=div(mul(exp(div(vec[3],scalar(5))),sizes[1]),scalar(2)),add1_out=add2(mul(div(vec[1],scalar(10)),sizes[1]),centers[1]);return transpose(stack([sub(add0_out,div0_out),sub(add1_out,div1_out),add2(add0_out,div0_out),add2(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(reshape(tile(params.extra_dim,[batchSize,1,1]),[-1,4]),reshape(boxPredictions,[-1,4]));boxes=reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=sigmoid(slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=unstack(boxes),scoresByBatch=unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}function boxPredictionLayer(x,params){return tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input2){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(512,!1),"float32"),x=sub(mul(batchTensor,scalar(.007843137718737125)),scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async locateFaces(input2,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input2),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression4(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME2="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",isNumber3=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber3(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber3(a.x)&&isNumber3(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber3)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}function leaky(x){return tidy(()=>{let min9=mul(x,scalar(.10000000149011612));return add2(relu(sub(x,min9)),min9)})}function convWithBatchNorm(x,params){return tidy(()=>{let out=pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=conv2d(out,params.conv.filters,[1,1],"valid"),out=sub(out,params.bn.sub),out=mul(out,params.bn.truediv),out=add2(out,params.conv.bias),leaky(out)})}function depthwiseSeparableConv3(x,params){return tidy(()=>{let out=pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=add2(out,params.bias),leaky(out)})}function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub30=tensor1d(extractWeights(size)),truediv=tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub30,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub30=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub30,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input2,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input2,inputSize){return await this.forwardInput(await toNetInput(input2),inputSize)}async detect(input2,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input2),out=await this.forwardInput(netInput,inputSize),out0=tidy(()=>unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression2(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid2(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid2(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max11,curr)=>max11.classScore>curr.classScore?max11:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input2,forwardParams){let objectDetections=await this.detect(input2,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME2}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function extractAllFacesAndComputeResults(parentResults,input2,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input2 instanceof Tensor?await extractFaceTensors(input2,faceBoxes):await extractFaces(input2,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input2,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input2,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input2,forwardParams){let objectDetections=await this.detect(input2,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input2,options)=>nets.ssdMobilenetv1.locateFaces(input2,options),tinyFaceDetector=(input2,options)=>nets.tinyFaceDetector.locateFaces(input2,options),tinyYolov23=(input2,options)=>nets.tinyYolov2.locateFaces(input2,options),detectFaceLandmarks=input2=>nets.faceLandmark68Net.detectLandmarks(input2),detectFaceLandmarksTiny=input2=>nets.faceLandmark68TinyNet.detectLandmarks(input2),computeFaceDescriptor=input2=>nets.faceRecognitionNet.computeFaceDescriptor(input2),recognizeFaceExpressions=input2=>nets.faceExpressionNet.predictExpressions(input2),predictAgeAndGender=input2=>nets.ageGenderNet.predictAgeAndGender(input2),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input2,extractedFaces){super();this.parentTask=parentTask;this.input=input2;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input2,extractedFaces){super();this.parentTask=parentTask;this.input=input2;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input2){super();this.parentTask=parentTask;this.input=input2}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input2,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input2;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input2,options=new SsdMobilenetv1Options){super();this.input=input2;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input:input2,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input3=>nets.tinyFaceDetector.locateFaces(input3,options):options instanceof SsdMobilenetv1Options?input3=>nets.ssdMobilenetv1.locateFaces(input3,options):options instanceof TinyYolov2Options?input3=>nets.tinyYolov2.locateFaces(input3,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input2)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input2,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input2,options)}function detectAllFaces(input2,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input2,options)}async function allFacesSsdMobilenetv1(input2,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input2,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input2,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input2,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count2=1,createUniqueLabel=()=>`person ${count2++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json18){let labeledDescriptors=json18.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json18.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version3="0.9.1",node=typeof process!="undefined",browser=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version4={faceapi:version3,node,browser};export{AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,TinyYolov2SizeType,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas2 as createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw_exports as draw,env2 as env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression2 as nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid2 as sigmoid,ssdMobilenetv1,tfjs_esm_exports as tf,tinyFaceDetector,tinyYolov23 as tinyYolov2,toNetInput,utils_exports as utils,validateConfig,version4 as version}; /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/face-api.esm.json b/dist/face-api.esm.json index c4210c9..21bde09 100644 --- a/dist/face-api.esm.json +++ b/dist/face-api.esm.json @@ -13201,7 +13201,7 @@ ] }, "package.json": { - "bytes": 1409, + "bytes": 1352, "imports": [] }, "src/index.ts": { diff --git a/dist/face-api.js b/dist/face-api.js index e0effb9..8c5afe8 100644 --- a/dist/face-api.js +++ b/dist/face-api.js @@ -3969,7 +3969,7 @@ return a / b;`,DIV_PACKED=` ${$x.shape}`),assert3(inputWidth*blockSize>=0,()=>`Negative dimension size caused by overflow when multiplying ${inputWidth} and ${blockSize} for depthToSpace with input shape ${$x.shape}`),assert3(inputDepth%(blockSize*blockSize)===0,()=>`Dimension size must be evenly divisible by ${blockSize*blockSize} but is ${inputDepth} for depthToSpace with input shape ${$x.shape}`);let forward=backend3=>backend3.depthToSpace($x,blockSize,dataFormat),inputs={x:$x},attrs={blockSize,dataFormat};return ENGINE2.runKernelFunc(forward,inputs,null,DepthToSpace2,attrs)}var depthToSpace3=op2({depthToSpace_:depthToSpace_2});function depthwiseConv2d_2(x,filter,strides,pad7,dataFormat="NHWC",dilations=[1,1],dimRoundingMode){let $x=convertToTensor2(x,"x","depthwiseConv2d"),$filter=convertToTensor2(filter,"filter","depthwiseConv2d"),x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(x4D.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${x4D.rank}.`),assert3($filter.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${$filter.rank}.`),assert3(x4D.shape[3]===$filter.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${x4D.shape[3]}) must match the inChannels dimension in filter ${$filter.shape[2]}.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=(backend3,save)=>{dilations==null&&(dilations=[1,1]),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`);let convInfo=computeConv2DInfo2(x4D.shape,$filter.shape,strides,dilations,pad7,dimRoundingMode,!0),res2=backend3.depthwiseConv2D(x4D,$filter,convInfo);return save([x4D,$filter]),res2},inputs={x:x4D,filter:$filter},attrs={strides,pad:pad7,dataFormat,dilations,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNative2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var depthwiseConv2d6=op2({depthwiseConv2d_:depthwiseConv2d_2});function dilation2d_2(x,filter,strides,pad7,dilations=[1,1],dataFormat="NHWC"){let $x=convertToTensor2(x,"x","dilation2d"),$filter=convertToTensor2(filter,"filter","dilation2d");assert3($x.rank===3||$x.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${$x.rank}.`),assert3($filter.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${$filter.rank}.`),assert3(dataFormat==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${dataFormat}`);let x4D=$x,reshapedTo4D=!1;$x.rank===3&&(x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]]),reshapedTo4D=!0);let inputs={x:x4D,filter:$filter},attrs={strides,pad:pad7,dilations},res=ENGINE2.runKernel(Dilation2D2,inputs,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var dilation2d2=op2({dilation2d_:dilation2d_2});function getReductionAxes2(inShape,outShape){let result=[];for(let i=0;i1)&&result.unshift(outAxis)}return result}function assertAndGetBroadcastShape2(shapeA,shapeB){let result=[],l=Math.max(shapeA.length,shapeB.length);for(let i=0;ibackend3.equal($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Equal2)}var equal2=op2({equal_:equal_2});function where_2(condition,a,b){let $a=convertToTensor2(a,"a","where"),$b=convertToTensor2(b,"b","where"),$condition=convertToTensor2(condition,"condition","where","bool"),broadcastShape=assertAndGetBroadcastShape2($a.shape,$b.shape),$broadcastedA=broadcastTo2($a,broadcastShape),$broadcastedB=broadcastTo2($b,broadcastShape);$condition.rank===1&&assert3($condition.shape[0]===$a.shape[0],()=>"The first dimension of `a` must match the size of `condition`."),$condition.rank!==1&&assertShapesMatch2($condition.shape,$broadcastedB.shape,"Error in where: ");let forward=(backend3,save)=>{let res=backend3.select($condition,$broadcastedA,$broadcastedB);return save([$condition]),res},inputs={condition:$condition,t:$broadcastedA,e:$broadcastedB};return ENGINE2.runKernelFunc(forward,inputs,null,SelectV22)}var where2=op2({where_:where_2});function zerosLike_2(x){let $x=convertToTensor2(x,"x","zerosLike"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.zerosLike($x),inputs,null,ZerosLike2)}var zerosLike3=op2({zerosLike_:zerosLike_2});function divNoNan_2(a,b){let $a=convertToTensor2(a,"a","div"),$b=convertToTensor2(b,"b","div");[$a,$b]=makeTypesMatch2($a,$b);let divResult=div2($a,$b),zeros10=zerosLike3(divResult),bEqualsZero=equal2($b,zeros10);return where2(bEqualsZero,zeros10,divResult)}var divNoNan2=op2({divNoNan_:divNoNan_2});function dot_2(t1,t2){let $t1=convertToTensor2(t1,"t1","dot"),$t2=convertToTensor2(t2,"t2","dot");assert3(($t1.rank===1||$t1.rank===2)&&($t2.rank===1||$t2.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${$t1.rank} and ${$t2.rank}.`);let t1Inner=$t1.rank===1?$t1.size:$t1.shape[1],t2Inner=$t2.rank===1?$t2.size:$t2.shape[0];if(assert3(t1Inner===t2Inner,()=>`Error in dot: inner dimensions of inputs must match, but got ${t1Inner} and ${t2Inner}.`),$t1.rank===1&&$t2.rank===1){let t12D=reshape2($t1,[1,-1]),t22D=reshape2($t2,[-1,1]),t1t2=matMul3(t12D,t22D);return reshape2(t1t2,[])}else if($t1.rank===1&&$t2.rank===2){let t12D=reshape2($t1,[1,-1]),t22D=reshape2($t2,[$t2.shape[0],$t2.shape[1]]),t1t2=matMul3(t12D,t22D);return reshape2(t1t2,[t1t2.size])}else if($t1.rank===2&&$t2.rank===1){let t22D=reshape2($t2,[-1,1]),t1t2=matMul3($t1,t22D);return reshape2(t1t2,[t1t2.size])}else{let t22D=reshape2($t2,[$t2.shape[0],$t2.shape[1]]),t1t2=matMul3($t1,t22D);return t1t2}}var dot2=op2({dot_:dot_2});function elu_2(x){let $x=convertToTensor2(x,"x","elu"),forward=(backend3,save)=>{let y=backend3.elu($x);return save([y]),y},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Elu3)}var elu2=op2({elu_:elu_2});function erf_2(x){let $x=convertToTensor2(x,"x","erf");assert3($x.dtype==="int32"||$x.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),$x.dtype==="int32"&&($x=cast2($x,"float32"));let inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.erf($x);return save([$x]),res},inputs,null,Erf2)}var erf2=op2({erf_:erf_2});function exp_2(x){let $x=convertToTensor2(x,"x","exp"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.exp($x);return save([res]),res},inputs,null,Exp2)}var exp2=op2({exp_:exp_2});function expandDims_2(x,axis=0){let parseAs=null,$x=convertToTensor2(x,"x","expandDims",parseAs);assert3(axis<=$x.rank,()=>"Axis must be <= rank of the tensor");let newShape=$x.shape.slice();return axis<0&&(assert3(-($x.rank+1)<=axis,()=>`Axis must be in the interval [${-($x.rank+1)}, ${$x.rank}]`),axis=$x.rank+axis+1),newShape.splice(axis,0,1),reshape2($x,newShape)}var expandDims3=op2({expandDims_:expandDims_2});function expm1_2(x){let $x=convertToTensor2(x,"x","expm1"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.expm1($x);return save([$x]),res},inputs,null,Expm12)}var expm12=op2({expm1_:expm1_2});function tile_2(x,reps){let parseAs=null,$x=convertToTensor2(x,"x","tile",parseAs);assert3($x.rank===reps.length,()=>`Error in transpose: rank of input ${$x.rank} must match length of reps ${reps}.`);let forward=(backend3,save)=>{let res=backend3.tile($x,reps);return save([$x]),res},inputsToSave=[$x],inputs={x:$x},attrs={reps};return ENGINE2.runKernelFunc(forward,inputs,null,Tile2,attrs,inputsToSave)}var tile2=op2({tile_:tile_2});function eye_2(numRows,numColumns,batchShape,dtype="float32"){numColumns==null&&(numColumns=numRows);let buff=buffer2([numRows,numColumns],dtype),n=numRows<=numColumns?numRows:numColumns;for(let i=0;ibackend3.fill(shape,value,dtype),{},null,Fill2,attrs)}function floor_2(x){let $x=convertToTensor2(x,"x","floor"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.floor($x),inputs,null,Floor2)}var floor2=op2({floor_:floor_2});function collectGatherOpShapeInfo2(x,indices,axis){let dimSize=x.shape[axis],outputShape=[],batchSize=1,sliceSize=1;for(let i=0;i{let parsedAxis=parseAxisParam2(axis,$x.shape)[0],shapeInfo=collectGatherOpShapeInfo2($x,$indices,parsedAxis),res=backend3.gather($x,reshape2($indices,[$indices.size]),parsedAxis);return save([$x,$indices]),reshape2(res,shapeInfo.outputShape)};return ENGINE2.runKernelFunc(forward,inputs,null,GatherV22,attrs)}var gather2=op2({gather_:gather_2});function greater_2(a,b){let $a=convertToTensor2(a,"a","greater"),$b=convertToTensor2(b,"b","greater");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=backend3=>backend3.greater($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Greater2)}var greater2=op2({greater_:greater_2});function greaterEqual_2(a,b){let $a=convertToTensor2(a,"a","greaterEqual"),$b=convertToTensor2(b,"b","greaterEqual");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.greaterEqual($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,GreaterEqual2)}var greaterEqual2=op2({greaterEqual_:greaterEqual_2});function imag_2(input2){let $input=convertToTensor2(input2,"input","imag"),forward=backend3=>backend3.imag($input),inputs={input:$input};return ENGINE2.runKernelFunc(forward,inputs,null,Imag2)}var imag2=op2({imag_:imag_2});function isFinite_2(x){let $x=convertToTensor2(x,"x","isFinite"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.isFinite($x),inputs,null,IsFinite2)}var isFinite4=op2({isFinite_:isFinite_2});function isInf_2(x){let $x=convertToTensor2(x,"x","isInf"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.isInf($x),inputs,null,IsInf2)}var isInf3=op2({isInf_:isInf_2});function isNaN_2(x){let $x=convertToTensor2(x,"x","isNaN"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.isNaN($x),inputs,null,IsNan2)}var isNaN4=op2({isNaN_:isNaN_2});function maximum_2(a,b){let $a=convertToTensor2(a,"a","maximum"),$b=convertToTensor2(b,"b","maximum");[$a,$b]=makeTypesMatch2($a,$b),$a.dtype==="bool"&&($a=cast2($a,"int32"),$b=cast2($b,"int32")),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.maximum($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Maximum3)}var maximum2=op2({maximum_:maximum_2});function scalar2(value,dtype){if((isTypedArray2(value)&&dtype!=="string"||Array.isArray(value))&&dtype!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(dtype==="string"&&isTypedArray2(value)&&!(value instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");let shape=[],inferredShape=[];return makeTensor2(value,shape,inferredShape,dtype)}function leakyRelu_2(x,alpha=.2){let $x=convertToTensor2(x,"x","leakyRelu");return maximum2(mul2(scalar2(alpha),$x),$x)}var leakyRelu2=op2({leakyRelu_:leakyRelu_2});function less_2(a,b){let $a=convertToTensor2(a,"a","less"),$b=convertToTensor2(b,"b","less");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=backend3=>backend3.less($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Less2)}var less2=op2({less_:less_2});function lessEqual_2(a,b){let $a=convertToTensor2(a,"a","lessEqual"),$b=convertToTensor2(b,"b","lessEqual");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.lessEqual($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,LessEqual2)}var lessEqual2=op2({lessEqual_:lessEqual_2});function localResponseNormalization_2(x,depthRadius=5,bias=1,alpha=1,beta=.5){let $x=convertToTensor2(x,"x","localResponseNormalization");assert3($x.rank===4||$x.rank===3,()=>`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${$x.rank}.`),assert3(isInt2(depthRadius),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${depthRadius}.`);let x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]]));let forward=(backend3,save)=>{let y=backend3.localResponseNormalization4D(x4D,depthRadius,bias,alpha,beta);return save([x4D,y]),y},inputs={x:x4D},attrs={depthRadius,bias,alpha,beta},res=ENGINE2.runKernelFunc(forward,inputs,null,LRN2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var localResponseNormalization2=op2({localResponseNormalization_:localResponseNormalization_2});function log_2(x){let $x=convertToTensor2(x,"x","log"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.log($x);return save([$x]),res},inputs,null,Log2)}var log2=op2({log_:log_2});function log1p_2(x){let $x=convertToTensor2(x,"x","log1p"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.log1p($x);return save([$x]),res},inputs,null,Log1p2)}var log1p2=op2({log1p_:log1p_2});function customGrad2(f){return ENGINE2.customGrad(f)}function neg_2(x){let $x=convertToTensor2(x,"x","neg"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.neg($x),inputs,null,Negate2)}var neg2=op2({neg_:neg_2});function softplus_2(x){let $x=convertToTensor2(x,"x","softplus"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.softplus($x);return save([$x]),res},inputs,null,Softplus3)}var softplus2=op2({softplus_:softplus_2});function logSigmoid_2(x){let $x=convertToTensor2(x,"x","logSigmoid"),customOp=customGrad2(x2=>{let value=neg2(softplus2(neg2(x2))),gradFunc=dy=>{let derX=mul2(dy,sigmoid3(neg2(x2)));return derX};return{value,gradFunc}});return customOp($x)}var logSigmoid2=op2({logSigmoid_:logSigmoid_2});function max_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","max"),forward=(backend3,save)=>{let origAxes=parseAxisParam2(axis,$x.shape),axes=origAxes,permutedAxes=getAxesPermutation2(axes,$x.rank),maxInput=$x;permutedAxes!=null&&(maxInput=transpose2($x,permutedAxes),axes=getInnerMostAxes2(axes.length,maxInput.rank));let y=backend3.max(maxInput,axes);permutedAxes!=null&&maxInput.dispose();let res=y;if(keepDims){let expandedShape=expandShapeToKeepDim2(res.shape,parseAxisParam2(axis,$x.shape));res=reshape2(res,expandedShape),y.dispose()}return save([$x,res]),res},inputs={x:$x},attrs={reductionIndices:axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Max2,attrs)}var max2=op2({max_:max_2});function sub_2(a,b){let $a=convertToTensor2(a,"a","sub"),$b=convertToTensor2(b,"b","sub");[$a,$b]=makeTypesMatch2($a,$b);let forward=(backend3,save)=>{let res=backend3.subtract($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Sub2)}var sub2=op2({sub_:sub_2});function sum_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","sum");$x.dtype==="bool"&&($x=cast2($x,"int32"));let forward=(backend3,save)=>{save([$x]);let axes=parseAxisParam2(axis,$x.shape),permutation=getAxesPermutation2(axes,$x.rank),reductionAxes=axes,permutedX=$x;permutation!=null&&(permutedX=transpose2($x,permutation),reductionAxes=getInnerMostAxes2(reductionAxes.length,$x.rank));let value=backend3.sum(permutedX,reductionAxes);if(keepDims){let newShape=expandShapeToKeepDim2(value.shape,axes);value=reshape2(value,newShape)}return value},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Sum2,attrs)}var sum3=op2({sum_:sum_2});function logSoftmax_2(logits,axis=-1){let $logits=convertToTensor2(logits,"logits","logSoftmax");if(axis===-1&&(axis=$logits.rank-1),axis!==$logits.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${$logits.rank} and axis was ${axis}`);let forward=(backend3,save)=>{let keepDims=!0,xMax=max2(logits,axis,!0),shifted=sub2(logits,xMax),value=sub2(cast2(shifted,"float32"),log2(sum3(exp2(shifted),axis,keepDims)));return save([value]),value},inputs={logits:$logits},attrs={axis};return ENGINE2.runKernelFunc(forward,inputs,null,LogSoftmax3,attrs)}var logSoftmax2=op2({logSoftmax_:logSoftmax_2});function logSumExp_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","logSumExp"),axes=parseAxisParam2(axis,$x.shape),xMax=max2($x,axes,!0),a=sub2($x,xMax),b=exp2(a),c=sum3(b,axes),d=log2(c),res=add4(reshape2(xMax,d.shape),d);if(keepDims){let newShape=expandShapeToKeepDim2(res.shape,axes);return reshape2(res,newShape)}return res}var logSumExp2=op2({logSumExp_:logSumExp_2});function logicalAnd_2(a,b){let $a=convertToTensor2(a,"a","logicalAnd","bool"),$b=convertToTensor2(b,"b","logicalAnd","bool");assertAndGetBroadcastShape2($a.shape,$b.shape);let inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(backend3=>backend3.logicalAnd($a,$b),inputs,null,LogicalAnd2)}var logicalAnd2=op2({logicalAnd_:logicalAnd_2});function logicalNot_2(x){let $x=convertToTensor2(x,"x","logicalNot","bool"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.logicalNot($x),inputs,null,LogicalNot2)}var logicalNot3=op2({logicalNot_:logicalNot_2});function logicalOr_2(a,b){let $a=convertToTensor2(a,"a","logicalOr","bool"),$b=convertToTensor2(b,"b","logicalOr","bool");assertAndGetBroadcastShape2($a.shape,$b.shape);let inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(backend3=>backend3.logicalOr($a,$b),inputs,null,LogicalOr2)}var logicalOr2=op2({logicalOr_:logicalOr_2});function logicalXor_2(a,b){let $a=convertToTensor2(a,"a","logicalXor","bool"),$b=convertToTensor2(b,"b","logicalXor","bool");return assertAndGetBroadcastShape2($a.shape,$b.shape),logicalAnd2(logicalOr2(a,b),logicalNot3(logicalAnd2(a,b)))}var logicalXor2=op2({logicalXor_:logicalXor_2});function maxPool_2(x,filterSize,strides,pad7,dimRoundingMode){let $x=convertToTensor2(x,"x","maxPool"),dilations=1,x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(x4D.rank===4,()=>`Error in maxPool: input must be rank 4 but got rank ${x4D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=(backend3,save)=>{let convInfo=computePool2DInfo2(x4D.shape,filterSize,strides,1,pad7,dimRoundingMode),y;return convInfo.filterWidth===1&&convInfo.filterHeight===1&&arraysEqual2(convInfo.inShape,convInfo.outShape)?y=x4D.clone():y=backend3.maxPool(x4D,convInfo),save([x4D,y]),y},inputs={x:x4D},attrs={filterSize,strides,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,MaxPool2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var maxPool5=op2({maxPool_:maxPool_2});function zeros2(shape,dtype="float32"){if(dtype==="complex64"){let real9=zeros2(shape,"float32"),imag9=zeros2(shape,"float32");return complex2(real9,imag9)}let values=makeZerosTypedArray2(sizeFromShape2(shape),dtype);return ENGINE2.makeTensor(values,shape,dtype)}function ones4(shape,dtype="float32"){if(dtype==="complex64"){let real9=ones4(shape,"float32"),imag9=zeros2(shape,"float32");return complex2(real9,imag9)}let values=makeOnesTypedArray2(sizeFromShape2(shape),dtype);return ENGINE2.makeTensor(values,shape,dtype)}function mean_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","mean"),axes=parseAxisParam2(axis,$x.shape),shapes=computeOutAndReduceShapes2($x.shape,axes),reduceShape=shapes[1],reduceSize=sizeFromShape2(reduceShape),inputs={x:$x},attrs={axis,keepDims},forward=()=>{let reduceSizeScalar=scalar2(reduceSize),xReduce=reduceSizeScalar.dtype===$x.dtype?$x:cast2($x,reduceSizeScalar.dtype),res=div2(xReduce,reduceSizeScalar);return sum3(res,axis,keepDims)},customOp=customGrad2(x2=>{let value=ENGINE2.runKernelFunc(forward,inputs,null,Mean2,attrs),gradFunc=dy=>{let expandedDyShape=x2.shape.slice();axes.forEach(axis2=>{expandedDyShape[axis2]=1});let expandedDy=reshape2(dy,expandedDyShape),derX=div2(mul2(expandedDy,ones4(x2.shape,"float32")),reduceSize);return derX};return{value,gradFunc}});return customOp($x)}var mean2=op2({mean_:mean_2});function min_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","min"),forward=(backend3,save)=>{let origAxes=parseAxisParam2(axis,$x.shape),axes=origAxes,permutedAxes=getAxesPermutation2(axes,$x.rank),minInput=$x;permutedAxes!=null&&(minInput=transpose2($x,permutedAxes),axes=getInnerMostAxes2(axes.length,$x.rank));let y=backend3.min(minInput,axes);permutedAxes!=null&&minInput.dispose();let res=y;if(keepDims){let expandedShape=expandShapeToKeepDim2(res.shape,origAxes);res=reshape2(y,expandedShape),y.dispose()}return save([$x,res]),res},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Min2,attrs)}var min2=op2({min_:min_2});function minimum_2(a,b){let $a=convertToTensor2(a,"a","minimum"),$b=convertToTensor2(b,"b","minimum");[$a,$b]=makeTypesMatch2($a,$b),$a.dtype==="bool"&&($a=cast2($a,"int32"),$b=cast2($b,"int32")),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.minimum($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Minimum3)}var minimum2=op2({minimum_:minimum_2});function mirrorPad_2(x,paddings,mode){assert3(mode==="reflect"||mode==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${mode}.`);let $x=convertToTensor2(x,"x","mirrorPad");if($x.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");assert3(paddings.length===$x.rank,()=>`Padding doesn't match input. Must be ${$x.rank}. Got ${paddings.length}.`);let shapeOffset=mode==="reflect"?1:0;for(let i=0;i<$x.rank;i++)assert3(paddings[i].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),assert3(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}`);let attrs={paddings,mode},inputs={x:$x};return ENGINE2.runKernel(MirrorPad2,inputs,attrs)}var mirrorPad3=op2({mirrorPad_:mirrorPad_2});function mod_2(a,b){let $a=convertToTensor2(a,"a","mod"),$b=convertToTensor2(b,"b","mod");[$a,$b]=makeTypesMatch2($a,$b);let forward=(backend3,save)=>{let res=backend3.mod($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Mod2)}var mod2=op2({mod_:mod_2});function square_2(x){let $x=convertToTensor2(x,"x","square"),attrs={},inputsToSave=[$x],outputsToSave=[];return ENGINE2.runKernelFunc((backend3,save)=>(save([$x]),backend3.square($x)),{x:$x},null,"Square",attrs,inputsToSave,outputsToSave)}var square2=op2({square_:square_2});function notEqual_2(a,b){let $a=convertToTensor2(a,"a","notEqual"),$b=convertToTensor2(b,"b","notEqual");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=backend3=>backend3.notEqual($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,NotEqual2)}var notEqual4=op2({notEqual_:notEqual_2});function real_2(input2){let $input=convertToTensor2(input2,"input","real"),forward=backend3=>backend3.real($input),inputs={input:$input};return ENGINE2.runKernelFunc(forward,inputs,null,Real2)}var real2=op2({real_:real_2});function onesLike_2(x){let $x=convertToTensor2(x,"x","onesLike"),forward=(backend3,save)=>{if($x.dtype==="complex64"){let r=onesLike3(real2($x)),i=zerosLike3(imag2($x));return complex2(r,i)}return backend3.onesLike($x)},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,OnesLike2)}var onesLike3=op2({onesLike_:onesLike_2});function pad_2(x,paddings,constantValue=0){let $x=convertToTensor2(x,"x","pad");if($x.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let forward=(backend3,save)=>(save([$x]),backend3.pad($x,paddings,constantValue)),attrs={paddings,constantValue},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,PadV22,attrs)}var pad2=op2({pad_:pad_2});function spaceToBatchND_2(x,blockShape,paddings){let $x=convertToTensor2(x,"x","spaceToBatchND");assert3($x.rank>=1+blockShape.length,()=>`input rank ${$x.rank} should be > than [blockShape] ${blockShape.length}`),assert3(paddings.length===blockShape.length,()=>`paddings.shape[0] ${paddings.length} must be equal to [blockShape] ${blockShape.length}`),assert3($x.shape.reduce((a,b,i)=>i>0&&i<=blockShape.length?a&&(b+paddings[i-1][0]+paddings[i-1][1])%blockShape[i-1]===0:a,!0),()=>`input spatial dimensions ${$x.shape.slice(1)} with paddings ${paddings.toString()} must be divisible by blockShapes ${blockShape.toString()}`);let forward=backend3=>backend3.spaceToBatchND($x,blockShape,paddings),inputs={x:$x},attrs={blockShape,paddings};return ENGINE2.runKernelFunc(forward,inputs,null,SpaceToBatchND2,attrs)}var spaceToBatchND3=op2({spaceToBatchND_:spaceToBatchND_2});function pool_2(input2,windowShape,poolingType,pad7,dilations,strides){dilations==null&&(dilations=[1,1]),strides==null&&(strides=1),pad7===0&&(pad7="valid");let $x=convertToTensor2(input2,"x","maxPool"),x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`);let convInfo=computePool2DInfo2(x4D.shape,windowShape,strides,dilations,pad7),dilation=[convInfo.dilationHeight,convInfo.dilationWidth],basePadding;pad7==="same"?basePadding=withSpaceToBatchBasePaddings2([convInfo.filterHeight,convInfo.filterWidth],dilation):basePadding=[[0,0],[0,0]];let isDilationOne=dilation[0]===1&&dilation[1]===1,[adjustedPadding,adjustedCrops]=requiredSpaceToBatchPaddings2([convInfo.inHeight,convInfo.inWidth],dilation,basePadding),convertedPad=isDilationOne?pad7:"valid",convertedX=isDilationOne?x4D:spaceToBatchND3(x4D,dilation,adjustedPadding),forwardOp=poolingType==="avg"?()=>avgPool5(convertedX,windowShape,strides,convertedPad):()=>maxPool5(convertedX,windowShape,strides,convertedPad),y=forwardOp(),res=isDilationOne?y:batchToSpaceND2(y,dilation,adjustedCrops);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}function requiredSpaceToBatchPaddings2(inputShape,blockShape,basePadding){let padStart=basePadding.map(b=>b[0]),origPadEnd=basePadding.map(b=>b[1]),fullInputShape=inputShape.concat(padStart,origPadEnd),padEndExtra=blockShape.map((b,i)=>(b-fullInputShape[i]%b)%b),padEnd=origPadEnd.map((s,i)=>s+padEndExtra[i]),paddings=blockShape.map((_,i)=>[padStart[i],padEnd[i]]),crops=blockShape.map((_,i)=>[0,padEndExtra[i]]);return[paddings,crops]}function withSpaceToBatchBasePaddings2(filterShape,dilation){let dilatedFilterShape=filterShape.map((s,i)=>s+(s-1)*(dilation[i]-1)),padExtraShape=dilatedFilterShape.map(s=>s-1),padExtraStart=padExtraShape.map(s=>Math.floor(s/2)),padExtraEnd=padExtraShape.map((s,i)=>s-padExtraStart[i]);return padExtraShape.map((_,i)=>[padExtraStart[i],padExtraEnd[i]])}var pool2=op2({pool_:pool_2});function pow_2(base2,exp14){let $base=convertToTensor2(base2,"base","pow"),$exp=convertToTensor2(exp14,"exp","pow");[$base,$exp]=makeTypesMatch2($base,$exp);let inputs={a:$base,b:$exp},forward=(backend3,save)=>{let y=backend3.pow($base,$exp);return save([$base,$exp,y]),y};return ENGINE2.runKernelFunc(forward,inputs,null,Pow2)}var pow2=op2({pow_:pow_2});function prelu_2(x,alpha){let $x=convertToTensor2(x,"x","prelu"),$alpha=convertToTensor2(alpha,"alpha","prelu"),forward=(backend3,save)=>{let res=backend3.prelu($x,$alpha);return save([$x,$alpha]),res},inputs={x:$x,alpha:$alpha};return ENGINE2.runKernelFunc(forward,inputs,null,Prelu2)}var prelu2=op2({prelu_:prelu_2});function prod_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","prod");$x.dtype==="bool"&&($x=cast2($x,"int32"));let forward=backend3=>{let axes=parseAxisParam2(axis,$x.shape),permutation=getAxesPermutation2(axes,$x.rank),reductionAxes=axes,permutedX=$x;permutation!=null&&(permutedX=transpose2($x,permutation),reductionAxes=getInnerMostAxes2(reductionAxes.length,$x.rank));let value=backend3.prod(permutedX,reductionAxes);if(keepDims){let newShape=expandShapeToKeepDim2(value.shape,axes);value=reshape2(value,newShape)}return value},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Prod2,attrs)}var prod2=op2({prod_:prod_2});function tensor1d2(values,dtype){assertNonNull2(values);let inferredShape=inferShape2(values,dtype);if(inferredShape.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");let shape=null;return makeTensor2(values,shape,inferredShape,dtype)}function range3(start,stop,step9=1,dtype="float32"){if(step9===0)throw new Error("Cannot have a step of zero");let forward=()=>{let sameStartStop=start===stop,increasingRangeNegativeStep=start1;if(sameStartStop||increasingRangeNegativeStep||decreasingRangePositiveStep)return zeros2([0],dtype);let numElements=Math.abs(Math.ceil((stop-start)/step9)),values=makeZerosTypedArray2(numElements,dtype);stop{let res=backend3.reciprocal($x);return save([$x]),res},inputs,null,Reciprocal2)}var reciprocal2=op2({reciprocal_:reciprocal_2});function relu_2(x){let $x=convertToTensor2(x,"x","relu"),forward=(backend3,save)=>(save([$x]),$x.dtype==="bool"?cast2($x,"int32"):backend3.relu($x)),inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Relu3)}var relu2=op2({relu_:relu_2});function relu6_2(x){let $x=convertToTensor2(x,"x","relu6"),forward=(backend3,save)=>(save([$x]),$x.dtype==="bool"?cast2($x,"int32"):backend3.relu6($x)),inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Relu63)}var relu62=op2({relu6_:relu6_2});function reverse_2(x,axis){let $x=convertToTensor2(x,"x","reverse"),forward=backend3=>{let axes=parseAxisParam2(axis,$x.shape);if($x.rank===0)return clone2($x);let res=backend3.reverse($x,axes);return reshape2(res,$x.shape)},inputs={x:$x},attrs={dims:axis};return ENGINE2.runKernelFunc(forward,inputs,null,Reverse2,attrs)}var reverse2=op2({reverse_:reverse_2});function round_2(x){let $x=convertToTensor2(x,"x","round"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.round($x),inputs,null,Round2)}var round3=op2({round_:round_2});function rsqrt_2(x){let $x=convertToTensor2(x,"x","rsqrt"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.rsqrt($x);return save([$x]),res},inputs,null,Rsqrt2)}var rsqrt2=op2({rsqrt_:rsqrt_2});function selu_2(x){let $x=convertToTensor2(x,"x","selu"),forward=(backend3,save)=>{let res=backend3.selu($x);return save([$x]),res},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Selu3)}var selu2=op2({selu_:selu_2});function separableConv2d_2(x,depthwiseFilter,pointwiseFilter,strides,pad7,dilation=[1,1],dataFormat="NHWC"){let $x=convertToTensor2(x,"x","separableConv2d"),$depthwiseFilter=convertToTensor2(depthwiseFilter,"depthwiseFilter","separableConv2d"),$pointwiseFilter=convertToTensor2(pointwiseFilter,"pointwiseFilter","separableConv2d"),x4D=$x,reshapedTo4D=!1;if($x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),dataFormat==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");assert3(x4D.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${x4D.rank}.`),assert3($depthwiseFilter.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${$depthwiseFilter.rank}.`),assert3($pointwiseFilter.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${$depthwiseFilter.rank}.`),assert3($pointwiseFilter.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${$pointwiseFilter.shape[0]}.`),assert3($pointwiseFilter.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${$pointwiseFilter.shape[1]}.`);let inChannels=$depthwiseFilter.shape[2],channelMultiplier=$depthwiseFilter.shape[3];assert3($pointwiseFilter.shape[2]===inChannels*channelMultiplier,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${inChannels*channelMultiplier}, but got ${$pointwiseFilter.shape[2]}.`);let depthwise=depthwiseConv2d6(x4D,$depthwiseFilter,strides,pad7,dataFormat,dilation),pointwiseStride=1,res=conv2d2(depthwise,$pointwiseFilter,pointwiseStride,"valid",dataFormat);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var separableConv2d3=op2({separableConv2d_:separableConv2d_2});function sign_2(x){let $x=convertToTensor2(x,"x","sign"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.sign($x),inputs,null,Sign2)}var sign2=op2({sign_:sign_2});function sin_2(x){let $x=convertToTensor2(x,"x","sin"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sin($x);return save([$x]),res},inputs,null,Sin2)}var sin2=op2({sin_:sin_2});function sinh_2(x){let $x=convertToTensor2(x,"x","sinh"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sinh($x);return save([$x]),res},inputs,null,Sinh2)}var sinh2=op2({sinh_:sinh_2});function softmax_2(logits,dim=-1){let $logits=convertToTensor2(logits,"logits","softmax","float32");if(dim===-1&&(dim=$logits.rank-1),dim!==$logits.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${$logits.rank} and dim was ${dim}`);let inputs={logits:$logits},attrs={dim};return ENGINE2.runKernelFunc((backend3,save)=>{let y=backend3.softmax($logits,dim);return save([y]),y},inputs,null,Softmax4,attrs)}var softmax2=op2({softmax_:softmax_2});function fft_2(input2){assert3(input2.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${input2.dtype}.`);let inputs={input:input2};return ENGINE2.runKernelFunc(backend3=>{let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,input2D=input2.as2D(batch,innerDimensionSize),result=backend3.fft(input2D);return result.reshape(input2.shape)},inputs,null,FFT2)}var fft2=op2({fft_:fft_2});function ifft_2(input2){assert3(input2.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${input2.dtype}.`);let inputs={input:input2};return ENGINE2.runKernelFunc(backend3=>{let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,input2D=reshape2(input2,[batch,innerDimensionSize]),result=backend3.ifft(input2D);return reshape2(result,input2.shape)},inputs,null,IFFT2)}var ifft2=op2({ifft_:ifft_2});function irfft_2(input2){let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,ret;if(innerDimensionSize<=2){let complexInput=reshape2(input2,[batch,innerDimensionSize]);ret=ifft2(complexInput)}else{let outputShape=[batch,2*(innerDimensionSize-1)],realInput=reshape2(real2(input2),[batch,innerDimensionSize]),imagInput=reshape2(imag2(input2),[batch,innerDimensionSize]),realConjugate=reverse2(slice2(realInput,[0,1],[batch,innerDimensionSize-2]),1),imagConjugate=mul2(reverse2(slice2(imagInput,[0,1],[batch,innerDimensionSize-2]),1),scalar2(-1)),r=concat2([realInput,realConjugate],1),i=concat2([imagInput,imagConjugate],1),complexInput=reshape2(complex2(r,i),[outputShape[0],outputShape[1]]);ret=ifft2(complexInput)}if(ret=real2(ret),input2.rank===3&&input2.shape[0]!==0){let temp=ret,batch2=input2.shape[0];ret=reshape2(ret,[batch2,ret.shape[0]/batch2,ret.shape[1]]),temp.dispose()}return ret}var irfft2=op2({irfft_:irfft_2});function prepareSplitSize2(x,numOrSizeSplits,axis=0){let splitSizes=[];if(typeof numOrSizeSplits=="number")assert3(x.shape[axis]%numOrSizeSplits===0,()=>"Number of splits must evenly divide the axis."),splitSizes=new Array(numOrSizeSplits).fill(x.shape[axis]/numOrSizeSplits);else{let numOfNegs=numOrSizeSplits.reduce((count2,value)=>(value===-1&&(count2+=1),count2),0);assert3(numOfNegs<=1,()=>"There should be only one negative value in split array.");let negIndex=numOrSizeSplits.indexOf(-1);if(negIndex!==-1){let total=numOrSizeSplits.reduce((a,b)=>b>0?a+b:a);numOrSizeSplits[negIndex]=x.shape[axis]-total}assert3(x.shape[axis]===numOrSizeSplits.reduce((a,b)=>a+b),()=>"The sum of sizes must match the size of the axis dimension."),splitSizes=numOrSizeSplits}return splitSizes}function split_2(x,numOrSizeSplits,axis=0){let $x=convertToTensor2(x,"x","split"),forward=(backend3,_)=>{let $axis=parseAxisParam2(axis,$x.shape)[0],splitSizes=prepareSplitSize2($x,numOrSizeSplits,$axis);return backend3.split($x,splitSizes,$axis)},inputs={x:$x},attr={numOrSizeSplits,axis};return ENGINE2.runKernelFunc(forward,inputs,null,SplitV2,attr)}var split2=op2({split_:split_2});function rfft_2(input2,fftLength){assert3(input2.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${input2.dtype}`);let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,adjustedInput;if(fftLength!=null&&fftLength0),size=input2.shape.map(v=>v);size[input2.shape.length-1]=fftLength,adjustedInput=slice2(input2,begin,size),innerDimensionSize=fftLength}else if(fftLength!=null&&fftLength>innerDimensionSize){let zerosShape=input2.shape.map(v=>v);zerosShape[input2.shape.length-1]=fftLength-innerDimensionSize,adjustedInput=concat2([input2,zeros2(zerosShape)],input2.shape.length-1),innerDimensionSize=fftLength}else adjustedInput=input2;let zerosInput=zerosLike3(adjustedInput),complexInput=reshape2(complex2(adjustedInput,zerosInput),[batch,innerDimensionSize]),ret=fft2(complexInput),half=Math.floor(innerDimensionSize/2)+1,realValues=real2(ret),imagValues=imag2(ret),realComplexConjugate=split2(realValues,[half,innerDimensionSize-half],realValues.shape.length-1),imagComplexConjugate=split2(imagValues,[half,innerDimensionSize-half],imagValues.shape.length-1),outputShape=adjustedInput.shape.slice();return outputShape[adjustedInput.shape.length-1]=half,reshape2(complex2(realComplexConjugate[0],imagComplexConjugate[0]),outputShape)}var rfft2=op2({rfft_:rfft_2});function sqrt_2(x){let $x=convertToTensor2(x,"x","sqrt"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sqrt($x);return save([$x]),res},inputs,null,Sqrt2)}var sqrt2=op2({sqrt_:sqrt_2});function squaredDifference_2(a,b){let $a=convertToTensor2(a,"a","squaredDifference"),$b=convertToTensor2(b,"b","squaredDifference");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.squaredDifference($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b},attrs={};return ENGINE2.runKernelFunc(forward,inputs,null,SquaredDifference2,attrs)}var squaredDifference4=op2({squaredDifference_:squaredDifference_2});function squeeze_2(x,axis){let $x=convertToTensor2(x,"x","squeeze");return reshape2($x,squeezeShape2($x.shape,axis).newShape)}var squeeze2=op2({squeeze_:squeeze_2});function stack_2(tensors,axis=0){let $tensors=convertToTensorArray2(tensors,"tensors","stack");if(assert3($tensors.length>=1,()=>"Pass at least one tensor to tf.stack"),$tensors.length===1)return expandDims3($tensors[0],axis);let rank=$tensors[0].rank,shape=$tensors[0].shape,dtype=$tensors[0].dtype;assert3(axis<=rank,()=>"Axis must be <= rank of the tensor"),$tensors.forEach(t=>{assertShapesMatch2(shape,t.shape,"All tensors passed to stack must have matching shapes"),assert3(dtype===t.dtype,()=>"All tensors passed to stack must have matching dtypes")});let expandedTensors=$tensors.map(t=>expandDims3(t,axis));return concat2(expandedTensors,axis)}var stack2=op2({stack_:stack_2});function step_2(x,alpha=0){let $x=convertToTensor2(x,"x","step"),inputs={x:$x},attrs={alpha};return ENGINE2.runKernelFunc(backend3=>backend3.step($x,alpha),inputs,null,Step2,attrs)}var step2=op2({step_:step_2});function stridedSlice_2(x,begin,end,strides,beginMask=0,endMask=0,ellipsisMask=0,newAxisMask=0,shrinkAxisMask=0){let $x=convertToTensor2(x,"x","stridedSlice"),forward=backend3=>{strides==null&&(strides=new Array(begin.length));let ellipsisAxes=maskToAxes2(ellipsisMask);if(ellipsisAxes.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(ellipsisMask!==0&&newAxisMask!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(ellipsisMask!==0&&shrinkAxisMask!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let numInterpolatedAxes=$x.rank-begin.length,expandAxes=maskToAxes2(newAxisMask),newShape=$x.shape.slice();expandAxes.forEach(axis=>{begin[axis]=0,end[axis]=1,newShape.splice(axis,0,1)}),$x=reshape2($x,newShape);let{begin:normalizedBegin,end:normalizedEnd,strides:normalizedStrides}=getNormalizedAxes2($x.shape,ellipsisAxes,numInterpolatedAxes,begin,end,strides,beginMask,endMask,ellipsisMask);begin=normalizedBegin,end=normalizedEnd,strides=normalizedStrides;let shrinkAxes=maskToAxes2(shrinkAxisMask);shrinkAxes.forEach(axis=>{end[axis]=begin[axis]+1,strides[axis]=1});let size=computeOutShape5(begin,end,strides),outShape=size.filter((_,axis)=>shrinkAxes.indexOf(axis)===-1),nonStrided=strides.every(v=>v===1);if(nonStrided)return reshape2(slice2($x,begin,size),outShape);let res=backend3.stridedSlice($x,begin,end,strides);return reshape2(res,outShape)},inputs={x:$x},attrs={begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask};return ENGINE2.runKernelFunc(forward,inputs,null,StridedSlice2,attrs)}var stridedSlice3=op2({stridedSlice_:stridedSlice_2});function tan_2(x){let $x=convertToTensor2(x,"x","tan"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.tan($x);return save([$x]),res},inputs,null,Tan2)}var tan2=op2({tan_:tan_2});function tensor2d2(values,shape,dtype){if(assertNonNull2(values),shape!=null&&shape.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let inferredShape=inferShape2(values,dtype);if(inferredShape.length!==2&&inferredShape.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(inferredShape.length===1&&shape==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return makeTensor2(values,shape,inferredShape,dtype)}function topk_2(x,k=1,sorted=!0){let $x=convertToTensor2(x,"x","topk");if($x.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let lastDim=$x.shape[$x.shape.length-1];if(k>lastDim)throw new Error(`'k' passed to topk() must be <= the last dimension (${lastDim}) but got ${k}`);let inputs={x:$x},attrs={k,sorted},[values,indices]=ENGINE2.runKernelFunc(b=>b.topk($x,k,sorted),inputs,null,TopK2,attrs);return{values,indices}}var topk2=op2({topk_:topk_2});function unique_2(x,axis=0){let $x=convertToTensor2(x,"x","unique",null);assert3($x.rank>0,()=>"The input tensor must be at least 1D");let inputs={x:$x},attrs={axis},[values,indices]=ENGINE2.runKernel(Unique2,inputs,attrs);return{values,indices}}var unique2=op2({unique_:unique_2});function unsortedSegmentSum_2(x,segmentIds,numSegments){let $x=convertToTensor2(x,"x","unsortedSegmentSum"),$segmentIds=convertToTensor2(segmentIds,"segmentIds","unsortedSegmentSum","int32");assert3(isInt2(numSegments),()=>"numSegments must be of dtype int");let inputs={x:$x,segmentIds:$segmentIds},attrs={numSegments},forward=(backend3,save)=>{let res=backend3.unsortedSegmentSum($x,$segmentIds,numSegments);return save([$segmentIds]),res};return ENGINE2.runKernelFunc(forward,inputs,null,UnsortedSegmentSum2,attrs)}var unsortedSegmentSum2=op2({unsortedSegmentSum_:unsortedSegmentSum_2});function unstack_2(x,axis=0){let $x=convertToTensor2(x,"x","unstack");assert3(axis>=-$x.shape.length&&axis<$x.shape.length,()=>`Axis = ${axis} is not in [-${$x.shape.length}, ${$x.shape.length})`),axis<0&&(axis+=$x.shape.length);let inputs={value:$x},attrs={axis},forward=backend3=>backend3.unstack($x,axis);return ENGINE2.runKernelFunc(forward,inputs,null,Unpack2,attrs)}var unstack2=op2({unstack_:unstack_2});function notEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","notEqualStrict"),$b=convertToTensor2(b,"b","notEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in notEqualStrict: "),notEqual4($a,$b)}function lessStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","lessStrict"),$b=convertToTensor2(b,"b","lessStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in lessStrict: "),less2($a,$b)}function equalStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","equalStrict"),$b=convertToTensor2(b,"b","equalStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in equalStrict: "),equal2($a,$b)}function lessEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","lessEqualStrict"),$b=convertToTensor2(b,"b","lessEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in lessEqualStrict: "),lessEqual2($a,$b)}function greaterStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","greaterStrict"),$b=convertToTensor2(b,"b","greaterStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in greaterStrict: "),greater2($a,$b)}function greaterEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","greaterEqualStrict"),$b=convertToTensor2(b,"b","greaterEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in greaterEqualStrict: "),greaterEqual2($a,$b)}var equalStrict2=op2({equalStrict_:equalStrict_2}),greaterEqualStrict2=op2({greaterEqualStrict_:greaterEqualStrict_2}),greaterStrict2=op2({greaterStrict_:greaterStrict_2}),lessEqualStrict2=op2({lessEqualStrict_:lessEqualStrict_2}),lessStrict2=op2({lessStrict_:lessStrict_2}),notEqualStrict2=op2({notEqualStrict_:notEqualStrict_2});function addStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","addStrict"),$b=convertToTensor2(b,"b","addStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in addStrict: "),add4($a,$b)}function subStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","subStrict"),$b=convertToTensor2(b,"b","subStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in subStrict: "),sub2($a,$b)}function powStrict_2(base2,exp14){return deprecationWarn2("strict variants of ops have been deprecated and will be removed in future"),assertShapesMatch2(base2.shape,exp14.shape,"Error in powStrict: "),pow2(base2,exp14)}function mulStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","mul"),$b=convertToTensor2(b,"b","mul");return assertShapesMatch2($a.shape,$b.shape,"Error in multiplyStrict: "),mul2($a,$b)}function divStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","div"),$b=convertToTensor2(b,"b","div");return assertShapesMatch2($a.shape,$b.shape,"Error in divideStrict: "),div2($a,$b)}function modStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","modStrict"),$b=convertToTensor2(b,"b","modStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in modStrict: "),mod2($a,$b)}function minimumStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","minimumStrict"),$b=convertToTensor2(b,"b","minimumStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in minimumStrict: "),minimum2($a,$b)}function maximumStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","maximumStrict"),$b=convertToTensor2(b,"b","maximumStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in maximumStrict: "),maximum2($a,$b)}function squaredDifferenceStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","squaredDifferenceStrict"),$b=convertToTensor2(b,"b","squaredDifferenceStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in squaredDifferenceStrict: "),squaredDifference4($a,$b)}var addStrict2=op2({addStrict_:addStrict_2}),divStrict2=op2({divStrict_:divStrict_2}),maximumStrict2=op2({maximumStrict_:maximumStrict_2}),minimumStrict2=op2({minimumStrict_:minimumStrict_2}),modStrict2=op2({modStrict_:modStrict_2}),mulStrict2=op2({mulStrict_:mulStrict_2}),powStrict2=op2({powStrict_:powStrict_2}),squaredDifferenceStrict2=op2({squaredDifferenceStrict_:squaredDifferenceStrict_2}),subStrict2=op2({subStrict_:subStrict_2});function norm_2(x,ord="euclidean",axis=null,keepDims=!1){x=convertToTensor2(x,"x","norm");let norm6=normImpl2(x,ord,axis),keepDimsShape=norm6.shape;if(keepDims){let axes=parseAxisParam2(axis,x.shape);keepDimsShape=expandShapeToKeepDim2(norm6.shape,axes)}return reshape2(norm6,keepDimsShape)}function normImpl2(x,p2,axis=null){if(x.rank===0)return abs2(x);if(x.rank!==1&&axis===null)return normImpl2(reshape2(x,[-1]),p2,axis);if(x.rank===1||typeof axis=="number"||Array.isArray(axis)&&axis.length===1){if(p2===1)return sum3(abs2(x),axis);if(p2===Infinity)return max2(abs2(x),axis);if(p2===-Infinity)return min2(abs2(x),axis);if(p2==="euclidean"||p2===2)return sqrt2(sum3(pow2(abs2(x),scalar2(2,"int32")),axis));throw new Error(`Error in norm: invalid ord value: ${p2}`)}if(Array.isArray(axis)&&axis.length===2){if(p2===1)return max2(sum3(abs2(x),axis[0]),axis[1]-1);if(p2===Infinity)return max2(sum3(abs2(x),axis[1]),axis[0]);if(p2===-Infinity)return min2(sum3(abs2(x),axis[1]),axis[0]);if(p2==="fro"||p2==="euclidean")return sqrt2(sum3(square2(x),axis));throw new Error(`Error in norm: invalid ord value: ${p2}`)}throw new Error(`Error in norm: invalid axis: ${axis}`)}var norm2=op2({norm_:norm_2});function enclosingPowerOfTwo2(value){return Math.floor(Math.pow(2,Math.ceil(Math.log(value)/Math.log(2))))}function cosineWindow2(windowLength,a,b){let even=1-windowLength%2,newValues=new Float32Array(windowLength);for(let i=0;i`Error in conv2dDerFilter: input must be rank 4, but got shape ${x4D.shape}.`),assert3(dy4D.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${dy4D.shape}.`),assert3(filterShape.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${filterShape}.`);let inDepth=dataFormat==="NHWC"?x4D.shape[3]:x4D.shape[1],outDepth=dataFormat==="NHWC"?dy4D.shape[3]:dy4D.shape[1];assert3(inDepth===filterShape[2],()=>`Error in conv2dDerFilter: depth of input ${inDepth}) must match input depth in filter (${filterShape[2]}.`),assert3(outDepth===filterShape[3],()=>`Error in conv2dDerFilter: depth of dy (${outDepth}) must match output depth for filter (${filterShape[3]}).`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let dilations=1,$dataFormat=convertConv2DDataFormat2(dataFormat),convInfo=computeConv2DInfo2(x4D.shape,filterShape,strides,dilations,pad7,dimRoundingMode,!1,$dataFormat);return backend3.conv2dDerFilter(x4D,dy4D,convInfo)},inputs={x:x4D,dy:dy4D},attrs={strides,pad:pad7,dataFormat,dimRoundingMode,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,Conv2DBackpropFilter2,attrs)}var conv2DBackpropFilter3=op2({conv2DBackpropFilter_:conv2DBackpropFilter_2});function depthwiseConv2dNativeBackpropFilter_2(x,dy,filterShape,strides,pad7,dilations=[1,1],dimRoundingMode){let x4D=x;x.rank===3&&(x4D=reshape2(x,[1,x.shape[0],x.shape[1],x.shape[2]]));let dy4D=dy;dy4D.rank===3&&(dy4D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2]]));let forward=backend3=>{let convInfo=computeConv2DInfo2(x.shape,filterShape,strides,dilations,pad7,dimRoundingMode,!0);return backend3.depthwiseConv2DDerFilter(x4D,dy4D,convInfo)},inputs={x:x4D,dy:dy4D},attrs={strides,pad:pad7,dimRoundingMode,dilations,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNativeBackpropFilter2,attrs)}var depthwiseConv2dNativeBackpropFilter3=op2({depthwiseConv2dNativeBackpropFilter_:depthwiseConv2dNativeBackpropFilter_2});function depthwiseConv2dNativeBackpropInput_2(xShape,dy,filter,strides,pad7,dilations=[1,1],dimRoundingMode){let dy4D=dy,reshapedTo4D=!1;dy.rank===3&&(reshapedTo4D=!0,dy4D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2]]));let forward=backend3=>{let convInfo=computeConv2DInfo2(xShape,filter.shape,strides,dilations,pad7,dimRoundingMode,!0);return backend3.depthwiseConv2DDerInput(dy4D,filter,convInfo)},inputs={dy:dy4D,filter},attrs={strides,pad:pad7,dimRoundingMode,dilations,inputShape:xShape},res=ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNativeBackpropInput2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var depthwiseConv2dNativeBackpropInput3=op2({depthwiseConv2dNativeBackpropInput_:depthwiseConv2dNativeBackpropInput_2});function hammingWindow_2(windowLength){return cosineWindow2(windowLength,.54,.46)}var hammingWindow2=op2({hammingWindow_:hammingWindow_2});function hannWindow_2(windowLength){return cosineWindow2(windowLength,.5,.5)}var hannWindow2=op2({hannWindow_:hannWindow_2});function frame_2(signal3,frameLength,frameStep,padEnd=!1,padValue=0){let start=0,output=[];for(;start+frameLength<=signal3.size;)output.push(slice2(signal3,start,frameLength)),start+=frameStep;if(padEnd)for(;start`Error in cropAndResize: image must be rank 4,but got rank ${$image.rank}.`),assert3($boxes.rank===2&&$boxes.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${numBoxes},4] but had shape ${$boxes.shape}.`),assert3($boxInd.rank===1&&$boxInd.shape[0]===numBoxes,()=>`Error in cropAndResize: boxInd must be have size [${numBoxes}] but had shape ${$boxes.shape}.`),assert3(cropSize.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${cropSize.length}.`),assert3(cropSize[0]>=1&&cropSize[1]>=1,()=>`cropSize must be atleast [1,1], but was ${cropSize}`),assert3(method==="bilinear"||method==="nearest",()=>`method must be bilinear or nearest, but was ${method}`);let forward=backend3=>backend3.cropAndResize($image,$boxes,$boxInd,cropSize,method,extrapolationValue),inputs={image:$image,boxes:$boxes,boxInd:$boxInd},attrs={method,extrapolationValue,cropSize},res=ENGINE2.runKernelFunc(forward,inputs,null,CropAndResize2,attrs);return res}var cropAndResize3=op2({cropAndResize_:cropAndResize_2});function flipLeftRight_2(image3){let $image=convertToTensor2(image3,"image","flipLeftRight","float32");assert3($image.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${$image.rank}.`);let inputs={image:$image},res=ENGINE2.runKernel(FlipLeftRight2,inputs,{});return res}var flipLeftRight3=op2({flipLeftRight_:flipLeftRight_2});function rotateWithOffset_2(image3,radians,fillValue=0,center=.5){let $image=convertToTensor2(image3,"image","rotateWithOffset","float32");assert3($image.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${$image.rank}.`);let inputs={image:$image},attrs={radians,fillValue,center},res=ENGINE2.runKernel(RotateWithOffset2,inputs,attrs);return res}var rotateWithOffset3=op2({rotateWithOffset_:rotateWithOffset_2});function nonMaxSuppSanityCheck2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma){iouThreshold==null&&(iouThreshold=.5),scoreThreshold==null&&(scoreThreshold=Number.NEGATIVE_INFINITY),softNmsSigma==null&&(softNmsSigma=0);let numBoxes=boxes.shape[0];return maxOutputSize=Math.min(maxOutputSize,numBoxes),assert3(0<=iouThreshold&&iouThreshold<=1,()=>`iouThreshold must be in [0, 1], but was '${iouThreshold}'`),assert3(boxes.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${boxes.rank}'`),assert3(boxes.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${boxes.shape[1]}`),assert3(scores.rank===1,()=>"scores must be a 1D tensor"),assert3(scores.shape[0]===numBoxes,()=>`scores has incompatible shape with boxes. Expected ${numBoxes}, but was ${scores.shape[0]}`),assert3(0<=softNmsSigma&&softNmsSigma<=1,()=>`softNmsSigma must be in [0, 1], but was '${softNmsSigma}'`),{maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma}}function nonMaxSuppression_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),inputs=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold);maxOutputSize=inputs.maxOutputSize,iouThreshold=inputs.iouThreshold,scoreThreshold=inputs.scoreThreshold;let attrs={maxOutputSize,iouThreshold,scoreThreshold};return ENGINE2.runKernelFunc(b=>b.nonMaxSuppression($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold),{boxes:$boxes,scores:$scores},null,NonMaxSuppressionV32,attrs)}var nonMaxSuppression3=op2({nonMaxSuppression_:nonMaxSuppression_2});function binaryInsert2(arr,element,comparator){let index=binarySearch2(arr,element,comparator),insertionPoint=index<0?-(index+1):index;arr.splice(insertionPoint,0,element)}function binarySearch2(arr,target,comparator){return binarySearch_2(arr,target,comparator||defaultComparator2)}function defaultComparator2(a,b){return a>b?1:a>>1);let compareResult=comparator(target,arr[middle]);compareResult>0?left=middle+1:(right=middle,found=!compareResult)}return found?left:-left-1}function nonMaxSuppressionV3Impl3(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,0).selectedIndices}function nonMaxSuppressionV4Impl4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,padToMaxOutputSize){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,0,!1,padToMaxOutputSize,!0)}function nonMaxSuppressionV5Impl4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma,!0)}function nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma,returnScoresTensor=!1,padToMaxOutputSize=!1,returnValidOutputs=!1){let candidates=[];for(let i=0;iscoreThreshold&&candidates.push({score:scores[i],boxIndex:i,suppressBeginIndex:0});candidates.sort(ascendingComparator2);let scale3=softNmsSigma>0?-.5/softNmsSigma:0,selectedIndices=[],selectedScores=[];for(;selectedIndices.length0;){let candidate=candidates.pop(),{score:originalScore,boxIndex,suppressBeginIndex}=candidate;if(originalScore=suppressBeginIndex;--j){let iou3=intersectionOverUnion2(boxes,boxIndex,selectedIndices[j]);if(iou3>=iouThreshold){ignoreCandidate=!0;break}if(candidate.score=candidate.score*suppressWeight2(iouThreshold,scale3,iou3),candidate.score<=scoreThreshold)break}candidate.suppressBeginIndex=selectedIndices.length,ignoreCandidate||(candidate.score===originalScore?(selectedIndices.push(boxIndex),selectedScores.push(candidate.score)):candidate.score>scoreThreshold&&binaryInsert2(candidates,candidate,ascendingComparator2))}let validOutputs=selectedIndices.length,elemsToPad=maxOutputSize-validOutputs;padToMaxOutputSize&&elemsToPad>0&&(selectedIndices.push(...new Array(elemsToPad).fill(0)),selectedScores.push(...new Array(elemsToPad).fill(0)));let result={selectedIndices:tensor1d2(selectedIndices,"int32")};return returnScoresTensor&&(result.selectedScores=tensor1d2(selectedScores,"float32")),returnValidOutputs&&(result.validOutputs=scalar2(validOutputs,"int32")),result}function intersectionOverUnion2(boxes,i,j){let iCoord=boxes.subarray(i*4,i*4+4),jCoord=boxes.subarray(j*4,j*4+4),yminI=Math.min(iCoord[0],iCoord[2]),xminI=Math.min(iCoord[1],iCoord[3]),ymaxI=Math.max(iCoord[0],iCoord[2]),xmaxI=Math.max(iCoord[1],iCoord[3]),yminJ=Math.min(jCoord[0],jCoord[2]),xminJ=Math.min(jCoord[1],jCoord[3]),ymaxJ=Math.max(jCoord[0],jCoord[2]),xmaxJ=Math.max(jCoord[1],jCoord[3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function suppressWeight2(iouThreshold,scale3,iou3){let weight=Math.exp(scale3*iou3*iou3);return iou3<=iouThreshold?weight:0}function ascendingComparator2(c1,c2){return c1.score-c2.score||c1.score===c2.score&&c2.boxIndex-c1.boxIndex}async function nonMaxSuppressionAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),inputs=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold);maxOutputSize=inputs.maxOutputSize,iouThreshold=inputs.iouThreshold,scoreThreshold=inputs.scoreThreshold;let boxesAndScores=await Promise.all([$boxes.data(),$scores.data()]),boxesVals=boxesAndScores[0],scoresVals=boxesAndScores[1],res=nonMaxSuppressionV3Impl3(boxesVals,scoresVals,maxOutputSize,iouThreshold,scoreThreshold);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionAsync2=nonMaxSuppressionAsync_2;function nonMaxSuppressionWithScore_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,softNmsSigma=0){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);maxOutputSize=params.maxOutputSize,iouThreshold=params.iouThreshold,scoreThreshold=params.scoreThreshold,softNmsSigma=params.softNmsSigma;let inputs={boxes:$boxes,scores:$scores},attrs={maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma},result=ENGINE2.runKernel(NonMaxSuppressionV52,inputs,attrs);return{selectedIndices:result[0],selectedScores:result[1]}}var nonMaxSuppressionWithScore2=op2({nonMaxSuppressionWithScore_:nonMaxSuppressionWithScore_2});async function nonMaxSuppressionWithScoreAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,softNmsSigma=0){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);maxOutputSize=params.maxOutputSize,iouThreshold=params.iouThreshold,scoreThreshold=params.scoreThreshold,softNmsSigma=params.softNmsSigma;let boxesAndScores=await Promise.all([$boxes.data(),$scores.data()]),boxesVals=boxesAndScores[0],scoresVals=boxesAndScores[1],res=nonMaxSuppressionV5Impl4(boxesVals,scoresVals,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionWithScoreAsync2=nonMaxSuppressionWithScoreAsync_2;function nonMaxSuppressionPadded_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,padToMaxOutputSize=!1){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,null),$maxOutputSize=params.maxOutputSize,$iouThreshold=params.iouThreshold,$scoreThreshold=params.scoreThreshold,inputs={boxes:$boxes,scores:$scores},attrs={maxOutputSize:$maxOutputSize,iouThreshold:$iouThreshold,scoreThreshold:$scoreThreshold,padToMaxOutputSize},result=ENGINE2.runKernel(NonMaxSuppressionV42,inputs,attrs);return{selectedIndices:result[0],validOutputs:result[1]}}var nonMaxSuppressionPadded2=op2({nonMaxSuppressionPadded_:nonMaxSuppressionPadded_2});async function nonMaxSuppressionPaddedAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,padToMaxOutputSize=!1){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,null),$maxOutputSize=params.maxOutputSize,$iouThreshold=params.iouThreshold,$scoreThreshold=params.scoreThreshold,[boxesVals,scoresVals]=await Promise.all([$boxes.data(),$scores.data()]),res=nonMaxSuppressionV4Impl4(boxesVals,scoresVals,$maxOutputSize,$iouThreshold,$scoreThreshold,padToMaxOutputSize);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionPaddedAsync2=nonMaxSuppressionPaddedAsync_2;function resizeBilinear_2(images,size,alignCorners=!1){let $images=convertToTensor2(images,"images","resizeBilinear");assert3($images.rank===3||$images.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${$images.rank}.`),assert3(size.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${size}.`);let batchImages=$images,reshapedTo4D=!1;$images.rank===3&&(reshapedTo4D=!0,batchImages=reshape2($images,[1,$images.shape[0],$images.shape[1],$images.shape[2]]));let[newHeight,newWidth]=size,forward=(backend3,save)=>(save([batchImages]),backend3.resizeBilinear(batchImages,newHeight,newWidth,alignCorners)),inputs={images:batchImages},attrs={alignCorners,size},res=ENGINE2.runKernelFunc(forward,inputs,null,ResizeBilinear2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var resizeBilinear3=op2({resizeBilinear_:resizeBilinear_2});function resizeNearestNeighbor_2(images,size,alignCorners=!1){let $images=convertToTensor2(images,"images","resizeNearestNeighbor");assert3($images.rank===3||$images.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${$images.rank}.`),assert3(size.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${size}.`),assert3($images.dtype==="float32"||$images.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let batchImages=$images,reshapedTo4D=!1;$images.rank===3&&(reshapedTo4D=!0,batchImages=reshape2($images,[1,$images.shape[0],$images.shape[1],$images.shape[2]]));let[newHeight,newWidth]=size,inputs={images:batchImages},attrs={alignCorners,size},forward=(backend3,save)=>(save([batchImages]),backend3.resizeNearestNeighbor(batchImages,newHeight,newWidth,alignCorners)),res=ENGINE2.runKernelFunc(forward,inputs,null,ResizeNearestNeighbor2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var resizeNearestNeighbor2=op2({resizeNearestNeighbor_:resizeNearestNeighbor_2});function bandPart_2(a,numLower,numUpper){assert3(numLower%1===0,()=>`bandPart(): numLower must be an integer, got ${numLower}.`),assert3(numUpper%1===0,()=>`bandPart(): numUpper must be an integer, got ${numUpper}.`);let $a=convertToTensor2(a,"a","bandPart");assert3($a.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${$a.rank}.`);let shape=$a.shape,[M,N]=$a.shape.slice(-2);if(!(numLower<=M))throw new Error(`bandPart(): numLower (${numLower}) must not be greater than the number of rows (${M}).`);if(!(numUpper<=N))throw new Error(`bandPart(): numUpper (${numUpper}) must not be greater than the number of columns (${N}).`);numLower<0&&(numLower=M),numUpper<0&&(numUpper=N);let i=reshape2(range3(0,M,1,"int32"),[-1,1]),j=range3(0,N,1,"int32"),ij=sub2(i,j),inBand=logicalAnd2(lessEqual2(ij,scalar2(+numLower,"int32")),greaterEqual2(ij,scalar2(-numUpper,"int32"))),zero=zeros2([M,N],$a.dtype);return reshape2(stack2(unstack2(reshape2($a,[-1,M,N])).map(mat=>where2(inBand,mat,zero))),shape)}var bandPart2=op2({bandPart_:bandPart_2});function gramSchmidt_2(xs){let inputIsTensor2D;if(Array.isArray(xs)){inputIsTensor2D=!1,assert3(xs!=null&&xs.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let dim=xs[0].shape[0];for(let i=1;i`Gram-Schmidt: Non-unique lengths found in the input vectors: (${xs[i].shape[0]} vs. ${dim})`)}else inputIsTensor2D=!0,xs=split2(xs,xs.shape[0],0).map(x=>squeeze2(x,[0]));assert3(xs.length<=xs[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${xs.length}) exceeds number of dimensions (${xs[0].shape[0]}).`);let ys=[],xs1d=xs;for(let i=0;i{let x=xs1d[i];if(i>0)for(let j=0;j=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${x.rank}`),x.rank===2)return qr2d2(x,fullMatrices);{let outerDimsProd=x.shape.slice(0,x.shape.length-2).reduce((value,prev)=>value*prev),x2ds=unstack2(reshape2(x,[outerDimsProd,x.shape[x.shape.length-2],x.shape[x.shape.length-1]]),0),q2ds=[],r2ds=[];x2ds.forEach(x2d=>{let[q2d,r2d]=qr2d2(x2d,fullMatrices);q2ds.push(q2d),r2ds.push(r2d)});let q=reshape2(stack2(q2ds,0),x.shape),r=reshape2(stack2(r2ds,0),x.shape);return[q,r]}}function qr2d2(x,fullMatrices=!1){return ENGINE2.tidy(()=>{assert3(x.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${x.shape.length}D Tensor.`);let m=x.shape[0],n=x.shape[1],q=eye2(m),r=clone2(x),one2D=tensor2d2([[1]],[1,1]),w=clone2(one2D),iters=m>=n?n:m;for(let j=0;j{let rjEnd1=slice2(r,[j,j],[m-j,1]),normX=norm2(rjEnd1),rjj=slice2(r,[j,j],[1,1]),s=where2(greater2(rjj,0),tensor2d2([[-1]]),tensor2d2([[1]])),u1=sub2(rjj,mul2(s,normX)),wPre=div2(rjEnd1,u1);wPre.shape[0]===1?w=clone2(one2D):w=concat2([one2D,slice2(wPre,[1,0],[wPre.shape[0]-1,wPre.shape[1]])],0);let tau=neg2(div2(matMul3(s,u1),normX)),rjEndAll=slice2(r,[j,0],[m-j,n]),tauTimesW=mul2(tau,w),wT=transpose2(w);if(j===0)r=sub2(rjEndAll,matMul3(tauTimesW,matMul3(wT,rjEndAll)));else{let rTimesTau=sub2(rjEndAll,matMul3(tauTimesW,matMul3(wT,rjEndAll)));r=concat2([slice2(r,[0,0],[j,n]),rTimesTau],0)}let tawTimesWT=transpose2(tauTimesW),qAllJEnd=slice2(q,[0,j],[m,q.shape[1]-j]);if(j===0)q=sub2(qAllJEnd,matMul3(matMul3(qAllJEnd,w),tawTimesWT));else{let qTimesTau=sub2(qAllJEnd,matMul3(matMul3(qAllJEnd,w),tawTimesWT));q=concat2([slice2(q,[0,0],[m,j]),qTimesTau],1)}return[w,r,q]}),dispose2([rTemp,wTemp,qTemp])}return!fullMatrices&&m>n&&(q=slice2(q,[0,0],[m,n]),r=slice2(r,[0,0],[n,n])),[q,r]})}var qr2=op2({qr_:qr_2});var Reduction2;(function(Reduction3){Reduction3[Reduction3.NONE=0]="NONE",Reduction3[Reduction3.MEAN=1]="MEAN",Reduction3[Reduction3.SUM=2]="SUM",Reduction3[Reduction3.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(Reduction2||(Reduction2={}));function computeWeightedLoss_2(losses3,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $losses=convertToTensor2(losses3,"losses","computeWeightedLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","computeWeightedLoss"));let weightedLoss=$weights==null?$losses:mul2($losses,$weights);if(reduction===Reduction2.NONE)return weightedLoss;if(reduction===Reduction2.SUM)return sum3(weightedLoss);if(reduction===Reduction2.MEAN){if($weights==null)return mean2(weightedLoss);{let broadcastFactor=$losses.size/$weights.size,result=div2(sum3(weightedLoss),sum3($weights));return broadcastFactor>1?div2(result,scalar2(broadcastFactor)):result}}if(reduction===Reduction2.SUM_BY_NONZERO_WEIGHTS){if($weights==null)return div2(sum3(weightedLoss),scalar2($losses.size));{let broadcastedWeights=mul2($weights,ones4($losses.shape)),numNonZeros=cast2(sum3(notEqual4(broadcastedWeights,scalar2(0))),"float32");return div2(sum3(weightedLoss),numNonZeros)}}throw Error(`Unknown reduction: ${reduction}`)}var computeWeightedLoss3=op2({computeWeightedLoss_:computeWeightedLoss_2});function absoluteDifference_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","absoluteDifference"),$predictions=convertToTensor2(predictions,"predictions","absoluteDifference"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","absoluteDifference")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in absoluteDifference: ");let losses3=abs2(sub2($labels,$predictions));return computeWeightedLoss3(losses3,$weights,reduction)}var absoluteDifference2=op2({absoluteDifference_:absoluteDifference_2});function cosineDistance_2(labels,predictions,axis,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","cosineDistance"),$predictions=convertToTensor2(predictions,"predictions","cosineDistance"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","cosineDistance")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in cosineDistance: ");let one=scalar2(1),losses3=sub2(one,sum3(mul2($labels,$predictions),axis,!0));return computeWeightedLoss3(losses3,$weights,reduction)}var cosineDistance2=op2({cosineDistance_:cosineDistance_2});function hingeLoss_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","hingeLoss"),$predictions=convertToTensor2(predictions,"predictions","hingeLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","hingeLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in hingeLoss: ");let one=scalar2(1);$labels=sub2(mul2(scalar2(2),$labels),one);let losses3=relu2(sub2(one,mul2($labels,$predictions)));return computeWeightedLoss3(losses3,$weights,reduction)}var hingeLoss2=op2({hingeLoss_:hingeLoss_2});function huberLoss_2(labels,predictions,weights,delta=1,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","huberLoss"),$predictions=convertToTensor2(predictions,"predictions","huberLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","huberLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in huberLoss: ");let deltaScalar=scalar2(delta),error=abs2(sub2($predictions,$labels)),quadratic=minimum2(error,deltaScalar),linear=sub2(error,quadratic),losses3=add4(mul2(scalar2(.5),square2(quadratic)),mul2(deltaScalar,linear));return computeWeightedLoss3(losses3,$weights,reduction)}var huberLoss2=op2({huberLoss_:huberLoss_2});function logLoss_2(labels,predictions,weights,epsilon4=1e-7,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","logLoss"),$predictions=convertToTensor2(predictions,"predictions","logLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","logLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in logLoss: ");let one=scalar2(1),epsilonScalar=scalar2(epsilon4),l13=neg2(mul2($labels,log2(add4($predictions,epsilonScalar)))),l23=mul2(sub2(one,$labels),log2(add4(sub2(one,$predictions),epsilonScalar))),losses3=sub2(l13,l23);return computeWeightedLoss3(losses3,$weights,reduction)}var logLoss2=op2({logLoss_:logLoss_2});function meanSquaredError_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","meanSquaredError"),$predictions=convertToTensor2(predictions,"predictions","meanSquaredError"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","meanSquaredError")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in meanSquaredError: ");let losses3=squaredDifference4($labels,$predictions);return computeWeightedLoss3(losses3,$weights,reduction)}var meanSquaredError4=op2({meanSquaredError_:meanSquaredError_2});function sigmoidCrossEntropyWithLogits_2(labels,logits){let $labels=convertToTensor2(labels,"labels","sigmoidCrossEntropyWithLogits"),$logits=convertToTensor2(logits,"logits","sigmoidCrossEntropyWithLogits");assertShapesMatch2($labels.shape,$logits.shape,"Error in sigmoidCrossEntropyWithLogits: ");let maxOutput=relu2($logits),outputXTarget=mul2($logits,$labels),sigmoidOutput=log1p2(exp2(neg2(abs2($logits))));return add4(sub2(maxOutput,outputXTarget),sigmoidOutput)}function sigmoidCrossEntropy_2(multiClassLabels,logits,weights,labelSmoothing=0,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $multiClassLabels=convertToTensor2(multiClassLabels,"multiClassLabels","sigmoidCrossEntropy"),$logits=convertToTensor2(logits,"logits","sigmoidCrossEntropy"),$weights=null;if(weights!=null&&($weights=convertToTensor2(weights,"weights","sigmoidCrossEntropy")),assertShapesMatch2($multiClassLabels.shape,$logits.shape,"Error in sigmoidCrossEntropy: "),labelSmoothing>0){let labelSmoothingScalar=scalar2(labelSmoothing),one=scalar2(1),half=scalar2(.5);$multiClassLabels=add4(mul2($multiClassLabels,sub2(one,labelSmoothingScalar)),mul2(half,labelSmoothingScalar))}let losses3=sigmoidCrossEntropyWithLogits_2($multiClassLabels,$logits);return computeWeightedLoss3(losses3,$weights,reduction)}var sigmoidCrossEntropy2=op2({sigmoidCrossEntropy_:sigmoidCrossEntropy_2});function softmaxCrossEntropyWithLogits_2(labels,logits,dim=-1){if(dim===-1&&(dim=logits.rank-1),dim!==logits.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${logits.rank} and dim was ${dim}`);let customOp=customGrad2((labels2,logits2,save)=>{let keepDims=!0,lse=logSumExp2(logits2,[dim],keepDims),logResult=sub2(cast2(logits2,"float32"),lse);save([labels2,logResult]);let costVector=neg2(mul2(logResult,labels2)),value=sum3(costVector,[dim]),gradFunc=(dy,saved)=>{let[labels3,logResult2]=saved,dyShape=expandShapeToKeepDim2(dy.shape,[dim]);return[mul2(reshape2(dy,dyShape),sub2(cast2(labels3,"float32"),exp2(logResult2))),mul2(reshape2(dy,dyShape),sub2(exp2(logResult2),cast2(labels3,"float32")))]};return{value,gradFunc}});return customOp(labels,logits)}function softmaxCrossEntropy_2(onehotLabels,logits,weights,labelSmoothing=0,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $onehotLabels=convertToTensor2(onehotLabels,"onehotLabels","softmaxCrossEntropy"),$logits=convertToTensor2(logits,"logits","softmaxCrossEntropy"),$weights=null;if(weights!=null&&($weights=convertToTensor2(weights,"weights","softmaxCrossEntropy")),assertShapesMatch2($onehotLabels.shape,$logits.shape,"Error in softmaxCrossEntropy: "),labelSmoothing>0){let labelSmoothingScalar=scalar2(labelSmoothing),one=scalar2(1),numClasses=scalar2($onehotLabels.shape[1]);$onehotLabels=add4(mul2($onehotLabels,sub2(one,labelSmoothingScalar)),div2(labelSmoothingScalar,numClasses))}let losses3=softmaxCrossEntropyWithLogits_2($onehotLabels,$logits);return computeWeightedLoss3(losses3,$weights,reduction)}var softmaxCrossEntropy2=op2({softmaxCrossEntropy_:softmaxCrossEntropy_2});var spectral2={fft:fft2,ifft:ifft2,rfft:rfft2,irfft:irfft2},signal2={hammingWindow:hammingWindow2,hannWindow:hannWindow2,frame:frame2,stft:stft2},image2={flipLeftRight:flipLeftRight3,resizeNearestNeighbor:resizeNearestNeighbor2,resizeBilinear:resizeBilinear3,rotateWithOffset:rotateWithOffset3,cropAndResize:cropAndResize3,nonMaxSuppression:nonMaxSuppression3,nonMaxSuppressionAsync:nonMaxSuppressionAsync2,nonMaxSuppressionWithScore:nonMaxSuppressionWithScore2,nonMaxSuppressionWithScoreAsync:nonMaxSuppressionWithScoreAsync2,nonMaxSuppressionPadded:nonMaxSuppressionPadded2,nonMaxSuppressionPaddedAsync:nonMaxSuppressionPaddedAsync2},linalg2={bandPart:bandPart2,gramSchmidt:gramSchmidt2,qr:qr2},losses2={absoluteDifference:absoluteDifference2,computeWeightedLoss:computeWeightedLoss3,cosineDistance:cosineDistance2,hingeLoss:hingeLoss2,huberLoss:huberLoss2,logLoss:logLoss2,meanSquaredError:meanSquaredError4,sigmoidCrossEntropy:sigmoidCrossEntropy2,softmaxCrossEntropy:softmaxCrossEntropy2};var SELU_SCALEALPHA2=1.7580993408473768,SELU_SCALE2=1.0507009873554805;var absGradConfig2={kernelName:Abs2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,step2(cast2(x,"float32"),-1))}}};var acosGradConfig2={kernelName:Acos2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=square2(cast2(x,"float32")),b=sqrt2(sub2(scalar2(1),a));return neg2(div2(dy,b))}}}};var acoshGradConfig2={kernelName:Acosh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=sqrt2(sub2(square2(cast2(x,"float32")),1));return div2(dy,a)}}}};var addGradConfig2={kernelName:Add3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=dy,reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let res=dy,reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,b.shape)};return{a:derA,b:derB}}};var addNGradConfig2={kernelName:AddN2,saveAllInputs:!0,gradFunc:(dy,saved)=>{let ders={};return saved.forEach((_,i)=>{ders[i]=()=>dy.clone()}),ders}};var argMaxGradConfig2={kernelName:ArgMax2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>zerosLike3(x)}}};var argMinGradConfig2={kernelName:ArgMin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>zerosLike3(x)}}};var asinGradConfig2={kernelName:Asin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,sqrt2(sub2(scalar2(1),square2(cast2(x,"float32")))))}}};var asinhGradConfig2={kernelName:Asinh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=sqrt2(add4(scalar2(1),square2(cast2(x,"float32"))));return div2(dy,a)}}}};var atan2GradConfig2={kernelName:Atan22,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let d=add4(square2(a),square2(b)),res=mul2(dy,div2(b,d)),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let d=add4(square2(a),square2(b)),res=neg2(mul2(dy,div2(a,d))),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,b.shape)};return{a:derA,b:derB}}};var atanGradConfig2={kernelName:Atan3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,add4(square2(cast2(x,"float32")),1))}}};var atanhGradConfig2={kernelName:Atanh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,sub2(scalar2(1),square2(cast2(x,"float32"))))}}};function avgPool3dBackprop_2(dy,input2,filterSize,strides,dilations=[1,1,1],pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","avgPool3dBackprop"),$input=convertToTensor2(input2,"input","avgPool3dBackprop"),dy5D=$dy,input5D=$input,reshapedTo5D=!1;$input.rank===4&&(reshapedTo5D=!0,dy5D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2],$dy.shape[3]]),input5D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2],$input.shape[3]])),assert3(dy5D.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${dy5D.rank}.`),assert3(input5D.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${input5D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool3DInfo2(input5D.shape,filterSize,strides,dilations,pad7,dimRoundingMode);return backend3.avgPool3dBackprop(dy5D,input5D,convInfo)},inputs={dy:dy5D,input:input5D},attrs={filterSize,strides,dilations,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,AvgPool3DBackprop2,attrs);return reshapedTo5D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3],res.shape[4]]):res}var avgPool3dBackprop2=op2({avgPool3dBackprop_:avgPool3dBackprop_2});var avgPool3DGradConfig2={kernelName:AvgPool3D2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{filterSize,strides,dilations,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1,1]:dilations;return{x:()=>avgPool3dBackprop2(dy,x,filterSize,strides,$dilations,pad7,dimRoundingMode)}}};function avgPoolBackprop_2(dy,input2,filterSize,strides,pad7){let $dy=convertToTensor2(dy,"dy","avgPoolBackprop"),$input=convertToTensor2(input2,"input","avgPoolBackprop");assert3($input.rank===$dy.rank,()=>`Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`);let input4D=$input,dy4D=$dy,reshapedTo4D=!1;$input.rank===3&&(reshapedTo4D=!0,input4D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2]]),dy4D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2]])),assert3(dy4D.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${dy4D.rank}.`),assert3(input4D.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${input4D.rank}.`);let forward=backend3=>{let convInfo=computePool2DInfo2(input4D.shape,filterSize,strides,1,pad7);return backend3.avgPoolBackprop(dy4D,input4D,convInfo)},inputs={dy:dy4D,input:input4D},attrs={filterSize,strides,pad:pad7},res=ENGINE2.runKernelFunc(forward,inputs,null,AvgPoolBackprop2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var avgPoolBackprop4=op2({avgPoolBackprop_:avgPoolBackprop_2});var avgPoolGradConfig2={kernelName:AvgPool2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{filterSize,strides,pad:pad7}=attrs;return{x:()=>avgPoolBackprop4(dy,x,filterSize,strides,pad7)}}};var batchMatMulGradConfig2={kernelName:BatchMatMul2,inputsToSave:["a","b"],gradFunc:(dy,saved,attrs)=>{let[a,b]=saved,{transposeA,transposeB}=attrs;return!transposeA&&!transposeB?{a:()=>matMul3(dy,b,!1,!0),b:()=>matMul3(a,dy,!0,!1)}:!transposeA&&transposeB?{a:()=>matMul3(dy,b,!1,!1),b:()=>matMul3(dy,a,!0,!1)}:transposeA&&!transposeB?{a:()=>matMul3(b,dy,!1,!0),b:()=>matMul3(a,dy,!1,!1)}:{a:()=>matMul3(b,dy,!0,!0),b:()=>matMul3(dy,a,!0,!0)}}};var batchToSpaceNDGradConfig2={kernelName:BatchToSpaceND2,gradFunc:(dy,saved,attrs)=>{let{blockShape,crops}=attrs;return{x:()=>spaceToBatchND3(dy,blockShape,crops)}}};var broadcastToGradConfig2={kernelName:BroadcastTo2,gradFunc:(dy,saved,attrs)=>{let broadCastToAttrs=attrs,inputShape=broadCastToAttrs.inputShape,outputShape=broadCastToAttrs.shape,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)throw new Error(`broadcastTo(): [${inputShape}] cannot be broadcast to [${outputShape}].`);let axes=[];for(let i=0;i1&&axes.push(i);return{x:()=>sum3(dy,axes,!0)}}};var castGradConfig2={kernelName:Cast2,gradFunc:dy=>({x:()=>dy.clone()})};var ceilGradConfig2={kernelName:Ceil2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var clipByValueGradConfig2={kernelName:ClipByValue2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{clipValueMin,clipValueMax}=attrs;return{x:()=>where2(logicalAnd2(greaterEqual2(x,clipValueMin),lessEqual2(x,clipValueMax)),dy,zerosLike3(dy))}}};var concatGradConfig2={kernelName:Concat2,saveAllInputs:!0,gradFunc:(dy,saved,attrs)=>{let shapes=saved.map(t=>t.shape),{axis}=attrs,$axis=parseAxisParam2(axis,saved[0].shape)[0],sizeSplits=shapes.map(s=>s[$axis]),derTensors=split2(dy,sizeSplits,$axis);return derTensors.map(t=>()=>t)}};var conv2DGradConfig2={kernelName:Conv2D3,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let[x4D,$filter]=saved,{dilations,strides,pad:pad7,dataFormat}=attrs;return assert3(tupleValuesAreOne2(dilations),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${dilations}'`),{x:()=>conv2DBackpropInput4(x4D.shape,dy,$filter,strides,pad7,dataFormat),filter:()=>conv2DBackpropFilter3(x4D,dy,$filter.shape,strides,pad7,dataFormat)}}};var conv2DBackpropInputGradConfig2={kernelName:Conv2DBackpropInput2,inputsToSave:["dy","filter"],gradFunc:(ddx,saved,attrs)=>{let[dy,filter]=saved,{strides,pad:pad7,dataFormat,dimRoundingMode}=attrs;return{dy:()=>conv2d2(ddx,filter,strides,pad7,dataFormat,1,dimRoundingMode),filter:()=>conv2DBackpropFilter3(ddx,dy,filter.shape,strides,pad7,dataFormat,dimRoundingMode)}}};function conv3DBackpropFilter_2(x,dy,filterShape,strides,pad7){let x5D=x;x.rank===4&&(x5D=reshape2(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]));let dy5D=dy;dy5D.rank===4&&(dy5D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2],dy.shape[3]])),assert3(x5D.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${x5D.shape}.`),assert3(dy5D.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${dy5D.shape}.`),assert3(filterShape.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${filterShape}.`),assert3(x5D.shape[4]===filterShape[3],()=>`Error in conv3dDerFilter: depth of input ${x5D.shape[4]}) must match input depth in filter (${filterShape[3]}.`),assert3(dy5D.shape[4]===filterShape[4],()=>`Error in conv3dDerFilter: depth of dy (${dy5D.shape[4]}) must match output depth for filter (${filterShape[4]}).`);let forward=backend3=>{let dilations=1,convInfo=computeConv3DInfo2(x5D.shape,filterShape,strides,dilations,pad7);return backend3.conv3dDerFilter(x5D,dy5D,convInfo)},inputs={x:x5D,dy:dy5D},attrs={strides,pad:pad7,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,Conv3DBackpropFilterV22,attrs)}var conv3DBackpropFilter2=op2({conv3DBackpropFilter_:conv3DBackpropFilter_2});var conv3DGradConfig2={kernelName:Conv3D3,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let{dilations,strides,pad:pad7}=attrs;assert3(tupleValuesAreOne2(dilations),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${dilations}'`);let[x5D,$filter]=saved;return{x:()=>conv3DBackpropInput2(x5D.shape,dy,$filter,strides,pad7),filter:()=>conv3DBackpropFilter2(x5D,dy,$filter.shape,strides,pad7)}}};var cosGradConfig2={kernelName:Cos2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(neg2(sin2(cast2(x,"float32"))),dy)}}};var coshGradConfig2={kernelName:Cosh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(sinh2(cast2(x,"float32")),dy)}}};var cumsumGradConfig2={kernelName:Cumsum2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{axis,exclusive,reverse:reverse8}=attrs;return{x:()=>{let permutation=getAxesPermutation2([axis],x.rank),out=cumsum2(dy,axis,exclusive,!reverse8);return permutation!=null&&(out=transpose2(out,permutation)),out}}}};var depthwiseConv2dNativeGradConfig2={kernelName:DepthwiseConv2dNative2,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let{dilations,strides,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1]:dilations;assert3(tupleValuesAreOne2($dilations),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${$dilations}'`);let[x,filter]=saved;return assert3(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),assert3(filter.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${filter.rank}.`),assert3(x.shape[3]===filter.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${filter.shape[2]}.`),assert3(eitherStridesOrDilationsAreOne2(strides,$dilations),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${strides} and dilations '${$dilations}'.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`),{x:()=>depthwiseConv2dNativeBackpropInput3(x.shape,dy,filter,strides,pad7,dilations,dimRoundingMode),filter:()=>depthwiseConv2dNativeBackpropFilter3(x,dy,filter.shape,strides,pad7,dilations,dimRoundingMode)}}};var dilation2dGradConfig2={kernelName:Dilation2D2,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let[x,filter]=saved,inputInputs={x,filter,dy},filterInputs={x,filter,dy};return{x:()=>ENGINE2.runKernel(Dilation2DBackpropInput2,inputInputs,attrs),filter:()=>ENGINE2.runKernel(Dilation2DBackpropFilter2,filterInputs,attrs)}}};var divGradConfig2={kernelName:Div2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=div2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);reduceAxes.length>0&&(res=reshape2(sum3(res,reduceAxes),b.shape));let tmp=square2(b);return neg2(div2(res,cast2(tmp,"float32")))};return{a:derA,b:derB}}};var eluGradConfig2={kernelName:Elu3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved,backPropKernelFunc=backend3=>backend3.eluDer(dy,y),inputs={dy,y};return{x:()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,EluGrad2)}}};var erfGradConfig2={kernelName:Erf2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved,a=mul2(exp2(neg2(square2(x))),2/Math.sqrt(Math.PI));return{x:()=>mul2(dy,a)}}};var expGradConfig2={kernelName:Exp2,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(dy,y)}}};var expm1GradConfig2={kernelName:Expm12,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,exp2(x))}}};var floorGradConfig2={kernelName:Floor2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var floorDivGradConfig2={kernelName:FloorDiv2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=div2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);reduceAxes.length>0&&(res=reshape2(sum3(res,reduceAxes),b.shape));let tmp=square2(b);return neg2(div2(res,cast2(tmp,"float32")))};return{a:derA,b:derB}}};var fusedBatchNormGradConfig2={kernelName:FusedBatchNorm2,inputsToSave:["x","mean","variance","scale"],gradFunc:(dy,saved,attrs)=>{let{varianceEpsilon}=attrs,[x,mean7,variance,scale3]=saved,scaleValue=scale3==null?scalar2(1):scale3,reductionAxes=getReductionAxes2(mean7.shape,x.shape),tileShape=[];if(mean7.rank===1){for(let i=0;imean7.rank===1?reshape2(mul2(mul2(dy,tile2(reshape2(oneOverSqrtVariance,[1,1,1,mean7.shape[0]]),tileShape)),scaleValue),x.shape):reshape2(mul2(mul2(dy,oneOverSqrtVariance),scaleValue),x.shape),derMean=()=>{let meanDer=mul2(mul2(oneOverSqrtVariance,scalar2(-1)),dyTimesScaleValue);return mean7.rank===1&&(meanDer=sum3(meanDer,reductionAxes)),reshape2(meanDer,mean7.shape)},derVariance=()=>{let varianceDer=mul2(mul2(minusHalfRCube,xMinusMean),dyTimesScaleValue);return mean7.rank===1&&(varianceDer=sum3(varianceDer,reductionAxes)),reshape2(varianceDer,mean7.shape)},derScale=()=>{let xMinusMean2TimesRsqrt=mul2(xMinusMean,oneOverSqrtVariance),scaleDer=mul2(dy,xMinusMean2TimesRsqrt);return mean7.rank===1&&(scaleDer=sum3(scaleDer,reductionAxes)),reshape2(scaleDer,mean7.shape)},derOffset=()=>{let offsetDer=dy;return mean7.rank===1&&(offsetDer=sum3(offsetDer,reductionAxes)),reshape2(offsetDer,mean7.shape)};return{x:derX,mean:derMean,variance:derVariance,scale:derScale,offset:derOffset}}};var gatherGradConfig2={kernelName:GatherV22,inputsToSave:["x","indices"],gradFunc:(dy,saved,attrs)=>{let[x,indices]=saved,{axis}=attrs,parsedAxis=parseAxisParam2(axis,x.shape)[0],derX=()=>{let paramsShape=x.shape,indicesSize=indices.size,outerShape=paramsShape.slice(0,parsedAxis),outerDims=outerShape.length,innerShape=paramsShape.slice(axis,paramsShape.length).slice(1),innerDims=innerShape.length,outerAxesIndices=arrayRange2(0,outerDims),innerAxesIndices=arrayRange2(outerDims+1,outerDims+1+innerDims),valuesShape=arrayConcat2([outerShape,[indicesSize],innerShape]),values=reshape2(dy,valuesShape),reshapedIndices=reshape2(indices,[indicesSize]),transposeDims=arrayConcat2([[outerDims],outerAxesIndices,innerAxesIndices]),valuesTranspose=transpose2(values,transposeDims),paramsGrad=unsortedSegmentSum2(valuesTranspose,reshapedIndices,x.shape[parsedAxis]),invertTransposeDims=getUndoAxesPermutation2(transposeDims);return paramsGrad=transpose2(paramsGrad,invertTransposeDims),paramsGrad};return{x:derX,indices:()=>indices}}};function arrayRange2(start,stop){let result=[];for(let i=start;i{let[a,b]=saved;return{a:()=>zerosLike3(a),b:()=>zerosLike3(b)}}};var identityGradConfig2={kernelName:Identity3,gradFunc:dy=>({x:()=>cast2(dy,"float32")})};var isFiniteGradConfig2={kernelName:IsFinite2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var isInfGradConfig2={kernelName:IsInf2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var isNanGradConfig2={kernelName:IsNan2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var log1pGradConfig2={kernelName:Log1p2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,add4(x,1))}}};var logGradConfig2={kernelName:Log2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,cast2(x,"float32"))}}};var logSoftmaxGradConfig2={kernelName:LogSoftmax3,inputsToSave:[],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[value]=saved,{axis}=attrs;return{logits:()=>{let keepDims=!0,softmax7=exp2(value);return sub2(dy,mul2(sum3(dy,axis,keepDims),softmax7))}}}};function localResponseNormalizationBackprop_2(x,y,dy,depthRadius=5,bias=1,alpha=1,beta=.5){let forward=backend3=>backend3.LRNGrad(dy,x,y,depthRadius,bias,alpha,beta),inputs={x,y,dy},attrs={depthRadius,bias,alpha,beta};return ENGINE2.runKernelFunc(forward,inputs,null,LRNBackprop2,attrs)}var localResponseNormalizationBackprop2=op2({localResponseNormalizationBackprop_:localResponseNormalizationBackprop_2});var lrnGradConfig2={kernelName:LRN2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{depthRadius,bias,alpha,beta}=attrs;return{x:()=>localResponseNormalizationBackprop2(x,y,dy,depthRadius,bias,alpha,beta)}}};function gradForMinAndMax2(dy,y,xOrig,origAxes){return y.rank{let dx=mul2(dy,cast2(equal2(xOrig,y),dy.dtype));return dx}}}var maxGradConfig2={kernelName:Max2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let maxAttrs=attrs,{reductionIndices}=maxAttrs,x=saved[0],y=saved[1],origAxes=parseAxisParam2(reductionIndices,x.shape),maxGrad=gradForMinAndMax2(dy,y,x,origAxes);return{x:()=>maxGrad.x()}}};var maximumGradConfig2={kernelName:Maximum3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,derA=()=>mul2(dy,cast2(greaterEqual2(a,b),"float32")),derB=()=>mul2(dy,cast2(less2(a,b),"float32"));return{a:derA,b:derB}}};function maxPool3dBackprop_2(dy,input2,output,filterSize,strides,dilations=[1,1,1],pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","maxPool3dBackprop"),$input=convertToTensor2(input2,"input","maxPool3dBackprop"),$output=convertToTensor2(output,"output","maxPool3dBackprop"),dy5D=$dy,input5D=$input,output5D=$output,reshapedTo5D=!1;$input.rank===4&&(reshapedTo5D=!0,dy5D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2],$dy.shape[3]]),input5D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2],$input.shape[3]]),output5D=reshape2($output,[1,$output.shape[0],$output.shape[1],$output.shape[2],$output.shape[3]])),assert3(dy5D.rank===5,()=>`Error in maxPool3dBackprop: dy must be rank 5 but got rank ${dy5D.rank}.`),assert3(input5D.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${input5D.rank}.`),assert3(output5D.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${output5D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool3DInfo2(input5D.shape,filterSize,strides,dilations,pad7,dimRoundingMode);return backend3.maxPool3dBackprop(dy5D,input5D,output5D,convInfo)},inputs={dy:dy5D,input:input5D,output:output5D},attrs={filterSize,strides,dilations,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,MaxPool3DBackprop2,attrs);return reshapedTo5D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3],res.shape[4]]):res}var maxPool3dBackprop2=op2({maxPool3dBackprop_:maxPool3dBackprop_2});var maxPool3DGradConfig2={kernelName:MaxPool3D2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{filterSize,strides,dilations,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1,1]:dilations;return{x:()=>maxPool3dBackprop2(dy,x,y,filterSize,strides,$dilations,pad7,dimRoundingMode)}}};function maxPoolBackprop_2(dy,input2,output,filterSize,strides,pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","maxPoolBackprop"),$input=convertToTensor2(input2,"input","maxPoolBackprop"),$output=convertToTensor2(output,"output","maxPoolBackprop");assert3($input.rank===$dy.rank,()=>`Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`),assert3($dy.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${$dy.rank}.`),assert3($input.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${$input.rank}.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool2DInfo2($input.shape,filterSize,strides,1,pad7,dimRoundingMode);return backend3.maxPoolBackprop($dy,$input,$output,convInfo)},inputs={dy:$dy,input:$input,output:$output},attrs={filterSize,strides,pad:pad7,dimRoundingMode};return ENGINE2.runKernelFunc(forward,inputs,null,MaxPoolBackprop2,attrs)}var maxPoolBackprop4=op2({maxPoolBackprop_:maxPoolBackprop_2});var maxPoolGradConfig2={kernelName:MaxPool2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{filterSize,strides,pad:pad7}=attrs;return{x:()=>maxPoolBackprop4(dy,x,y,filterSize,strides,pad7)}}};var minGradConfig2={kernelName:Min2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let minAttrs=attrs,{axis}=minAttrs,[x,y]=saved,origAxes=parseAxisParam2(axis,x.shape),minGrad=gradForMinAndMax2(dy,y,x,origAxes);return{x:()=>minGrad.x()}}};var minimumGradConfig2={kernelName:Minimum3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,derA=()=>mul2(dy,cast2(lessEqual2(a,b),"float32")),derB=()=>mul2(dy,cast2(greater2(a,b),"float32"));return{a:derA,b:derB}}};var mirrorPadGradConfig2={kernelName:MirrorPad2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let x=saved[0],{paddings}=attrs,begin=paddings.map(p2=>p2[0]);return{x:()=>slice2(dy,begin,x.shape)}}};var modGradConfig2={kernelName:Mod2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(dy,reduceAxes),a.shape):dy},derB=()=>{let res=mul2(dy,neg2(floor2(div2(a,b)))),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),b.shape):res};return{a:derA,b:derB}}};var multiplyGradConfig2={kernelName:Multiply3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=mul2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),b.shape):res};return{a:derA,b:derB}}};var negateGradConfig2={kernelName:Negate2,gradFunc:dy=>({x:()=>neg2(dy)})};var oneHotGradConfig2={kernelName:OneHot2,inputsToSave:["indices"],gradFunc:(dy,saved)=>{let indices=saved[0];return{indices:()=>zeros2(indices.shape,"float32")}}};var onesLikeGradConfig2={kernelName:OnesLike2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var padV2GradConfig2={kernelName:PadV22,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let x=saved[0],{paddings}=attrs,begin=paddings.map(p2=>p2[0]);return{x:()=>slice2(dy,begin,x.shape)}}};var powGradConfig2={kernelName:Pow2,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(dy,saved)=>{let[a,b,y]=saved,base2=a,exp14=b,outShape=assertAndGetBroadcastShape2(base2.shape,exp14.shape),derBase=()=>{let expFloat=cast2(exp14,"float32"),res=mul2(dy,mul2(expFloat,pow2(base2,sub2(expFloat,scalar2(1))))),reduceAxes=getReductionAxes2(base2.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,base2.shape)},derExp=()=>{let condition=greater2(base2,0),logBase=where2(condition,log2(base2),zerosLike3(base2)),res=mul2(dy,mul2(y,logBase)),reduceAxes=getReductionAxes2(exp14.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,exp14.shape)};return{a:derBase,b:derExp}}};var preluGradConfig2={kernelName:Prelu2,inputsToSave:["x","alpha"],gradFunc:(dy,saved)=>{let[x,alpha]=saved,mask=greater2(x,0);return{x:()=>where2(mask,dy,mul2(dy,alpha)),alpha:()=>{let res=where2(mask,zerosLike3(dy),mul2(dy,x)),reduceAxes=getReductionAxes2(alpha.shape,dy.shape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,alpha.shape)}}}};var reciprocalGradConfig2={kernelName:Reciprocal2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,neg2(square2(x)))}}};var relu6GradConfig2={kernelName:Relu63,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved,mask=mul2(lessEqual2(x,6),step2(x));return{x:()=>mul2(dy,cast2(mask,"float32"))}}};var reluGradConfig2={kernelName:Relu3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,cast2(step2(x),"float32"))}}};var reshapeGradConfig2={kernelName:Reshape3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>reshape2(dy,x.shape)}}};var resizeBilinearGradConfig2={kernelName:ResizeBilinear2,inputsToSave:["images"],gradFunc:(dy,saved,attrs)=>{let[images]=saved,backPropKernelFunc=backend3=>{let{alignCorners}=attrs;return backend3.resizeBilinearBackprop(dy,images,alignCorners)},inputs={images},imagesDer=()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,ResizeBilinearGrad2,attrs);return{images:imagesDer}}};var resizeNearestNeighborGradConfig2={kernelName:ResizeNearestNeighbor2,inputsToSave:["images"],gradFunc:(dy,saved,attrs)=>{let[images]=saved,backPropKernelFunc=backend3=>{let{alignCorners}=attrs;return backend3.resizeNearestNeighborBackprop(dy,images,alignCorners)},inputs={images},imagesDer=()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,ResizeNearestNeighborGrad2,attrs);return{images:imagesDer}}};var reverseGradConfig2={kernelName:Reverse2,gradFunc:(dy,saved,attrs)=>{let{dims}=attrs,axes=parseAxisParam2(dims,dy.shape);return{x:()=>reverse2(dy,axes)}}};var roundGradConfig2={kernelName:Round2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var rsqrtGradConfig2={kernelName:Rsqrt2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>neg2(div2(dy,mul2(pow2(x,1.5),2)))}}};var selectV2PoolGradConfig2={kernelName:SelectV22,inputsToSave:["condition"],gradFunc:(dy,saved)=>{let[condition]=saved;return{condition:()=>cast2(zerosLike3(condition),"float32"),t:()=>mul2(dy,cast2(condition,dy.dtype)),e:()=>mul2(dy,cast2(logicalNot3(condition),dy.dtype))}}};var seluGradConfig2={kernelName:Selu3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let mask=greater2(x,scalar2(0)),scaleAlpha2=scalar2(SELU_SCALEALPHA2),scale3=scalar2(SELU_SCALE2),greaterThanZeroDer=mul2(dy,scale3),lessEqualZeroDer=mul2(mul2(dy,scaleAlpha2),exp2(cast2(x,"float32")));return where2(mask,greaterThanZeroDer,lessEqualZeroDer)}}}};var sigmoidGradConfig2={kernelName:Sigmoid3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(dy,mul2(y,sub2(scalar2(1),y)))}}};var signGradConfig2={kernelName:Sign2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var sinGradConfig2={kernelName:Sin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(cos2(cast2(x,"float32")),dy)}}};var sinhGradConfig2={kernelName:Sinh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(cosh2(cast2(x,"float32")),dy)}}};var sliceGradConfig2={kernelName:Slice2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{begin,size}=attrs,inputShape=x.shape,[begin_,size_]=parseSliceParams2(x,begin,size),paddings=[];for(let i=0;ipad2(dy,paddings)}}};var softmaxGradConfig2={kernelName:Softmax4,outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[y]=saved,{dim}=attrs,keepDims=!0,dyTimesY=mul2(dy,y);return{logits:()=>sub2(dyTimesY,mul2(sum3(dyTimesY,[dim],keepDims),y))}}};var softplusGradConfig2={kernelName:Softplus3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,sigmoid3(x))}}};var spaceToBatchNDGradConfig2={kernelName:SpaceToBatchND2,gradFunc:(dy,saved,attrs)=>{let{blockShape,paddings}=attrs;return{x:()=>batchToSpaceND2(dy,blockShape,paddings)}}};var splitVGradConfig2={kernelName:SplitV2,gradFunc:(dy,saved,attrs)=>{let{axis}=attrs;return{x:()=>concat2(dy,axis)}}};var sqrtGradConfig2={kernelName:Sqrt2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,mul2(sqrt2(cast2(x,"float32")),2))}}};var squareGradConfig2={kernelName:Square2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,mul2(cast2(x,"float32"),2))}}};var squaredDifferenceGradConfig2={kernelName:SquaredDifference2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,two=scalar2(2),derA=()=>mul2(dy,mul2(two,sub2(a,b))),derB=()=>mul2(dy,mul2(two,sub2(b,a)));return{a:derA,b:derB}}};var stepGradConfig2={kernelName:Step2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var subGradConfig2={kernelName:Sub2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=dy,reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let res=dy,reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(neg2(res),b.shape)};return{a:derA,b:derB}}};var sumGradConfig2={kernelName:Sum2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,expandedDyShape=x.shape.slice(),{axis}=attrs,axes=parseAxisParam2(axis,x.shape);axes.forEach(axis2=>{expandedDyShape[axis2]=1});let expandedDy=reshape2(dy,expandedDyShape),derX=mul2(expandedDy,ones4(x.shape,"float32"));return{x:()=>derX}}};var tanGradConfig2={kernelName:Tan2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,square2(cos2(x)))}}};var tanhGradConfig2={kernelName:Tanh3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(sub2(scalar2(1),square2(y)),dy)}}};var tileGradConfig2={kernelName:Tile2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{reps}=attrs,derX=()=>{let xGrad=zerosLike3(x);if(x.rank===1)for(let i=0;i{let transposeAttrs=attrs,{perm}=transposeAttrs,undoPerm=getUndoAxesPermutation2(perm);return{x:()=>transpose2(dy,undoPerm)}}};var unpackGradConfig2={kernelName:Unpack2,gradFunc:(dy,saved,attrs)=>{let unpackAttrs=attrs,{axis}=unpackAttrs;return{value:()=>stack2(dy,axis)}}};var unsortedSegmentSumGradConfig2={kernelName:UnsortedSegmentSum2,inputsToSave:["segmentIds"],gradFunc:(dy,saved)=>{let[segmentIds]=saved,derX=()=>gatherDropNegatives2(dy,segmentIds);return{x:derX}}};function gatherDropNegatives2(x,indices){let zeroClippedIndices=maximum2(indices,zerosLike3(indices)),gathered=gather2(x,zeroClippedIndices),isPositive=greaterEqual2(indices,scalar2(0,"int32")),numIters=gathered.rank-isPositive.rank;for(let i=0;i({x:()=>zerosLike3(dy)})};var gradConfigs2=[absGradConfig2,acosGradConfig2,acoshGradConfig2,addGradConfig2,addNGradConfig2,argMaxGradConfig2,argMinGradConfig2,asinGradConfig2,asinhGradConfig2,atan2GradConfig2,atanGradConfig2,atanhGradConfig2,avgPool3DGradConfig2,avgPoolGradConfig2,batchMatMulGradConfig2,batchToSpaceNDGradConfig2,broadcastToGradConfig2,castGradConfig2,ceilGradConfig2,clipByValueGradConfig2,concatGradConfig2,conv2DBackpropInputGradConfig2,conv2DGradConfig2,conv3DGradConfig2,cosGradConfig2,coshGradConfig2,cumsumGradConfig2,depthwiseConv2dNativeGradConfig2,dilation2dGradConfig2,divGradConfig2,eluGradConfig2,erfGradConfig2,expGradConfig2,expm1GradConfig2,floorDivGradConfig2,floorGradConfig2,fusedBatchNormGradConfig2,gatherGradConfig2,greaterEqualGradConfig2,identityGradConfig2,isFiniteGradConfig2,isInfGradConfig2,isNanGradConfig2,log1pGradConfig2,logGradConfig2,logSoftmaxGradConfig2,lrnGradConfig2,maxGradConfig2,maxGradConfig2,maximumGradConfig2,maxPool3DGradConfig2,maxPoolGradConfig2,minGradConfig2,minimumGradConfig2,mirrorPadGradConfig2,modGradConfig2,multiplyGradConfig2,negateGradConfig2,oneHotGradConfig2,onesLikeGradConfig2,padV2GradConfig2,padV2GradConfig2,powGradConfig2,preluGradConfig2,reciprocalGradConfig2,relu6GradConfig2,reluGradConfig2,reshapeGradConfig2,resizeBilinearGradConfig2,resizeNearestNeighborGradConfig2,reverseGradConfig2,roundGradConfig2,rsqrtGradConfig2,selectV2PoolGradConfig2,seluGradConfig2,sigmoidGradConfig2,signGradConfig2,sinGradConfig2,sinhGradConfig2,sliceGradConfig2,softmaxGradConfig2,softplusGradConfig2,spaceToBatchNDGradConfig2,spaceToBatchNDGradConfig2,splitVGradConfig2,splitVGradConfig2,sqrtGradConfig2,squaredDifferenceGradConfig2,squareGradConfig2,stepGradConfig2,subGradConfig2,sumGradConfig2,tanGradConfig2,tanhGradConfig2,tileGradConfig2,transposeGradConfig2,unpackGradConfig2,unsortedSegmentSumGradConfig2,zerosLikeGradConfig2];for(let gradientConfig of gradConfigs2)registerGradient2(gradientConfig);Tensor2.prototype.abs=function(){return this.throwIfDisposed(),abs2(this)};Tensor2.prototype.acos=function(){return this.throwIfDisposed(),acos2(this)};Tensor2.prototype.acosh=function(){return this.throwIfDisposed(),acosh2(this)};Tensor2.prototype.addStrict=function(x){return this.throwIfDisposed(),addStrict2(this,x)};Tensor2.prototype.add=function(b){return this.throwIfDisposed(),add4(this,b)};Tensor2.prototype.all=function(axis,keepDims){return this.throwIfDisposed(),all2(this,axis,keepDims)};Tensor2.prototype.any=function(axis,keepDims){return this.throwIfDisposed(),any2(this,axis,keepDims)};Tensor2.prototype.argMax=function(axis){return this.throwIfDisposed(),argMax2(this,axis)};Tensor2.prototype.argMin=function(axis){return this.throwIfDisposed(),argMin2(this,axis)};Tensor2.prototype.asScalar=function(){return this.throwIfDisposed(),assert3(this.size===1,()=>"The array must have only 1 element."),reshape2(this,[])};Tensor2.prototype.asType=function(dtype){return this.throwIfDisposed(),cast2(this,dtype)};Tensor2.prototype.as1D=function(){return this.throwIfDisposed(),reshape2(this,[this.size])};Tensor2.prototype.as2D=function(rows,columns){return this.throwIfDisposed(),reshape2(this,[rows,columns])};Tensor2.prototype.as3D=function(rows,columns,depth){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth])};Tensor2.prototype.as4D=function(rows,columns,depth,depth2){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth,depth2])};Tensor2.prototype.as5D=function(rows,columns,depth,depth2,depth3){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth,depth2,depth3])};Tensor2.prototype.asin=function(){return this.throwIfDisposed(),asin2(this)};Tensor2.prototype.asinh=function(){return this.throwIfDisposed(),asinh2(this)};Tensor2.prototype.atan=function(){return this.throwIfDisposed(),atan3(this)};Tensor2.prototype.atan2=function(b){return this.throwIfDisposed(),atan22(this,b)};Tensor2.prototype.atanh=function(){return this.throwIfDisposed(),atanh2(this)};Tensor2.prototype.avgPool=function(filterSize,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),avgPool5(this,filterSize,strides,pad7,dimRoundingMode)};Tensor2.prototype.batchToSpaceND=function(blockShape,crops){return this.throwIfDisposed(),batchToSpaceND2(this,blockShape,crops)};Tensor2.prototype.batchNorm=function(mean7,variance,offset,scale3,varianceEpsilon){return this.throwIfDisposed(),batchNorm4(this,mean7,variance,offset,scale3,varianceEpsilon)};Tensor2.prototype.broadcastTo=function(shape){return this.throwIfDisposed(),broadcastTo2(this,shape)};Tensor2.prototype.cast=function(dtype){return this.throwIfDisposed(),cast2(this,dtype)};Tensor2.prototype.ceil=function(){return this.throwIfDisposed(),ceil2(this)};Tensor2.prototype.clipByValue=function(min9,max11){return this.throwIfDisposed(),clipByValue2(this,min9,max11)};Tensor2.prototype.concat=function(x,axis){return this.throwIfDisposed(),x instanceof Tensor2&&(x=[x]),concat2([this,...x],axis)};Tensor2.prototype.conv1d=function(filter,stride,pad7,dataFormat,dilation,dimRoundingMode){return this.throwIfDisposed(),conv1d2(this,filter,stride,pad7,dataFormat,dilation,dimRoundingMode)};Tensor2.prototype.conv2dTranspose=function(filter,outputShape,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),conv2dTranspose3(this,filter,outputShape,strides,pad7,dimRoundingMode)};Tensor2.prototype.conv2d=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return this.throwIfDisposed(),conv2d2(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.cos=function(){return this.throwIfDisposed(),cos2(this)};Tensor2.prototype.cosh=function(){return this.throwIfDisposed(),cosh2(this)};Tensor2.prototype.cumsum=function(axis,exclusive,reverse8){return this.throwIfDisposed(),cumsum2(this,axis,exclusive,reverse8)};Tensor2.prototype.depthToSpace=function(blockSize,dataFormat){return this.throwIfDisposed(),depthToSpace3(this,blockSize,dataFormat)};Tensor2.prototype.depthwiseConv2D=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return deprecationWarn2("depthwiseConv2D is deprecated, use depthwiseConv2d instead"),this.throwIfDisposed(),depthwiseConv2d6(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.depthwiseConv2d=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return this.throwIfDisposed(),depthwiseConv2d6(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.dilation2d=function(filter,strides,pad7,dilations,dataFormat){return this.throwIfDisposed(),dilation2d2(this,filter,strides,pad7,dilations,dataFormat)};Tensor2.prototype.divNoNan=function(b){return this.throwIfDisposed(),divNoNan2(this,b)};Tensor2.prototype.divStrict=function(x){return this.throwIfDisposed(),divStrict2(this,x)};Tensor2.prototype.div=function(b){return this.throwIfDisposed(),div2(this,b)};Tensor2.prototype.dot=function(b){return this.throwIfDisposed(),dot2(this,b)};Tensor2.prototype.elu=function(){return this.throwIfDisposed(),elu2(this)};Tensor2.prototype.equalStrict=function(x){return this.throwIfDisposed(),equalStrict2(this,x)};Tensor2.prototype.equal=function(b){return this.throwIfDisposed(),equal2(this,b)};Tensor2.prototype.erf=function(){return this.throwIfDisposed(),erf2(this)};Tensor2.prototype.exp=function(){return this.throwIfDisposed(),exp2(this)};Tensor2.prototype.expandDims=function(axis){return this.throwIfDisposed(),expandDims3(this,axis)};Tensor2.prototype.expm1=function(){return this.throwIfDisposed(),expm12(this)};Tensor2.prototype.fft=function(){return this.throwIfDisposed(),fft2(this)};Tensor2.prototype.flatten=function(){return this.throwIfDisposed(),reshape2(this,[this.size])};Tensor2.prototype.floor=function(){return this.throwIfDisposed(),floor2(this)};Tensor2.prototype.floorDiv=function(b){return this.throwIfDisposed(),floorDiv2(this,b)};Tensor2.prototype.gather=function(indices,axis){return this.throwIfDisposed(),gather2(this,indices,axis)};Tensor2.prototype.greaterEqualStrict=function(x){return this.throwIfDisposed(),greaterEqualStrict2(this,x)};Tensor2.prototype.greaterEqual=function(b){return this.throwIfDisposed(),greaterEqual2(this,b)};Tensor2.prototype.greaterStrict=function(x){return this.throwIfDisposed(),greaterStrict2(this,x)};Tensor2.prototype.greater=function(b){return this.throwIfDisposed(),greater2(this,b)};Tensor2.prototype.ifft=function(){return this.throwIfDisposed(),ifft2(this)};Tensor2.prototype.irfft=function(){return this.throwIfDisposed(),irfft2(this)};Tensor2.prototype.isFinite=function(){return this.throwIfDisposed(),isFinite4(this)};Tensor2.prototype.isInf=function(){return this.throwIfDisposed(),isInf3(this)};Tensor2.prototype.isNaN=function(){return this.throwIfDisposed(),isNaN4(this)};Tensor2.prototype.leakyRelu=function(alpha){return this.throwIfDisposed(),leakyRelu2(this,alpha)};Tensor2.prototype.lessEqualStrict=function(x){return this.throwIfDisposed(),lessEqualStrict2(this,x)};Tensor2.prototype.lessEqual=function(b){return this.throwIfDisposed(),lessEqual2(this,b)};Tensor2.prototype.lessStrict=function(x){return this.throwIfDisposed(),lessStrict2(this,x)};Tensor2.prototype.less=function(b){return this.throwIfDisposed(),less2(this,b)};Tensor2.prototype.localResponseNormalization=function(depthRadius,bias,alpha,beta){return this.throwIfDisposed(),localResponseNormalization2(this,depthRadius,bias,alpha,beta)};Tensor2.prototype.logSigmoid=function(){return this.throwIfDisposed(),logSigmoid2(this)};Tensor2.prototype.logSoftmax=function(axis){return this.throwIfDisposed(),logSoftmax2(this,axis)};Tensor2.prototype.logSumExp=function(axis,keepDims){return this.throwIfDisposed(),logSumExp2(this,axis,keepDims)};Tensor2.prototype.log=function(){return this.throwIfDisposed(),log2(this)};Tensor2.prototype.log1p=function(){return this.throwIfDisposed(),log1p2(this)};Tensor2.prototype.logicalAnd=function(b){return this.throwIfDisposed(),logicalAnd2(this,b)};Tensor2.prototype.logicalNot=function(){return this.throwIfDisposed(),logicalNot3(this)};Tensor2.prototype.logicalOr=function(b){return this.throwIfDisposed(),logicalOr2(this,b)};Tensor2.prototype.logicalXor=function(b){return this.throwIfDisposed(),logicalXor2(this,b)};Tensor2.prototype.matMul=function(b,transposeA,transposeB){return this.throwIfDisposed(),matMul3(this,b,transposeA,transposeB)};Tensor2.prototype.maxPool=function(filterSize,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),maxPool5(this,filterSize,strides,pad7,dimRoundingMode)};Tensor2.prototype.max=function(axis,keepDims){return this.throwIfDisposed(),max2(this,axis,keepDims)};Tensor2.prototype.maximumStrict=function(x){return this.throwIfDisposed(),maximumStrict2(this,x)};Tensor2.prototype.maximum=function(b){return this.throwIfDisposed(),maximum2(this,b)};Tensor2.prototype.mean=function(axis,keepDims){return this.throwIfDisposed(),mean2(this,axis,keepDims)};Tensor2.prototype.min=function(axis,keepDims){return this.throwIfDisposed(),min2(this,axis,keepDims)};Tensor2.prototype.minimumStrict=function(x){return this.throwIfDisposed(),minimumStrict2(this,x)};Tensor2.prototype.minimum=function(b){return this.throwIfDisposed(),minimum2(this,b)};Tensor2.prototype.mirrorPad=function(paddings,mode){return this.throwIfDisposed(),mirrorPad3(this,paddings,mode)};Tensor2.prototype.modStrict=function(x){return this.throwIfDisposed(),modStrict2(this,x)};Tensor2.prototype.mod=function(b){return this.throwIfDisposed(),mod2(this,b)};Tensor2.prototype.mulStrict=function(x){return this.throwIfDisposed(),mulStrict2(this,x)};Tensor2.prototype.mul=function(b){return this.throwIfDisposed(),mul2(this,b)};Tensor2.prototype.neg=function(){return this.throwIfDisposed(),neg2(this)};Tensor2.prototype.norm=function(ord,axis,keepDims){return this.throwIfDisposed(),norm2(this,ord,axis,keepDims)};Tensor2.prototype.notEqualStrict=function(x){return this.throwIfDisposed(),notEqualStrict2(this,x)};Tensor2.prototype.notEqual=function(b){return this.throwIfDisposed(),notEqual4(this,b)};Tensor2.prototype.oneHot=function(depth,onValue=1,offValue=0){return this.throwIfDisposed(),oneHot3(this,depth,onValue,offValue)};Tensor2.prototype.onesLike=function(){return this.throwIfDisposed(),onesLike3(this)};Tensor2.prototype.pad=function(paddings,constantValue){return this.throwIfDisposed(),pad2(this,paddings,constantValue)};Tensor2.prototype.pool=function(windowShape,poolingType,padding,dilationRate,strides){return this.throwIfDisposed(),pool2(this,windowShape,poolingType,padding,dilationRate,strides)};Tensor2.prototype.powStrict=function(exp14){return this.throwIfDisposed(),powStrict2(this,exp14)};Tensor2.prototype.pow=function(exp14){return this.throwIfDisposed(),pow2(this,exp14)};Tensor2.prototype.prelu=function(alpha){return this.throwIfDisposed(),prelu2(this,alpha)};Tensor2.prototype.prod=function(axis,keepDims){return this.throwIfDisposed(),prod2(this,axis,keepDims)};Tensor2.prototype.reciprocal=function(){return this.throwIfDisposed(),reciprocal2(this)};Tensor2.prototype.relu=function(){return this.throwIfDisposed(),relu2(this)};Tensor2.prototype.relu6=function(){return this.throwIfDisposed(),relu62(this)};Tensor2.prototype.reshapeAs=function(x){return this.throwIfDisposed(),reshape2(this,x.shape)};Tensor2.prototype.reshape=function(shape){return this.throwIfDisposed(),reshape2(this,shape)};Tensor2.prototype.resizeBilinear=function(newShape2D,alignCorners){return this.throwIfDisposed(),resizeBilinear3(this,newShape2D,alignCorners)};Tensor2.prototype.resizeNearestNeighbor=function(newShape2D,alignCorners){return this.throwIfDisposed(),resizeNearestNeighbor2(this,newShape2D,alignCorners)};Tensor2.prototype.reverse=function(axis){return this.throwIfDisposed(),reverse2(this,axis)};Tensor2.prototype.rfft=function(){return this.throwIfDisposed(),rfft2(this)};Tensor2.prototype.round=function(){return this.throwIfDisposed(),round3(this)};Tensor2.prototype.rsqrt=function(){return this.throwIfDisposed(),rsqrt2(this)};Tensor2.prototype.selu=function(){return this.throwIfDisposed(),selu2(this)};Tensor2.prototype.separableConv2d=function(depthwiseFilter,pointwiseFilter,strides,pad7,dilation,dataFormat){return this.throwIfDisposed(),separableConv2d3(this,depthwiseFilter,pointwiseFilter,strides,pad7,dilation,dataFormat)};Tensor2.prototype.sigmoid=function(){return this.throwIfDisposed(),sigmoid3(this)};Tensor2.prototype.sign=function(){return this.throwIfDisposed(),sign2(this)};Tensor2.prototype.sin=function(){return this.throwIfDisposed(),sin2(this)};Tensor2.prototype.sinh=function(){return this.throwIfDisposed(),sinh2(this)};Tensor2.prototype.slice=function(begin,size){return this.throwIfDisposed(),slice2(this,begin,size)};Tensor2.prototype.softmax=function(dim){return this.throwIfDisposed(),softmax2(this,dim)};Tensor2.prototype.softplus=function(){return this.throwIfDisposed(),softplus2(this)};Tensor2.prototype.spaceToBatchND=function(blockShape,paddings){return this.throwIfDisposed(),spaceToBatchND3(this,blockShape,paddings)};Tensor2.prototype.split=function(numOrSizeSplits,axis){return this.throwIfDisposed(),split2(this,numOrSizeSplits,axis)};Tensor2.prototype.sqrt=function(){return this.throwIfDisposed(),sqrt2(this)};Tensor2.prototype.square=function(){return this.throwIfDisposed(),square2(this)};Tensor2.prototype.squaredDifference=function(b){return this.throwIfDisposed(),squaredDifference4(this,b)};Tensor2.prototype.squaredDifferenceStrict=function(x){return this.throwIfDisposed(),squaredDifferenceStrict2(this,x)};Tensor2.prototype.squeeze=function(axis){return this.throwIfDisposed(),squeeze2(this,axis)};Tensor2.prototype.stack=function(x,axis){this.throwIfDisposed();let tensorsToBeStacked=x instanceof Tensor2?[this,x]:[this,...x];return stack2(tensorsToBeStacked,axis)};Tensor2.prototype.step=function(alpha){return this.throwIfDisposed(),step2(this,alpha)};Tensor2.prototype.stridedSlice=function(begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask){return this.throwIfDisposed(),stridedSlice3(this,begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask)};Tensor2.prototype.subStrict=function(x){return this.throwIfDisposed(),subStrict2(this,x)};Tensor2.prototype.sub=function(b){return this.throwIfDisposed(),sub2(this,b)};Tensor2.prototype.sum=function(axis,keepDims){return this.throwIfDisposed(),sum3(this,axis,keepDims)};Tensor2.prototype.tan=function(){return this.throwIfDisposed(),tan2(this)};Tensor2.prototype.tanh=function(){return this.throwIfDisposed(),tanh3(this)};Tensor2.prototype.tile=function(reps){return this.throwIfDisposed(),tile2(this,reps)};Tensor2.prototype.toBool=function(){return this.throwIfDisposed(),cast2(this,"bool")};Tensor2.prototype.toFloat=function(){return this.throwIfDisposed(),cast2(this,"float32")};Tensor2.prototype.toInt=function(){return this.throwIfDisposed(),cast2(this,"int32")};Tensor2.prototype.topk=function(k,sorted){return this.throwIfDisposed(),topk2(this,k,sorted)};Tensor2.prototype.transpose=function(perm){return this.throwIfDisposed(),transpose2(this,perm)};Tensor2.prototype.unique=function(axis){return this.throwIfDisposed(),unique2(this,axis)};Tensor2.prototype.unsortedSegmentSum=function(segmentIds,numSegments){return this.throwIfDisposed(),unsortedSegmentSum2(this,segmentIds,numSegments)};Tensor2.prototype.unstack=function(axis){return this.throwIfDisposed(),unstack2(this,axis)};Tensor2.prototype.where=function(condition,x){return this.throwIfDisposed(),where2(condition,this,x)};Tensor2.prototype.zerosLike=function(){return this.throwIfDisposed(),zerosLike3(this)};function imageToSquare(input2,inputSize,centerImage=!1){let{Image,Canvas}=env2.getEnv();if(!(input2 instanceof Image||input2 instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input2),scale3=inputSize/Math.max(dims.height,dims.width),width=scale3*dims.width,height=scale3*dims.height,targetCanvas=createCanvas2({width:inputSize,height:inputSize}),inputCanvas=input2 instanceof Canvas?input2:createCanvasFromMedia(input2),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input2)){this._imageTensors[idx]=input2,this._inputDimensions[idx]=input2.shape;return}if(isTensor4D(input2)){let batchSize=input2.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input2,this._inputDimensions[idx]=input2.shape.slice(1);return}let canvas=input2 instanceof env2.getEnv().Canvas?input2:createCanvasFromMedia(input2);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range2(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tidy2(()=>{let inputTensors=range2(this.batchSize,0,1).map(batchIdx=>{let input2=this.getInput(batchIdx);if(input2 instanceof Tensor2){let imgTensor=isTensor4D(input2)?input2:input2.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=image2.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input2 instanceof env2.getEnv().Canvas)return browser_exports2.fromPixels(imageToSquare(input2,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input2}`)}),batchTensor=stack2(inputTensors.map(t=>cast2(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input2,i)=>{if(!isMediaElement(input2)&&!isTensor3D(input2)&&!isTensor4D(input2))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input2)){let batchSize=input2.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input2=>isMediaElement(input2)&&awaitMediaLoaded(input2))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input2,detections){let{Canvas}=env2.getEnv(),canvas=input2;if(!(input2 instanceof Canvas)){let netInput=await toNetInput(input2);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas2({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init2){let fetch3=env2.getEnv().fetch,res=await fetch3(url,init2);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return io_exports.loadWeights(manifest,modelBaseUri)}function matchDimensions(input2,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input2.width=width,input2.height=height,{width,height}}var NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor163){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor163}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor163})=>{this.reassignParamFromPath(path,tensor163.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable4})=>{let tensor163=tensor4(variable4.dataSync());variable4.dispose(),this.reassignParamFromPath(path,tensor163)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor163})=>Array.from(tensor163.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env2.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights2=io_exports.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights2(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}};function depthwiseSeparableConv(x,params,stride){return tidy(()=>{let out=separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=add2(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tidy(()=>{let out1=relu(isFirstLayer?add2(conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=relu(add2(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return relu(add2(out1,add2(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tidy(()=>{let out1=relu(isFirstLayer?add2(conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=relu(add2(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=relu(add2(out1,add2(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return relu(add2(out1,add2(out2,add2(out3,out4))))})}function convLayer(x,params,padding="same",withRelu=!1){return tidy(()=>{let out=add2(conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor163=weightMap[originalPath];if(!isTensor(tensor163,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor163}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor163}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input2){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}};function fullyConnectedLayer(x,params){return tidy(()=>add2(matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input2){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tidy(()=>{let bottleneckFeatures=input2 instanceof NetInput?this.faceFeatureExtractor.forwardInput(input2):input2;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input2){return tidy(()=>softmax(this.runNet(input2)))}async forward(input2){return this.forwardInput(await toNetInput(input2))}async predictExpressions(input2){let netInput=await toNetInput(input2),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round2(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range2(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range2(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return add2(conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(relu(out),params.separable_conv1,[1,1]),out=maxPool(out,[3,3],[2,2],"same"),out=add2(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(relu(out),params.separable_conv2,[1,1]),out=add2(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input2){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(256)),out=relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range2(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input2){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tidy(()=>{let bottleneckFeatures=input2 instanceof NetInput?this.faceFeatureExtractor.forwardInput(input2):input2,pooled=avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input2){return tidy(()=>{let{age,gender}=this.runNet(input2);return{age,gender:softmax(gender)}})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async predictAgeAndGender(input2){let netInput=await toNetInput(input2),out=await this.forwardInput(netInput),ages=unstack(out.age),genders=unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale3=inputSize/Math.max(height,width);return{width:width*scale3,height:height*scale3}}),batchSize=inputDimensions.length;return tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>stack([fill([68],fillX,"float32"),fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding2=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding2(batchIdx,(w,h)=>wgetPadding2(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input2){return tidy(()=>{let out=this.runNet(input2);return this.postProcess(out,input2.inputSize,input2.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async detectLandmarks(input2){let netInput=await toNetInput(input2),landmarkTensors=tidy(()=>unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven2(i)),yCoords=landmarksArray.filter((_,i)=>!isEven2(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input2){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};function scale2(x,params){return add2(mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=conv2d(x,filters,strides,padding);return out=add2(out,bias),out=scale2(out,params.scale),withRelu?relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tidy(()=>transpose(tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tensor1d(extractWeights(numWeights)),biases=tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale3=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale3}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tidy(()=>transpose(tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale3=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale3}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=add2(out,x),out=relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=avgPool(x,2,2,"valid"),zeros10=zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=zeros(padShapeX);out=concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=zeros(padShapeY);out=concat([out,zerosH],2)}return pooled=isPad?concat([pooled,zeros10],3):pooled,out=add2(pooled,out),out=relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input2){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(256)),out=convDown(normalized,params.conv32_down);out=maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=matMul(globalAvg,params.fc);return fullyConnected})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async computeFaceDescriptor(input2){let netInput=await toNetInput(input2),faceDescriptorTensors=tidy(()=>unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tensor1d(extractWeights(numChannels)),batch_norm_offset=tensor1d(extractWeights(numChannels)),batch_norm_mean=tensor1d(extractWeights(numChannels)),batch_norm_variance=tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function pointwiseConvLayer(x,params,strides){return tidy(()=>{let out=conv2d(x,params.filters,strides,"same");return out=add2(out,params.batch_norm_offset),clipByValue(out,0,6)})}var epsilon3=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tidy(()=>{let out=depthwiseConv2d(x,params.filters,strides,"same");return out=batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon3),clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function getCenterCoordinatesAndSizesLayer(x){let vec=unstack(transpose(x,[1,0])),sizes=[sub(vec[2],vec[0]),sub(vec[3],vec[1])],centers=[add2(vec[0],div(sizes[0],scalar(2))),add2(vec[1],div(sizes[1],scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=unstack(transpose(x1,[1,0])),div0_out=div(mul(exp(div(vec[2],scalar(5))),sizes[0]),scalar(2)),add0_out=add2(mul(div(vec[0],scalar(10)),sizes[0]),centers[0]),div1_out=div(mul(exp(div(vec[3],scalar(5))),sizes[1]),scalar(2)),add1_out=add2(mul(div(vec[1],scalar(10)),sizes[1]),centers[1]);return transpose(stack([sub(add0_out,div0_out),sub(add1_out,div1_out),add2(add0_out,div0_out),add2(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(reshape(tile(params.extra_dim,[batchSize,1,1]),[-1,4]),reshape(boxPredictions,[-1,4]));boxes=reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=sigmoid(slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=unstack(boxes),scoresByBatch=unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}function boxPredictionLayer(x,params){return tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input2){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(512,!1),"float32"),x=sub(mul(batchTensor,scalar(.007843137718737125)),scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async locateFaces(input2,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input2),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression4(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME2="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",isNumber3=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber3(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber3(a.x)&&isNumber3(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber3)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}function leaky(x){return tidy(()=>{let min9=mul(x,scalar(.10000000149011612));return add2(relu(sub(x,min9)),min9)})}function convWithBatchNorm(x,params){return tidy(()=>{let out=pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=conv2d(out,params.conv.filters,[1,1],"valid"),out=sub(out,params.bn.sub),out=mul(out,params.bn.truediv),out=add2(out,params.conv.bias),leaky(out)})}function depthwiseSeparableConv3(x,params){return tidy(()=>{let out=pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=add2(out,params.bias),leaky(out)})}function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub30=tensor1d(extractWeights(size)),truediv=tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub30,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub30=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub30,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input2,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input2,inputSize){return await this.forwardInput(await toNetInput(input2),inputSize)}async detect(input2,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input2),out=await this.forwardInput(netInput,inputSize),out0=tidy(()=>unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression2(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid2(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid2(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max11,curr)=>max11.classScore>curr.classScore?max11:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input2,forwardParams){let objectDetections=await this.detect(input2,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME2}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function extractAllFacesAndComputeResults(parentResults,input2,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input2 instanceof Tensor?await extractFaceTensors(input2,faceBoxes):await extractFaces(input2,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input2,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input2,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input2,forwardParams){let objectDetections=await this.detect(input2,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input2,options)=>nets.ssdMobilenetv1.locateFaces(input2,options),tinyFaceDetector=(input2,options)=>nets.tinyFaceDetector.locateFaces(input2,options),tinyYolov23=(input2,options)=>nets.tinyYolov2.locateFaces(input2,options),detectFaceLandmarks=input2=>nets.faceLandmark68Net.detectLandmarks(input2),detectFaceLandmarksTiny=input2=>nets.faceLandmark68TinyNet.detectLandmarks(input2),computeFaceDescriptor=input2=>nets.faceRecognitionNet.computeFaceDescriptor(input2),recognizeFaceExpressions=input2=>nets.faceExpressionNet.predictExpressions(input2),predictAgeAndGender=input2=>nets.ageGenderNet.predictAgeAndGender(input2),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input2,extractedFaces){super();this.parentTask=parentTask;this.input=input2;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input2,extractedFaces){super();this.parentTask=parentTask;this.input=input2;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input2){super();this.parentTask=parentTask;this.input=input2}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input2,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input2;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input2,options=new SsdMobilenetv1Options){super();this.input=input2;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input:input2,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input3=>nets.tinyFaceDetector.locateFaces(input3,options):options instanceof SsdMobilenetv1Options?input3=>nets.ssdMobilenetv1.locateFaces(input3,options):options instanceof TinyYolov2Options?input3=>nets.tinyYolov2.locateFaces(input3,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input2)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input2,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input2,options)}function detectAllFaces(input2,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input2,options)}async function allFacesSsdMobilenetv1(input2,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input2,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input2,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input2,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count2=1,createUniqueLabel=()=>`person ${count2++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json18){let labeledDescriptors=json18.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json18.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version3="0.8.9",node=typeof process!="undefined",browser=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version4={faceapi:version3,node,browser};return src_exports;})(); + rank ${$x.rank}.`),assert3(isInt2(depthRadius),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${depthRadius}.`);let x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]]));let forward=(backend3,save)=>{let y=backend3.localResponseNormalization4D(x4D,depthRadius,bias,alpha,beta);return save([x4D,y]),y},inputs={x:x4D},attrs={depthRadius,bias,alpha,beta},res=ENGINE2.runKernelFunc(forward,inputs,null,LRN2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var localResponseNormalization2=op2({localResponseNormalization_:localResponseNormalization_2});function log_2(x){let $x=convertToTensor2(x,"x","log"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.log($x);return save([$x]),res},inputs,null,Log2)}var log2=op2({log_:log_2});function log1p_2(x){let $x=convertToTensor2(x,"x","log1p"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.log1p($x);return save([$x]),res},inputs,null,Log1p2)}var log1p2=op2({log1p_:log1p_2});function customGrad2(f){return ENGINE2.customGrad(f)}function neg_2(x){let $x=convertToTensor2(x,"x","neg"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.neg($x),inputs,null,Negate2)}var neg2=op2({neg_:neg_2});function softplus_2(x){let $x=convertToTensor2(x,"x","softplus"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.softplus($x);return save([$x]),res},inputs,null,Softplus3)}var softplus2=op2({softplus_:softplus_2});function logSigmoid_2(x){let $x=convertToTensor2(x,"x","logSigmoid"),customOp=customGrad2(x2=>{let value=neg2(softplus2(neg2(x2))),gradFunc=dy=>{let derX=mul2(dy,sigmoid3(neg2(x2)));return derX};return{value,gradFunc}});return customOp($x)}var logSigmoid2=op2({logSigmoid_:logSigmoid_2});function max_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","max"),forward=(backend3,save)=>{let origAxes=parseAxisParam2(axis,$x.shape),axes=origAxes,permutedAxes=getAxesPermutation2(axes,$x.rank),maxInput=$x;permutedAxes!=null&&(maxInput=transpose2($x,permutedAxes),axes=getInnerMostAxes2(axes.length,maxInput.rank));let y=backend3.max(maxInput,axes);permutedAxes!=null&&maxInput.dispose();let res=y;if(keepDims){let expandedShape=expandShapeToKeepDim2(res.shape,parseAxisParam2(axis,$x.shape));res=reshape2(res,expandedShape),y.dispose()}return save([$x,res]),res},inputs={x:$x},attrs={reductionIndices:axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Max2,attrs)}var max2=op2({max_:max_2});function sub_2(a,b){let $a=convertToTensor2(a,"a","sub"),$b=convertToTensor2(b,"b","sub");[$a,$b]=makeTypesMatch2($a,$b);let forward=(backend3,save)=>{let res=backend3.subtract($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Sub2)}var sub2=op2({sub_:sub_2});function sum_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","sum");$x.dtype==="bool"&&($x=cast2($x,"int32"));let forward=(backend3,save)=>{save([$x]);let axes=parseAxisParam2(axis,$x.shape),permutation=getAxesPermutation2(axes,$x.rank),reductionAxes=axes,permutedX=$x;permutation!=null&&(permutedX=transpose2($x,permutation),reductionAxes=getInnerMostAxes2(reductionAxes.length,$x.rank));let value=backend3.sum(permutedX,reductionAxes);if(keepDims){let newShape=expandShapeToKeepDim2(value.shape,axes);value=reshape2(value,newShape)}return value},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Sum2,attrs)}var sum3=op2({sum_:sum_2});function logSoftmax_2(logits,axis=-1){let $logits=convertToTensor2(logits,"logits","logSoftmax");if(axis===-1&&(axis=$logits.rank-1),axis!==$logits.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${$logits.rank} and axis was ${axis}`);let forward=(backend3,save)=>{let keepDims=!0,xMax=max2(logits,axis,!0),shifted=sub2(logits,xMax),value=sub2(cast2(shifted,"float32"),log2(sum3(exp2(shifted),axis,keepDims)));return save([value]),value},inputs={logits:$logits},attrs={axis};return ENGINE2.runKernelFunc(forward,inputs,null,LogSoftmax3,attrs)}var logSoftmax2=op2({logSoftmax_:logSoftmax_2});function logSumExp_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","logSumExp"),axes=parseAxisParam2(axis,$x.shape),xMax=max2($x,axes,!0),a=sub2($x,xMax),b=exp2(a),c=sum3(b,axes),d=log2(c),res=add4(reshape2(xMax,d.shape),d);if(keepDims){let newShape=expandShapeToKeepDim2(res.shape,axes);return reshape2(res,newShape)}return res}var logSumExp2=op2({logSumExp_:logSumExp_2});function logicalAnd_2(a,b){let $a=convertToTensor2(a,"a","logicalAnd","bool"),$b=convertToTensor2(b,"b","logicalAnd","bool");assertAndGetBroadcastShape2($a.shape,$b.shape);let inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(backend3=>backend3.logicalAnd($a,$b),inputs,null,LogicalAnd2)}var logicalAnd2=op2({logicalAnd_:logicalAnd_2});function logicalNot_2(x){let $x=convertToTensor2(x,"x","logicalNot","bool"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.logicalNot($x),inputs,null,LogicalNot2)}var logicalNot3=op2({logicalNot_:logicalNot_2});function logicalOr_2(a,b){let $a=convertToTensor2(a,"a","logicalOr","bool"),$b=convertToTensor2(b,"b","logicalOr","bool");assertAndGetBroadcastShape2($a.shape,$b.shape);let inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(backend3=>backend3.logicalOr($a,$b),inputs,null,LogicalOr2)}var logicalOr2=op2({logicalOr_:logicalOr_2});function logicalXor_2(a,b){let $a=convertToTensor2(a,"a","logicalXor","bool"),$b=convertToTensor2(b,"b","logicalXor","bool");return assertAndGetBroadcastShape2($a.shape,$b.shape),logicalAnd2(logicalOr2(a,b),logicalNot3(logicalAnd2(a,b)))}var logicalXor2=op2({logicalXor_:logicalXor_2});function maxPool_2(x,filterSize,strides,pad7,dimRoundingMode){let $x=convertToTensor2(x,"x","maxPool"),dilations=1,x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(x4D.rank===4,()=>`Error in maxPool: input must be rank 4 but got rank ${x4D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=(backend3,save)=>{let convInfo=computePool2DInfo2(x4D.shape,filterSize,strides,1,pad7,dimRoundingMode),y;return convInfo.filterWidth===1&&convInfo.filterHeight===1&&arraysEqual2(convInfo.inShape,convInfo.outShape)?y=x4D.clone():y=backend3.maxPool(x4D,convInfo),save([x4D,y]),y},inputs={x:x4D},attrs={filterSize,strides,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,MaxPool2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var maxPool5=op2({maxPool_:maxPool_2});function zeros2(shape,dtype="float32"){if(dtype==="complex64"){let real9=zeros2(shape,"float32"),imag9=zeros2(shape,"float32");return complex2(real9,imag9)}let values=makeZerosTypedArray2(sizeFromShape2(shape),dtype);return ENGINE2.makeTensor(values,shape,dtype)}function ones4(shape,dtype="float32"){if(dtype==="complex64"){let real9=ones4(shape,"float32"),imag9=zeros2(shape,"float32");return complex2(real9,imag9)}let values=makeOnesTypedArray2(sizeFromShape2(shape),dtype);return ENGINE2.makeTensor(values,shape,dtype)}function mean_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","mean"),axes=parseAxisParam2(axis,$x.shape),shapes=computeOutAndReduceShapes2($x.shape,axes),reduceShape=shapes[1],reduceSize=sizeFromShape2(reduceShape),inputs={x:$x},attrs={axis,keepDims},forward=()=>{let reduceSizeScalar=scalar2(reduceSize),xReduce=reduceSizeScalar.dtype===$x.dtype?$x:cast2($x,reduceSizeScalar.dtype),res=div2(xReduce,reduceSizeScalar);return sum3(res,axis,keepDims)},customOp=customGrad2(x2=>{let value=ENGINE2.runKernelFunc(forward,inputs,null,Mean2,attrs),gradFunc=dy=>{let expandedDyShape=x2.shape.slice();axes.forEach(axis2=>{expandedDyShape[axis2]=1});let expandedDy=reshape2(dy,expandedDyShape),derX=div2(mul2(expandedDy,ones4(x2.shape,"float32")),reduceSize);return derX};return{value,gradFunc}});return customOp($x)}var mean2=op2({mean_:mean_2});function min_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","min"),forward=(backend3,save)=>{let origAxes=parseAxisParam2(axis,$x.shape),axes=origAxes,permutedAxes=getAxesPermutation2(axes,$x.rank),minInput=$x;permutedAxes!=null&&(minInput=transpose2($x,permutedAxes),axes=getInnerMostAxes2(axes.length,$x.rank));let y=backend3.min(minInput,axes);permutedAxes!=null&&minInput.dispose();let res=y;if(keepDims){let expandedShape=expandShapeToKeepDim2(res.shape,origAxes);res=reshape2(y,expandedShape),y.dispose()}return save([$x,res]),res},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Min2,attrs)}var min2=op2({min_:min_2});function minimum_2(a,b){let $a=convertToTensor2(a,"a","minimum"),$b=convertToTensor2(b,"b","minimum");[$a,$b]=makeTypesMatch2($a,$b),$a.dtype==="bool"&&($a=cast2($a,"int32"),$b=cast2($b,"int32")),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.minimum($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Minimum3)}var minimum2=op2({minimum_:minimum_2});function mirrorPad_2(x,paddings,mode){assert3(mode==="reflect"||mode==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${mode}.`);let $x=convertToTensor2(x,"x","mirrorPad");if($x.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");assert3(paddings.length===$x.rank,()=>`Padding doesn't match input. Must be ${$x.rank}. Got ${paddings.length}.`);let shapeOffset=mode==="reflect"?1:0;for(let i=0;i<$x.rank;i++)assert3(paddings[i].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),assert3(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}`);let attrs={paddings,mode},inputs={x:$x};return ENGINE2.runKernel(MirrorPad2,inputs,attrs)}var mirrorPad3=op2({mirrorPad_:mirrorPad_2});function mod_2(a,b){let $a=convertToTensor2(a,"a","mod"),$b=convertToTensor2(b,"b","mod");[$a,$b]=makeTypesMatch2($a,$b);let forward=(backend3,save)=>{let res=backend3.mod($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,Mod2)}var mod2=op2({mod_:mod_2});function square_2(x){let $x=convertToTensor2(x,"x","square"),attrs={},inputsToSave=[$x],outputsToSave=[];return ENGINE2.runKernelFunc((backend3,save)=>(save([$x]),backend3.square($x)),{x:$x},null,"Square",attrs,inputsToSave,outputsToSave)}var square2=op2({square_:square_2});function notEqual_2(a,b){let $a=convertToTensor2(a,"a","notEqual"),$b=convertToTensor2(b,"b","notEqual");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=backend3=>backend3.notEqual($a,$b),inputs={a:$a,b:$b};return ENGINE2.runKernelFunc(forward,inputs,null,NotEqual2)}var notEqual4=op2({notEqual_:notEqual_2});function real_2(input2){let $input=convertToTensor2(input2,"input","real"),forward=backend3=>backend3.real($input),inputs={input:$input};return ENGINE2.runKernelFunc(forward,inputs,null,Real2)}var real2=op2({real_:real_2});function onesLike_2(x){let $x=convertToTensor2(x,"x","onesLike"),forward=(backend3,save)=>{if($x.dtype==="complex64"){let r=onesLike3(real2($x)),i=zerosLike3(imag2($x));return complex2(r,i)}return backend3.onesLike($x)},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,OnesLike2)}var onesLike3=op2({onesLike_:onesLike_2});function pad_2(x,paddings,constantValue=0){let $x=convertToTensor2(x,"x","pad");if($x.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let forward=(backend3,save)=>(save([$x]),backend3.pad($x,paddings,constantValue)),attrs={paddings,constantValue},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,PadV22,attrs)}var pad2=op2({pad_:pad_2});function spaceToBatchND_2(x,blockShape,paddings){let $x=convertToTensor2(x,"x","spaceToBatchND");assert3($x.rank>=1+blockShape.length,()=>`input rank ${$x.rank} should be > than [blockShape] ${blockShape.length}`),assert3(paddings.length===blockShape.length,()=>`paddings.shape[0] ${paddings.length} must be equal to [blockShape] ${blockShape.length}`),assert3($x.shape.reduce((a,b,i)=>i>0&&i<=blockShape.length?a&&(b+paddings[i-1][0]+paddings[i-1][1])%blockShape[i-1]===0:a,!0),()=>`input spatial dimensions ${$x.shape.slice(1)} with paddings ${paddings.toString()} must be divisible by blockShapes ${blockShape.toString()}`);let forward=backend3=>backend3.spaceToBatchND($x,blockShape,paddings),inputs={x:$x},attrs={blockShape,paddings};return ENGINE2.runKernelFunc(forward,inputs,null,SpaceToBatchND2,attrs)}var spaceToBatchND3=op2({spaceToBatchND_:spaceToBatchND_2});function pool_2(input2,windowShape,poolingType,pad7,dilations,strides){dilations==null&&(dilations=[1,1]),strides==null&&(strides=1),pad7===0&&(pad7="valid");let $x=convertToTensor2(input2,"x","maxPool"),x4D=$x,reshapedTo4D=!1;$x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`);let convInfo=computePool2DInfo2(x4D.shape,windowShape,strides,dilations,pad7),dilation=[convInfo.dilationHeight,convInfo.dilationWidth],basePadding;pad7==="same"?basePadding=withSpaceToBatchBasePaddings2([convInfo.filterHeight,convInfo.filterWidth],dilation):basePadding=[[0,0],[0,0]];let isDilationOne=dilation[0]===1&&dilation[1]===1,[adjustedPadding,adjustedCrops]=requiredSpaceToBatchPaddings2([convInfo.inHeight,convInfo.inWidth],dilation,basePadding),convertedPad=isDilationOne?pad7:"valid",convertedX=isDilationOne?x4D:spaceToBatchND3(x4D,dilation,adjustedPadding),forwardOp=poolingType==="avg"?()=>avgPool5(convertedX,windowShape,strides,convertedPad):()=>maxPool5(convertedX,windowShape,strides,convertedPad),y=forwardOp(),res=isDilationOne?y:batchToSpaceND2(y,dilation,adjustedCrops);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}function requiredSpaceToBatchPaddings2(inputShape,blockShape,basePadding){let padStart=basePadding.map(b=>b[0]),origPadEnd=basePadding.map(b=>b[1]),fullInputShape=inputShape.concat(padStart,origPadEnd),padEndExtra=blockShape.map((b,i)=>(b-fullInputShape[i]%b)%b),padEnd=origPadEnd.map((s,i)=>s+padEndExtra[i]),paddings=blockShape.map((_,i)=>[padStart[i],padEnd[i]]),crops=blockShape.map((_,i)=>[0,padEndExtra[i]]);return[paddings,crops]}function withSpaceToBatchBasePaddings2(filterShape,dilation){let dilatedFilterShape=filterShape.map((s,i)=>s+(s-1)*(dilation[i]-1)),padExtraShape=dilatedFilterShape.map(s=>s-1),padExtraStart=padExtraShape.map(s=>Math.floor(s/2)),padExtraEnd=padExtraShape.map((s,i)=>s-padExtraStart[i]);return padExtraShape.map((_,i)=>[padExtraStart[i],padExtraEnd[i]])}var pool2=op2({pool_:pool_2});function pow_2(base2,exp14){let $base=convertToTensor2(base2,"base","pow"),$exp=convertToTensor2(exp14,"exp","pow");[$base,$exp]=makeTypesMatch2($base,$exp);let inputs={a:$base,b:$exp},forward=(backend3,save)=>{let y=backend3.pow($base,$exp);return save([$base,$exp,y]),y};return ENGINE2.runKernelFunc(forward,inputs,null,Pow2)}var pow2=op2({pow_:pow_2});function prelu_2(x,alpha){let $x=convertToTensor2(x,"x","prelu"),$alpha=convertToTensor2(alpha,"alpha","prelu"),forward=(backend3,save)=>{let res=backend3.prelu($x,$alpha);return save([$x,$alpha]),res},inputs={x:$x,alpha:$alpha};return ENGINE2.runKernelFunc(forward,inputs,null,Prelu2)}var prelu2=op2({prelu_:prelu_2});function prod_2(x,axis=null,keepDims=!1){let $x=convertToTensor2(x,"x","prod");$x.dtype==="bool"&&($x=cast2($x,"int32"));let forward=backend3=>{let axes=parseAxisParam2(axis,$x.shape),permutation=getAxesPermutation2(axes,$x.rank),reductionAxes=axes,permutedX=$x;permutation!=null&&(permutedX=transpose2($x,permutation),reductionAxes=getInnerMostAxes2(reductionAxes.length,$x.rank));let value=backend3.prod(permutedX,reductionAxes);if(keepDims){let newShape=expandShapeToKeepDim2(value.shape,axes);value=reshape2(value,newShape)}return value},inputs={x:$x},attrs={axis,keepDims};return ENGINE2.runKernelFunc(forward,inputs,null,Prod2,attrs)}var prod2=op2({prod_:prod_2});function tensor1d2(values,dtype){assertNonNull2(values);let inferredShape=inferShape2(values,dtype);if(inferredShape.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");let shape=null;return makeTensor2(values,shape,inferredShape,dtype)}function range3(start,stop,step9=1,dtype="float32"){if(step9===0)throw new Error("Cannot have a step of zero");let forward=()=>{let sameStartStop=start===stop,increasingRangeNegativeStep=start1;if(sameStartStop||increasingRangeNegativeStep||decreasingRangePositiveStep)return zeros2([0],dtype);let numElements=Math.abs(Math.ceil((stop-start)/step9)),values=makeZerosTypedArray2(numElements,dtype);stop{let res=backend3.reciprocal($x);return save([$x]),res},inputs,null,Reciprocal2)}var reciprocal2=op2({reciprocal_:reciprocal_2});function relu_2(x){let $x=convertToTensor2(x,"x","relu"),forward=(backend3,save)=>(save([$x]),$x.dtype==="bool"?cast2($x,"int32"):backend3.relu($x)),inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Relu3)}var relu2=op2({relu_:relu_2});function relu6_2(x){let $x=convertToTensor2(x,"x","relu6"),forward=(backend3,save)=>(save([$x]),$x.dtype==="bool"?cast2($x,"int32"):backend3.relu6($x)),inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Relu63)}var relu62=op2({relu6_:relu6_2});function reverse_2(x,axis){let $x=convertToTensor2(x,"x","reverse"),forward=backend3=>{let axes=parseAxisParam2(axis,$x.shape);if($x.rank===0)return clone2($x);let res=backend3.reverse($x,axes);return reshape2(res,$x.shape)},inputs={x:$x},attrs={dims:axis};return ENGINE2.runKernelFunc(forward,inputs,null,Reverse2,attrs)}var reverse2=op2({reverse_:reverse_2});function round_2(x){let $x=convertToTensor2(x,"x","round"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.round($x),inputs,null,Round2)}var round3=op2({round_:round_2});function rsqrt_2(x){let $x=convertToTensor2(x,"x","rsqrt"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.rsqrt($x);return save([$x]),res},inputs,null,Rsqrt2)}var rsqrt2=op2({rsqrt_:rsqrt_2});function selu_2(x){let $x=convertToTensor2(x,"x","selu"),forward=(backend3,save)=>{let res=backend3.selu($x);return save([$x]),res},inputs={x:$x};return ENGINE2.runKernelFunc(forward,inputs,null,Selu3)}var selu2=op2({selu_:selu_2});function separableConv2d_2(x,depthwiseFilter,pointwiseFilter,strides,pad7,dilation=[1,1],dataFormat="NHWC"){let $x=convertToTensor2(x,"x","separableConv2d"),$depthwiseFilter=convertToTensor2(depthwiseFilter,"depthwiseFilter","separableConv2d"),$pointwiseFilter=convertToTensor2(pointwiseFilter,"pointwiseFilter","separableConv2d"),x4D=$x,reshapedTo4D=!1;if($x.rank===3&&(reshapedTo4D=!0,x4D=reshape2($x,[1,$x.shape[0],$x.shape[1],$x.shape[2]])),dataFormat==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");assert3(x4D.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${x4D.rank}.`),assert3($depthwiseFilter.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${$depthwiseFilter.rank}.`),assert3($pointwiseFilter.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${$depthwiseFilter.rank}.`),assert3($pointwiseFilter.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${$pointwiseFilter.shape[0]}.`),assert3($pointwiseFilter.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${$pointwiseFilter.shape[1]}.`);let inChannels=$depthwiseFilter.shape[2],channelMultiplier=$depthwiseFilter.shape[3];assert3($pointwiseFilter.shape[2]===inChannels*channelMultiplier,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${inChannels*channelMultiplier}, but got ${$pointwiseFilter.shape[2]}.`);let depthwise=depthwiseConv2d6(x4D,$depthwiseFilter,strides,pad7,dataFormat,dilation),pointwiseStride=1,res=conv2d2(depthwise,$pointwiseFilter,pointwiseStride,"valid",dataFormat);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var separableConv2d3=op2({separableConv2d_:separableConv2d_2});function sign_2(x){let $x=convertToTensor2(x,"x","sign"),inputs={x:$x};return ENGINE2.runKernelFunc(backend3=>backend3.sign($x),inputs,null,Sign2)}var sign2=op2({sign_:sign_2});function sin_2(x){let $x=convertToTensor2(x,"x","sin"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sin($x);return save([$x]),res},inputs,null,Sin2)}var sin2=op2({sin_:sin_2});function sinh_2(x){let $x=convertToTensor2(x,"x","sinh"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sinh($x);return save([$x]),res},inputs,null,Sinh2)}var sinh2=op2({sinh_:sinh_2});function softmax_2(logits,dim=-1){let $logits=convertToTensor2(logits,"logits","softmax","float32");if(dim===-1&&(dim=$logits.rank-1),dim!==$logits.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${$logits.rank} and dim was ${dim}`);let inputs={logits:$logits},attrs={dim};return ENGINE2.runKernelFunc((backend3,save)=>{let y=backend3.softmax($logits,dim);return save([y]),y},inputs,null,Softmax4,attrs)}var softmax2=op2({softmax_:softmax_2});function fft_2(input2){assert3(input2.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${input2.dtype}.`);let inputs={input:input2};return ENGINE2.runKernelFunc(backend3=>{let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,input2D=input2.as2D(batch,innerDimensionSize),result=backend3.fft(input2D);return result.reshape(input2.shape)},inputs,null,FFT2)}var fft2=op2({fft_:fft_2});function ifft_2(input2){assert3(input2.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${input2.dtype}.`);let inputs={input:input2};return ENGINE2.runKernelFunc(backend3=>{let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,input2D=reshape2(input2,[batch,innerDimensionSize]),result=backend3.ifft(input2D);return reshape2(result,input2.shape)},inputs,null,IFFT2)}var ifft2=op2({ifft_:ifft_2});function irfft_2(input2){let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,ret;if(innerDimensionSize<=2){let complexInput=reshape2(input2,[batch,innerDimensionSize]);ret=ifft2(complexInput)}else{let outputShape=[batch,2*(innerDimensionSize-1)],realInput=reshape2(real2(input2),[batch,innerDimensionSize]),imagInput=reshape2(imag2(input2),[batch,innerDimensionSize]),realConjugate=reverse2(slice2(realInput,[0,1],[batch,innerDimensionSize-2]),1),imagConjugate=mul2(reverse2(slice2(imagInput,[0,1],[batch,innerDimensionSize-2]),1),scalar2(-1)),r=concat2([realInput,realConjugate],1),i=concat2([imagInput,imagConjugate],1),complexInput=reshape2(complex2(r,i),[outputShape[0],outputShape[1]]);ret=ifft2(complexInput)}if(ret=real2(ret),input2.rank===3&&input2.shape[0]!==0){let temp=ret,batch2=input2.shape[0];ret=reshape2(ret,[batch2,ret.shape[0]/batch2,ret.shape[1]]),temp.dispose()}return ret}var irfft2=op2({irfft_:irfft_2});function prepareSplitSize2(x,numOrSizeSplits,axis=0){let splitSizes=[];if(typeof numOrSizeSplits=="number")assert3(x.shape[axis]%numOrSizeSplits===0,()=>"Number of splits must evenly divide the axis."),splitSizes=new Array(numOrSizeSplits).fill(x.shape[axis]/numOrSizeSplits);else{let numOfNegs=numOrSizeSplits.reduce((count2,value)=>(value===-1&&(count2+=1),count2),0);assert3(numOfNegs<=1,()=>"There should be only one negative value in split array.");let negIndex=numOrSizeSplits.indexOf(-1);if(negIndex!==-1){let total=numOrSizeSplits.reduce((a,b)=>b>0?a+b:a);numOrSizeSplits[negIndex]=x.shape[axis]-total}assert3(x.shape[axis]===numOrSizeSplits.reduce((a,b)=>a+b),()=>"The sum of sizes must match the size of the axis dimension."),splitSizes=numOrSizeSplits}return splitSizes}function split_2(x,numOrSizeSplits,axis=0){let $x=convertToTensor2(x,"x","split"),forward=(backend3,_)=>{let $axis=parseAxisParam2(axis,$x.shape)[0],splitSizes=prepareSplitSize2($x,numOrSizeSplits,$axis);return backend3.split($x,splitSizes,$axis)},inputs={x:$x},attr={numOrSizeSplits,axis};return ENGINE2.runKernelFunc(forward,inputs,null,SplitV2,attr)}var split2=op2({split_:split_2});function rfft_2(input2,fftLength){assert3(input2.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${input2.dtype}`);let innerDimensionSize=input2.shape[input2.shape.length-1],batch=input2.size/innerDimensionSize,adjustedInput;if(fftLength!=null&&fftLength0),size=input2.shape.map(v=>v);size[input2.shape.length-1]=fftLength,adjustedInput=slice2(input2,begin,size),innerDimensionSize=fftLength}else if(fftLength!=null&&fftLength>innerDimensionSize){let zerosShape=input2.shape.map(v=>v);zerosShape[input2.shape.length-1]=fftLength-innerDimensionSize,adjustedInput=concat2([input2,zeros2(zerosShape)],input2.shape.length-1),innerDimensionSize=fftLength}else adjustedInput=input2;let zerosInput=zerosLike3(adjustedInput),complexInput=reshape2(complex2(adjustedInput,zerosInput),[batch,innerDimensionSize]),ret=fft2(complexInput),half=Math.floor(innerDimensionSize/2)+1,realValues=real2(ret),imagValues=imag2(ret),realComplexConjugate=split2(realValues,[half,innerDimensionSize-half],realValues.shape.length-1),imagComplexConjugate=split2(imagValues,[half,innerDimensionSize-half],imagValues.shape.length-1),outputShape=adjustedInput.shape.slice();return outputShape[adjustedInput.shape.length-1]=half,reshape2(complex2(realComplexConjugate[0],imagComplexConjugate[0]),outputShape)}var rfft2=op2({rfft_:rfft_2});function sqrt_2(x){let $x=convertToTensor2(x,"x","sqrt"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.sqrt($x);return save([$x]),res},inputs,null,Sqrt2)}var sqrt2=op2({sqrt_:sqrt_2});function squaredDifference_2(a,b){let $a=convertToTensor2(a,"a","squaredDifference"),$b=convertToTensor2(b,"b","squaredDifference");[$a,$b]=makeTypesMatch2($a,$b),assertAndGetBroadcastShape2($a.shape,$b.shape);let forward=(backend3,save)=>{let res=backend3.squaredDifference($a,$b);return save([$a,$b]),res},inputs={a:$a,b:$b},attrs={};return ENGINE2.runKernelFunc(forward,inputs,null,SquaredDifference2,attrs)}var squaredDifference4=op2({squaredDifference_:squaredDifference_2});function squeeze_2(x,axis){let $x=convertToTensor2(x,"x","squeeze");return reshape2($x,squeezeShape2($x.shape,axis).newShape)}var squeeze2=op2({squeeze_:squeeze_2});function stack_2(tensors,axis=0){let $tensors=convertToTensorArray2(tensors,"tensors","stack");if(assert3($tensors.length>=1,()=>"Pass at least one tensor to tf.stack"),$tensors.length===1)return expandDims3($tensors[0],axis);let rank=$tensors[0].rank,shape=$tensors[0].shape,dtype=$tensors[0].dtype;assert3(axis<=rank,()=>"Axis must be <= rank of the tensor"),$tensors.forEach(t=>{assertShapesMatch2(shape,t.shape,"All tensors passed to stack must have matching shapes"),assert3(dtype===t.dtype,()=>"All tensors passed to stack must have matching dtypes")});let expandedTensors=$tensors.map(t=>expandDims3(t,axis));return concat2(expandedTensors,axis)}var stack2=op2({stack_:stack_2});function step_2(x,alpha=0){let $x=convertToTensor2(x,"x","step"),inputs={x:$x},attrs={alpha};return ENGINE2.runKernelFunc(backend3=>backend3.step($x,alpha),inputs,null,Step2,attrs)}var step2=op2({step_:step_2});function stridedSlice_2(x,begin,end,strides,beginMask=0,endMask=0,ellipsisMask=0,newAxisMask=0,shrinkAxisMask=0){let $x=convertToTensor2(x,"x","stridedSlice"),forward=backend3=>{strides==null&&(strides=new Array(begin.length));let ellipsisAxes=maskToAxes2(ellipsisMask);if(ellipsisAxes.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(ellipsisMask!==0&&newAxisMask!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(ellipsisMask!==0&&shrinkAxisMask!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let numInterpolatedAxes=$x.rank-begin.length,expandAxes=maskToAxes2(newAxisMask),newShape=$x.shape.slice();expandAxes.forEach(axis=>{begin[axis]=0,end[axis]=1,newShape.splice(axis,0,1)}),$x=reshape2($x,newShape);let{begin:normalizedBegin,end:normalizedEnd,strides:normalizedStrides}=getNormalizedAxes2($x.shape,ellipsisAxes,numInterpolatedAxes,begin,end,strides,beginMask,endMask,ellipsisMask);begin=normalizedBegin,end=normalizedEnd,strides=normalizedStrides;let shrinkAxes=maskToAxes2(shrinkAxisMask);shrinkAxes.forEach(axis=>{end[axis]=begin[axis]+1,strides[axis]=1});let size=computeOutShape5(begin,end,strides),outShape=size.filter((_,axis)=>shrinkAxes.indexOf(axis)===-1),nonStrided=strides.every(v=>v===1);if(nonStrided)return reshape2(slice2($x,begin,size),outShape);let res=backend3.stridedSlice($x,begin,end,strides);return reshape2(res,outShape)},inputs={x:$x},attrs={begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask};return ENGINE2.runKernelFunc(forward,inputs,null,StridedSlice2,attrs)}var stridedSlice3=op2({stridedSlice_:stridedSlice_2});function tan_2(x){let $x=convertToTensor2(x,"x","tan"),inputs={x:$x};return ENGINE2.runKernelFunc((backend3,save)=>{let res=backend3.tan($x);return save([$x]),res},inputs,null,Tan2)}var tan2=op2({tan_:tan_2});function tensor2d2(values,shape,dtype){if(assertNonNull2(values),shape!=null&&shape.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let inferredShape=inferShape2(values,dtype);if(inferredShape.length!==2&&inferredShape.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(inferredShape.length===1&&shape==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return makeTensor2(values,shape,inferredShape,dtype)}function topk_2(x,k=1,sorted=!0){let $x=convertToTensor2(x,"x","topk");if($x.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let lastDim=$x.shape[$x.shape.length-1];if(k>lastDim)throw new Error(`'k' passed to topk() must be <= the last dimension (${lastDim}) but got ${k}`);let inputs={x:$x},attrs={k,sorted},[values,indices]=ENGINE2.runKernelFunc(b=>b.topk($x,k,sorted),inputs,null,TopK2,attrs);return{values,indices}}var topk2=op2({topk_:topk_2});function unique_2(x,axis=0){let $x=convertToTensor2(x,"x","unique",null);assert3($x.rank>0,()=>"The input tensor must be at least 1D");let inputs={x:$x},attrs={axis},[values,indices]=ENGINE2.runKernel(Unique2,inputs,attrs);return{values,indices}}var unique2=op2({unique_:unique_2});function unsortedSegmentSum_2(x,segmentIds,numSegments){let $x=convertToTensor2(x,"x","unsortedSegmentSum"),$segmentIds=convertToTensor2(segmentIds,"segmentIds","unsortedSegmentSum","int32");assert3(isInt2(numSegments),()=>"numSegments must be of dtype int");let inputs={x:$x,segmentIds:$segmentIds},attrs={numSegments},forward=(backend3,save)=>{let res=backend3.unsortedSegmentSum($x,$segmentIds,numSegments);return save([$segmentIds]),res};return ENGINE2.runKernelFunc(forward,inputs,null,UnsortedSegmentSum2,attrs)}var unsortedSegmentSum2=op2({unsortedSegmentSum_:unsortedSegmentSum_2});function unstack_2(x,axis=0){let $x=convertToTensor2(x,"x","unstack");assert3(axis>=-$x.shape.length&&axis<$x.shape.length,()=>`Axis = ${axis} is not in [-${$x.shape.length}, ${$x.shape.length})`),axis<0&&(axis+=$x.shape.length);let inputs={value:$x},attrs={axis},forward=backend3=>backend3.unstack($x,axis);return ENGINE2.runKernelFunc(forward,inputs,null,Unpack2,attrs)}var unstack2=op2({unstack_:unstack_2});function notEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","notEqualStrict"),$b=convertToTensor2(b,"b","notEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in notEqualStrict: "),notEqual4($a,$b)}function lessStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","lessStrict"),$b=convertToTensor2(b,"b","lessStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in lessStrict: "),less2($a,$b)}function equalStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","equalStrict"),$b=convertToTensor2(b,"b","equalStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in equalStrict: "),equal2($a,$b)}function lessEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","lessEqualStrict"),$b=convertToTensor2(b,"b","lessEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in lessEqualStrict: "),lessEqual2($a,$b)}function greaterStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","greaterStrict"),$b=convertToTensor2(b,"b","greaterStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in greaterStrict: "),greater2($a,$b)}function greaterEqualStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","greaterEqualStrict"),$b=convertToTensor2(b,"b","greaterEqualStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in greaterEqualStrict: "),greaterEqual2($a,$b)}var equalStrict2=op2({equalStrict_:equalStrict_2}),greaterEqualStrict2=op2({greaterEqualStrict_:greaterEqualStrict_2}),greaterStrict2=op2({greaterStrict_:greaterStrict_2}),lessEqualStrict2=op2({lessEqualStrict_:lessEqualStrict_2}),lessStrict2=op2({lessStrict_:lessStrict_2}),notEqualStrict2=op2({notEqualStrict_:notEqualStrict_2});function addStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","addStrict"),$b=convertToTensor2(b,"b","addStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in addStrict: "),add4($a,$b)}function subStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","subStrict"),$b=convertToTensor2(b,"b","subStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in subStrict: "),sub2($a,$b)}function powStrict_2(base2,exp14){return deprecationWarn2("strict variants of ops have been deprecated and will be removed in future"),assertShapesMatch2(base2.shape,exp14.shape,"Error in powStrict: "),pow2(base2,exp14)}function mulStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","mul"),$b=convertToTensor2(b,"b","mul");return assertShapesMatch2($a.shape,$b.shape,"Error in multiplyStrict: "),mul2($a,$b)}function divStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","div"),$b=convertToTensor2(b,"b","div");return assertShapesMatch2($a.shape,$b.shape,"Error in divideStrict: "),div2($a,$b)}function modStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","modStrict"),$b=convertToTensor2(b,"b","modStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in modStrict: "),mod2($a,$b)}function minimumStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","minimumStrict"),$b=convertToTensor2(b,"b","minimumStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in minimumStrict: "),minimum2($a,$b)}function maximumStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","maximumStrict"),$b=convertToTensor2(b,"b","maximumStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in maximumStrict: "),maximum2($a,$b)}function squaredDifferenceStrict_2(a,b){deprecationWarn2("strict variants of ops have been deprecated and will be removed in future");let $a=convertToTensor2(a,"a","squaredDifferenceStrict"),$b=convertToTensor2(b,"b","squaredDifferenceStrict");return assertShapesMatch2($a.shape,$b.shape,"Error in squaredDifferenceStrict: "),squaredDifference4($a,$b)}var addStrict2=op2({addStrict_:addStrict_2}),divStrict2=op2({divStrict_:divStrict_2}),maximumStrict2=op2({maximumStrict_:maximumStrict_2}),minimumStrict2=op2({minimumStrict_:minimumStrict_2}),modStrict2=op2({modStrict_:modStrict_2}),mulStrict2=op2({mulStrict_:mulStrict_2}),powStrict2=op2({powStrict_:powStrict_2}),squaredDifferenceStrict2=op2({squaredDifferenceStrict_:squaredDifferenceStrict_2}),subStrict2=op2({subStrict_:subStrict_2});function norm_2(x,ord="euclidean",axis=null,keepDims=!1){x=convertToTensor2(x,"x","norm");let norm6=normImpl2(x,ord,axis),keepDimsShape=norm6.shape;if(keepDims){let axes=parseAxisParam2(axis,x.shape);keepDimsShape=expandShapeToKeepDim2(norm6.shape,axes)}return reshape2(norm6,keepDimsShape)}function normImpl2(x,p2,axis=null){if(x.rank===0)return abs2(x);if(x.rank!==1&&axis===null)return normImpl2(reshape2(x,[-1]),p2,axis);if(x.rank===1||typeof axis=="number"||Array.isArray(axis)&&axis.length===1){if(p2===1)return sum3(abs2(x),axis);if(p2===Infinity)return max2(abs2(x),axis);if(p2===-Infinity)return min2(abs2(x),axis);if(p2==="euclidean"||p2===2)return sqrt2(sum3(pow2(abs2(x),scalar2(2,"int32")),axis));throw new Error(`Error in norm: invalid ord value: ${p2}`)}if(Array.isArray(axis)&&axis.length===2){if(p2===1)return max2(sum3(abs2(x),axis[0]),axis[1]-1);if(p2===Infinity)return max2(sum3(abs2(x),axis[1]),axis[0]);if(p2===-Infinity)return min2(sum3(abs2(x),axis[1]),axis[0]);if(p2==="fro"||p2==="euclidean")return sqrt2(sum3(square2(x),axis));throw new Error(`Error in norm: invalid ord value: ${p2}`)}throw new Error(`Error in norm: invalid axis: ${axis}`)}var norm2=op2({norm_:norm_2});function enclosingPowerOfTwo2(value){return Math.floor(Math.pow(2,Math.ceil(Math.log(value)/Math.log(2))))}function cosineWindow2(windowLength,a,b){let even=1-windowLength%2,newValues=new Float32Array(windowLength);for(let i=0;i`Error in conv2dDerFilter: input must be rank 4, but got shape ${x4D.shape}.`),assert3(dy4D.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${dy4D.shape}.`),assert3(filterShape.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${filterShape}.`);let inDepth=dataFormat==="NHWC"?x4D.shape[3]:x4D.shape[1],outDepth=dataFormat==="NHWC"?dy4D.shape[3]:dy4D.shape[1];assert3(inDepth===filterShape[2],()=>`Error in conv2dDerFilter: depth of input ${inDepth}) must match input depth in filter (${filterShape[2]}.`),assert3(outDepth===filterShape[3],()=>`Error in conv2dDerFilter: depth of dy (${outDepth}) must match output depth for filter (${filterShape[3]}).`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let dilations=1,$dataFormat=convertConv2DDataFormat2(dataFormat),convInfo=computeConv2DInfo2(x4D.shape,filterShape,strides,dilations,pad7,dimRoundingMode,!1,$dataFormat);return backend3.conv2dDerFilter(x4D,dy4D,convInfo)},inputs={x:x4D,dy:dy4D},attrs={strides,pad:pad7,dataFormat,dimRoundingMode,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,Conv2DBackpropFilter2,attrs)}var conv2DBackpropFilter3=op2({conv2DBackpropFilter_:conv2DBackpropFilter_2});function depthwiseConv2dNativeBackpropFilter_2(x,dy,filterShape,strides,pad7,dilations=[1,1],dimRoundingMode){let x4D=x;x.rank===3&&(x4D=reshape2(x,[1,x.shape[0],x.shape[1],x.shape[2]]));let dy4D=dy;dy4D.rank===3&&(dy4D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2]]));let forward=backend3=>{let convInfo=computeConv2DInfo2(x.shape,filterShape,strides,dilations,pad7,dimRoundingMode,!0);return backend3.depthwiseConv2DDerFilter(x4D,dy4D,convInfo)},inputs={x:x4D,dy:dy4D},attrs={strides,pad:pad7,dimRoundingMode,dilations,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNativeBackpropFilter2,attrs)}var depthwiseConv2dNativeBackpropFilter3=op2({depthwiseConv2dNativeBackpropFilter_:depthwiseConv2dNativeBackpropFilter_2});function depthwiseConv2dNativeBackpropInput_2(xShape,dy,filter,strides,pad7,dilations=[1,1],dimRoundingMode){let dy4D=dy,reshapedTo4D=!1;dy.rank===3&&(reshapedTo4D=!0,dy4D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2]]));let forward=backend3=>{let convInfo=computeConv2DInfo2(xShape,filter.shape,strides,dilations,pad7,dimRoundingMode,!0);return backend3.depthwiseConv2DDerInput(dy4D,filter,convInfo)},inputs={dy:dy4D,filter},attrs={strides,pad:pad7,dimRoundingMode,dilations,inputShape:xShape},res=ENGINE2.runKernelFunc(forward,inputs,null,DepthwiseConv2dNativeBackpropInput2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var depthwiseConv2dNativeBackpropInput3=op2({depthwiseConv2dNativeBackpropInput_:depthwiseConv2dNativeBackpropInput_2});function hammingWindow_2(windowLength){return cosineWindow2(windowLength,.54,.46)}var hammingWindow2=op2({hammingWindow_:hammingWindow_2});function hannWindow_2(windowLength){return cosineWindow2(windowLength,.5,.5)}var hannWindow2=op2({hannWindow_:hannWindow_2});function frame_2(signal3,frameLength,frameStep,padEnd=!1,padValue=0){let start=0,output=[];for(;start+frameLength<=signal3.size;)output.push(slice2(signal3,start,frameLength)),start+=frameStep;if(padEnd)for(;start`Error in cropAndResize: image must be rank 4,but got rank ${$image.rank}.`),assert3($boxes.rank===2&&$boxes.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${numBoxes},4] but had shape ${$boxes.shape}.`),assert3($boxInd.rank===1&&$boxInd.shape[0]===numBoxes,()=>`Error in cropAndResize: boxInd must be have size [${numBoxes}] but had shape ${$boxes.shape}.`),assert3(cropSize.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${cropSize.length}.`),assert3(cropSize[0]>=1&&cropSize[1]>=1,()=>`cropSize must be atleast [1,1], but was ${cropSize}`),assert3(method==="bilinear"||method==="nearest",()=>`method must be bilinear or nearest, but was ${method}`);let forward=backend3=>backend3.cropAndResize($image,$boxes,$boxInd,cropSize,method,extrapolationValue),inputs={image:$image,boxes:$boxes,boxInd:$boxInd},attrs={method,extrapolationValue,cropSize},res=ENGINE2.runKernelFunc(forward,inputs,null,CropAndResize2,attrs);return res}var cropAndResize3=op2({cropAndResize_:cropAndResize_2});function flipLeftRight_2(image3){let $image=convertToTensor2(image3,"image","flipLeftRight","float32");assert3($image.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${$image.rank}.`);let inputs={image:$image},res=ENGINE2.runKernel(FlipLeftRight2,inputs,{});return res}var flipLeftRight3=op2({flipLeftRight_:flipLeftRight_2});function rotateWithOffset_2(image3,radians,fillValue=0,center=.5){let $image=convertToTensor2(image3,"image","rotateWithOffset","float32");assert3($image.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${$image.rank}.`);let inputs={image:$image},attrs={radians,fillValue,center},res=ENGINE2.runKernel(RotateWithOffset2,inputs,attrs);return res}var rotateWithOffset3=op2({rotateWithOffset_:rotateWithOffset_2});function nonMaxSuppSanityCheck2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma){iouThreshold==null&&(iouThreshold=.5),scoreThreshold==null&&(scoreThreshold=Number.NEGATIVE_INFINITY),softNmsSigma==null&&(softNmsSigma=0);let numBoxes=boxes.shape[0];return maxOutputSize=Math.min(maxOutputSize,numBoxes),assert3(0<=iouThreshold&&iouThreshold<=1,()=>`iouThreshold must be in [0, 1], but was '${iouThreshold}'`),assert3(boxes.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${boxes.rank}'`),assert3(boxes.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${boxes.shape[1]}`),assert3(scores.rank===1,()=>"scores must be a 1D tensor"),assert3(scores.shape[0]===numBoxes,()=>`scores has incompatible shape with boxes. Expected ${numBoxes}, but was ${scores.shape[0]}`),assert3(0<=softNmsSigma&&softNmsSigma<=1,()=>`softNmsSigma must be in [0, 1], but was '${softNmsSigma}'`),{maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma}}function nonMaxSuppression_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),inputs=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold);maxOutputSize=inputs.maxOutputSize,iouThreshold=inputs.iouThreshold,scoreThreshold=inputs.scoreThreshold;let attrs={maxOutputSize,iouThreshold,scoreThreshold};return ENGINE2.runKernelFunc(b=>b.nonMaxSuppression($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold),{boxes:$boxes,scores:$scores},null,NonMaxSuppressionV32,attrs)}var nonMaxSuppression3=op2({nonMaxSuppression_:nonMaxSuppression_2});function binaryInsert2(arr,element,comparator){let index=binarySearch2(arr,element,comparator),insertionPoint=index<0?-(index+1):index;arr.splice(insertionPoint,0,element)}function binarySearch2(arr,target,comparator){return binarySearch_2(arr,target,comparator||defaultComparator2)}function defaultComparator2(a,b){return a>b?1:a>>1);let compareResult=comparator(target,arr[middle]);compareResult>0?left=middle+1:(right=middle,found=!compareResult)}return found?left:-left-1}function nonMaxSuppressionV3Impl3(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,0).selectedIndices}function nonMaxSuppressionV4Impl4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,padToMaxOutputSize){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,0,!1,padToMaxOutputSize,!0)}function nonMaxSuppressionV5Impl4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma){return nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma,!0)}function nonMaxSuppressionImpl_2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma,returnScoresTensor=!1,padToMaxOutputSize=!1,returnValidOutputs=!1){let candidates=[];for(let i=0;iscoreThreshold&&candidates.push({score:scores[i],boxIndex:i,suppressBeginIndex:0});candidates.sort(ascendingComparator2);let scale3=softNmsSigma>0?-.5/softNmsSigma:0,selectedIndices=[],selectedScores=[];for(;selectedIndices.length0;){let candidate=candidates.pop(),{score:originalScore,boxIndex,suppressBeginIndex}=candidate;if(originalScore=suppressBeginIndex;--j){let iou3=intersectionOverUnion2(boxes,boxIndex,selectedIndices[j]);if(iou3>=iouThreshold){ignoreCandidate=!0;break}if(candidate.score=candidate.score*suppressWeight2(iouThreshold,scale3,iou3),candidate.score<=scoreThreshold)break}candidate.suppressBeginIndex=selectedIndices.length,ignoreCandidate||(candidate.score===originalScore?(selectedIndices.push(boxIndex),selectedScores.push(candidate.score)):candidate.score>scoreThreshold&&binaryInsert2(candidates,candidate,ascendingComparator2))}let validOutputs=selectedIndices.length,elemsToPad=maxOutputSize-validOutputs;padToMaxOutputSize&&elemsToPad>0&&(selectedIndices.push(...new Array(elemsToPad).fill(0)),selectedScores.push(...new Array(elemsToPad).fill(0)));let result={selectedIndices:tensor1d2(selectedIndices,"int32")};return returnScoresTensor&&(result.selectedScores=tensor1d2(selectedScores,"float32")),returnValidOutputs&&(result.validOutputs=scalar2(validOutputs,"int32")),result}function intersectionOverUnion2(boxes,i,j){let iCoord=boxes.subarray(i*4,i*4+4),jCoord=boxes.subarray(j*4,j*4+4),yminI=Math.min(iCoord[0],iCoord[2]),xminI=Math.min(iCoord[1],iCoord[3]),ymaxI=Math.max(iCoord[0],iCoord[2]),xmaxI=Math.max(iCoord[1],iCoord[3]),yminJ=Math.min(jCoord[0],jCoord[2]),xminJ=Math.min(jCoord[1],jCoord[3]),ymaxJ=Math.max(jCoord[0],jCoord[2]),xmaxJ=Math.max(jCoord[1],jCoord[3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function suppressWeight2(iouThreshold,scale3,iou3){let weight=Math.exp(scale3*iou3*iou3);return iou3<=iouThreshold?weight:0}function ascendingComparator2(c1,c2){return c1.score-c2.score||c1.score===c2.score&&c2.boxIndex-c1.boxIndex}async function nonMaxSuppressionAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),inputs=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold);maxOutputSize=inputs.maxOutputSize,iouThreshold=inputs.iouThreshold,scoreThreshold=inputs.scoreThreshold;let boxesAndScores=await Promise.all([$boxes.data(),$scores.data()]),boxesVals=boxesAndScores[0],scoresVals=boxesAndScores[1],res=nonMaxSuppressionV3Impl3(boxesVals,scoresVals,maxOutputSize,iouThreshold,scoreThreshold);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionAsync2=nonMaxSuppressionAsync_2;function nonMaxSuppressionWithScore_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,softNmsSigma=0){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);maxOutputSize=params.maxOutputSize,iouThreshold=params.iouThreshold,scoreThreshold=params.scoreThreshold,softNmsSigma=params.softNmsSigma;let inputs={boxes:$boxes,scores:$scores},attrs={maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma},result=ENGINE2.runKernel(NonMaxSuppressionV52,inputs,attrs);return{selectedIndices:result[0],selectedScores:result[1]}}var nonMaxSuppressionWithScore2=op2({nonMaxSuppressionWithScore_:nonMaxSuppressionWithScore_2});async function nonMaxSuppressionWithScoreAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,softNmsSigma=0){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);maxOutputSize=params.maxOutputSize,iouThreshold=params.iouThreshold,scoreThreshold=params.scoreThreshold,softNmsSigma=params.softNmsSigma;let boxesAndScores=await Promise.all([$boxes.data(),$scores.data()]),boxesVals=boxesAndScores[0],scoresVals=boxesAndScores[1],res=nonMaxSuppressionV5Impl4(boxesVals,scoresVals,maxOutputSize,iouThreshold,scoreThreshold,softNmsSigma);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionWithScoreAsync2=nonMaxSuppressionWithScoreAsync_2;function nonMaxSuppressionPadded_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,padToMaxOutputSize=!1){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppression"),$scores=convertToTensor2(scores,"scores","nonMaxSuppression"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,null),$maxOutputSize=params.maxOutputSize,$iouThreshold=params.iouThreshold,$scoreThreshold=params.scoreThreshold,inputs={boxes:$boxes,scores:$scores},attrs={maxOutputSize:$maxOutputSize,iouThreshold:$iouThreshold,scoreThreshold:$scoreThreshold,padToMaxOutputSize},result=ENGINE2.runKernel(NonMaxSuppressionV42,inputs,attrs);return{selectedIndices:result[0],validOutputs:result[1]}}var nonMaxSuppressionPadded2=op2({nonMaxSuppressionPadded_:nonMaxSuppressionPadded_2});async function nonMaxSuppressionPaddedAsync_2(boxes,scores,maxOutputSize,iouThreshold=.5,scoreThreshold=Number.NEGATIVE_INFINITY,padToMaxOutputSize=!1){let $boxes=convertToTensor2(boxes,"boxes","nonMaxSuppressionAsync"),$scores=convertToTensor2(scores,"scores","nonMaxSuppressionAsync"),params=nonMaxSuppSanityCheck2($boxes,$scores,maxOutputSize,iouThreshold,scoreThreshold,null),$maxOutputSize=params.maxOutputSize,$iouThreshold=params.iouThreshold,$scoreThreshold=params.scoreThreshold,[boxesVals,scoresVals]=await Promise.all([$boxes.data(),$scores.data()]),res=nonMaxSuppressionV4Impl4(boxesVals,scoresVals,$maxOutputSize,$iouThreshold,$scoreThreshold,padToMaxOutputSize);return $boxes!==boxes&&$boxes.dispose(),$scores!==scores&&$scores.dispose(),res}var nonMaxSuppressionPaddedAsync2=nonMaxSuppressionPaddedAsync_2;function resizeBilinear_2(images,size,alignCorners=!1){let $images=convertToTensor2(images,"images","resizeBilinear");assert3($images.rank===3||$images.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${$images.rank}.`),assert3(size.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${size}.`);let batchImages=$images,reshapedTo4D=!1;$images.rank===3&&(reshapedTo4D=!0,batchImages=reshape2($images,[1,$images.shape[0],$images.shape[1],$images.shape[2]]));let[newHeight,newWidth]=size,forward=(backend3,save)=>(save([batchImages]),backend3.resizeBilinear(batchImages,newHeight,newWidth,alignCorners)),inputs={images:batchImages},attrs={alignCorners,size},res=ENGINE2.runKernelFunc(forward,inputs,null,ResizeBilinear2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var resizeBilinear3=op2({resizeBilinear_:resizeBilinear_2});function resizeNearestNeighbor_2(images,size,alignCorners=!1){let $images=convertToTensor2(images,"images","resizeNearestNeighbor");assert3($images.rank===3||$images.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${$images.rank}.`),assert3(size.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${size}.`),assert3($images.dtype==="float32"||$images.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let batchImages=$images,reshapedTo4D=!1;$images.rank===3&&(reshapedTo4D=!0,batchImages=reshape2($images,[1,$images.shape[0],$images.shape[1],$images.shape[2]]));let[newHeight,newWidth]=size,inputs={images:batchImages},attrs={alignCorners,size},forward=(backend3,save)=>(save([batchImages]),backend3.resizeNearestNeighbor(batchImages,newHeight,newWidth,alignCorners)),res=ENGINE2.runKernelFunc(forward,inputs,null,ResizeNearestNeighbor2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var resizeNearestNeighbor2=op2({resizeNearestNeighbor_:resizeNearestNeighbor_2});function bandPart_2(a,numLower,numUpper){assert3(numLower%1===0,()=>`bandPart(): numLower must be an integer, got ${numLower}.`),assert3(numUpper%1===0,()=>`bandPart(): numUpper must be an integer, got ${numUpper}.`);let $a=convertToTensor2(a,"a","bandPart");assert3($a.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${$a.rank}.`);let shape=$a.shape,[M,N]=$a.shape.slice(-2);if(!(numLower<=M))throw new Error(`bandPart(): numLower (${numLower}) must not be greater than the number of rows (${M}).`);if(!(numUpper<=N))throw new Error(`bandPart(): numUpper (${numUpper}) must not be greater than the number of columns (${N}).`);numLower<0&&(numLower=M),numUpper<0&&(numUpper=N);let i=reshape2(range3(0,M,1,"int32"),[-1,1]),j=range3(0,N,1,"int32"),ij=sub2(i,j),inBand=logicalAnd2(lessEqual2(ij,scalar2(+numLower,"int32")),greaterEqual2(ij,scalar2(-numUpper,"int32"))),zero=zeros2([M,N],$a.dtype);return reshape2(stack2(unstack2(reshape2($a,[-1,M,N])).map(mat=>where2(inBand,mat,zero))),shape)}var bandPart2=op2({bandPart_:bandPart_2});function gramSchmidt_2(xs){let inputIsTensor2D;if(Array.isArray(xs)){inputIsTensor2D=!1,assert3(xs!=null&&xs.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let dim=xs[0].shape[0];for(let i=1;i`Gram-Schmidt: Non-unique lengths found in the input vectors: (${xs[i].shape[0]} vs. ${dim})`)}else inputIsTensor2D=!0,xs=split2(xs,xs.shape[0],0).map(x=>squeeze2(x,[0]));assert3(xs.length<=xs[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${xs.length}) exceeds number of dimensions (${xs[0].shape[0]}).`);let ys=[],xs1d=xs;for(let i=0;i{let x=xs1d[i];if(i>0)for(let j=0;j=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${x.rank}`),x.rank===2)return qr2d2(x,fullMatrices);{let outerDimsProd=x.shape.slice(0,x.shape.length-2).reduce((value,prev)=>value*prev),x2ds=unstack2(reshape2(x,[outerDimsProd,x.shape[x.shape.length-2],x.shape[x.shape.length-1]]),0),q2ds=[],r2ds=[];x2ds.forEach(x2d=>{let[q2d,r2d]=qr2d2(x2d,fullMatrices);q2ds.push(q2d),r2ds.push(r2d)});let q=reshape2(stack2(q2ds,0),x.shape),r=reshape2(stack2(r2ds,0),x.shape);return[q,r]}}function qr2d2(x,fullMatrices=!1){return ENGINE2.tidy(()=>{assert3(x.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${x.shape.length}D Tensor.`);let m=x.shape[0],n=x.shape[1],q=eye2(m),r=clone2(x),one2D=tensor2d2([[1]],[1,1]),w=clone2(one2D),iters=m>=n?n:m;for(let j=0;j{let rjEnd1=slice2(r,[j,j],[m-j,1]),normX=norm2(rjEnd1),rjj=slice2(r,[j,j],[1,1]),s=where2(greater2(rjj,0),tensor2d2([[-1]]),tensor2d2([[1]])),u1=sub2(rjj,mul2(s,normX)),wPre=div2(rjEnd1,u1);wPre.shape[0]===1?w=clone2(one2D):w=concat2([one2D,slice2(wPre,[1,0],[wPre.shape[0]-1,wPre.shape[1]])],0);let tau=neg2(div2(matMul3(s,u1),normX)),rjEndAll=slice2(r,[j,0],[m-j,n]),tauTimesW=mul2(tau,w),wT=transpose2(w);if(j===0)r=sub2(rjEndAll,matMul3(tauTimesW,matMul3(wT,rjEndAll)));else{let rTimesTau=sub2(rjEndAll,matMul3(tauTimesW,matMul3(wT,rjEndAll)));r=concat2([slice2(r,[0,0],[j,n]),rTimesTau],0)}let tawTimesWT=transpose2(tauTimesW),qAllJEnd=slice2(q,[0,j],[m,q.shape[1]-j]);if(j===0)q=sub2(qAllJEnd,matMul3(matMul3(qAllJEnd,w),tawTimesWT));else{let qTimesTau=sub2(qAllJEnd,matMul3(matMul3(qAllJEnd,w),tawTimesWT));q=concat2([slice2(q,[0,0],[m,j]),qTimesTau],1)}return[w,r,q]}),dispose2([rTemp,wTemp,qTemp])}return!fullMatrices&&m>n&&(q=slice2(q,[0,0],[m,n]),r=slice2(r,[0,0],[n,n])),[q,r]})}var qr2=op2({qr_:qr_2});var Reduction2;(function(Reduction3){Reduction3[Reduction3.NONE=0]="NONE",Reduction3[Reduction3.MEAN=1]="MEAN",Reduction3[Reduction3.SUM=2]="SUM",Reduction3[Reduction3.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(Reduction2||(Reduction2={}));function computeWeightedLoss_2(losses3,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $losses=convertToTensor2(losses3,"losses","computeWeightedLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","computeWeightedLoss"));let weightedLoss=$weights==null?$losses:mul2($losses,$weights);if(reduction===Reduction2.NONE)return weightedLoss;if(reduction===Reduction2.SUM)return sum3(weightedLoss);if(reduction===Reduction2.MEAN){if($weights==null)return mean2(weightedLoss);{let broadcastFactor=$losses.size/$weights.size,result=div2(sum3(weightedLoss),sum3($weights));return broadcastFactor>1?div2(result,scalar2(broadcastFactor)):result}}if(reduction===Reduction2.SUM_BY_NONZERO_WEIGHTS){if($weights==null)return div2(sum3(weightedLoss),scalar2($losses.size));{let broadcastedWeights=mul2($weights,ones4($losses.shape)),numNonZeros=cast2(sum3(notEqual4(broadcastedWeights,scalar2(0))),"float32");return div2(sum3(weightedLoss),numNonZeros)}}throw Error(`Unknown reduction: ${reduction}`)}var computeWeightedLoss3=op2({computeWeightedLoss_:computeWeightedLoss_2});function absoluteDifference_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","absoluteDifference"),$predictions=convertToTensor2(predictions,"predictions","absoluteDifference"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","absoluteDifference")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in absoluteDifference: ");let losses3=abs2(sub2($labels,$predictions));return computeWeightedLoss3(losses3,$weights,reduction)}var absoluteDifference2=op2({absoluteDifference_:absoluteDifference_2});function cosineDistance_2(labels,predictions,axis,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","cosineDistance"),$predictions=convertToTensor2(predictions,"predictions","cosineDistance"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","cosineDistance")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in cosineDistance: ");let one=scalar2(1),losses3=sub2(one,sum3(mul2($labels,$predictions),axis,!0));return computeWeightedLoss3(losses3,$weights,reduction)}var cosineDistance2=op2({cosineDistance_:cosineDistance_2});function hingeLoss_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","hingeLoss"),$predictions=convertToTensor2(predictions,"predictions","hingeLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","hingeLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in hingeLoss: ");let one=scalar2(1);$labels=sub2(mul2(scalar2(2),$labels),one);let losses3=relu2(sub2(one,mul2($labels,$predictions)));return computeWeightedLoss3(losses3,$weights,reduction)}var hingeLoss2=op2({hingeLoss_:hingeLoss_2});function huberLoss_2(labels,predictions,weights,delta=1,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","huberLoss"),$predictions=convertToTensor2(predictions,"predictions","huberLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","huberLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in huberLoss: ");let deltaScalar=scalar2(delta),error=abs2(sub2($predictions,$labels)),quadratic=minimum2(error,deltaScalar),linear=sub2(error,quadratic),losses3=add4(mul2(scalar2(.5),square2(quadratic)),mul2(deltaScalar,linear));return computeWeightedLoss3(losses3,$weights,reduction)}var huberLoss2=op2({huberLoss_:huberLoss_2});function logLoss_2(labels,predictions,weights,epsilon4=1e-7,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","logLoss"),$predictions=convertToTensor2(predictions,"predictions","logLoss"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","logLoss")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in logLoss: ");let one=scalar2(1),epsilonScalar=scalar2(epsilon4),l13=neg2(mul2($labels,log2(add4($predictions,epsilonScalar)))),l23=mul2(sub2(one,$labels),log2(add4(sub2(one,$predictions),epsilonScalar))),losses3=sub2(l13,l23);return computeWeightedLoss3(losses3,$weights,reduction)}var logLoss2=op2({logLoss_:logLoss_2});function meanSquaredError_2(labels,predictions,weights,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $labels=convertToTensor2(labels,"labels","meanSquaredError"),$predictions=convertToTensor2(predictions,"predictions","meanSquaredError"),$weights=null;weights!=null&&($weights=convertToTensor2(weights,"weights","meanSquaredError")),assertShapesMatch2($labels.shape,$predictions.shape,"Error in meanSquaredError: ");let losses3=squaredDifference4($labels,$predictions);return computeWeightedLoss3(losses3,$weights,reduction)}var meanSquaredError4=op2({meanSquaredError_:meanSquaredError_2});function sigmoidCrossEntropyWithLogits_2(labels,logits){let $labels=convertToTensor2(labels,"labels","sigmoidCrossEntropyWithLogits"),$logits=convertToTensor2(logits,"logits","sigmoidCrossEntropyWithLogits");assertShapesMatch2($labels.shape,$logits.shape,"Error in sigmoidCrossEntropyWithLogits: ");let maxOutput=relu2($logits),outputXTarget=mul2($logits,$labels),sigmoidOutput=log1p2(exp2(neg2(abs2($logits))));return add4(sub2(maxOutput,outputXTarget),sigmoidOutput)}function sigmoidCrossEntropy_2(multiClassLabels,logits,weights,labelSmoothing=0,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $multiClassLabels=convertToTensor2(multiClassLabels,"multiClassLabels","sigmoidCrossEntropy"),$logits=convertToTensor2(logits,"logits","sigmoidCrossEntropy"),$weights=null;if(weights!=null&&($weights=convertToTensor2(weights,"weights","sigmoidCrossEntropy")),assertShapesMatch2($multiClassLabels.shape,$logits.shape,"Error in sigmoidCrossEntropy: "),labelSmoothing>0){let labelSmoothingScalar=scalar2(labelSmoothing),one=scalar2(1),half=scalar2(.5);$multiClassLabels=add4(mul2($multiClassLabels,sub2(one,labelSmoothingScalar)),mul2(half,labelSmoothingScalar))}let losses3=sigmoidCrossEntropyWithLogits_2($multiClassLabels,$logits);return computeWeightedLoss3(losses3,$weights,reduction)}var sigmoidCrossEntropy2=op2({sigmoidCrossEntropy_:sigmoidCrossEntropy_2});function softmaxCrossEntropyWithLogits_2(labels,logits,dim=-1){if(dim===-1&&(dim=logits.rank-1),dim!==logits.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${logits.rank} and dim was ${dim}`);let customOp=customGrad2((labels2,logits2,save)=>{let keepDims=!0,lse=logSumExp2(logits2,[dim],keepDims),logResult=sub2(cast2(logits2,"float32"),lse);save([labels2,logResult]);let costVector=neg2(mul2(logResult,labels2)),value=sum3(costVector,[dim]),gradFunc=(dy,saved)=>{let[labels3,logResult2]=saved,dyShape=expandShapeToKeepDim2(dy.shape,[dim]);return[mul2(reshape2(dy,dyShape),sub2(cast2(labels3,"float32"),exp2(logResult2))),mul2(reshape2(dy,dyShape),sub2(exp2(logResult2),cast2(labels3,"float32")))]};return{value,gradFunc}});return customOp(labels,logits)}function softmaxCrossEntropy_2(onehotLabels,logits,weights,labelSmoothing=0,reduction=Reduction2.SUM_BY_NONZERO_WEIGHTS){let $onehotLabels=convertToTensor2(onehotLabels,"onehotLabels","softmaxCrossEntropy"),$logits=convertToTensor2(logits,"logits","softmaxCrossEntropy"),$weights=null;if(weights!=null&&($weights=convertToTensor2(weights,"weights","softmaxCrossEntropy")),assertShapesMatch2($onehotLabels.shape,$logits.shape,"Error in softmaxCrossEntropy: "),labelSmoothing>0){let labelSmoothingScalar=scalar2(labelSmoothing),one=scalar2(1),numClasses=scalar2($onehotLabels.shape[1]);$onehotLabels=add4(mul2($onehotLabels,sub2(one,labelSmoothingScalar)),div2(labelSmoothingScalar,numClasses))}let losses3=softmaxCrossEntropyWithLogits_2($onehotLabels,$logits);return computeWeightedLoss3(losses3,$weights,reduction)}var softmaxCrossEntropy2=op2({softmaxCrossEntropy_:softmaxCrossEntropy_2});var spectral2={fft:fft2,ifft:ifft2,rfft:rfft2,irfft:irfft2},signal2={hammingWindow:hammingWindow2,hannWindow:hannWindow2,frame:frame2,stft:stft2},image2={flipLeftRight:flipLeftRight3,resizeNearestNeighbor:resizeNearestNeighbor2,resizeBilinear:resizeBilinear3,rotateWithOffset:rotateWithOffset3,cropAndResize:cropAndResize3,nonMaxSuppression:nonMaxSuppression3,nonMaxSuppressionAsync:nonMaxSuppressionAsync2,nonMaxSuppressionWithScore:nonMaxSuppressionWithScore2,nonMaxSuppressionWithScoreAsync:nonMaxSuppressionWithScoreAsync2,nonMaxSuppressionPadded:nonMaxSuppressionPadded2,nonMaxSuppressionPaddedAsync:nonMaxSuppressionPaddedAsync2},linalg2={bandPart:bandPart2,gramSchmidt:gramSchmidt2,qr:qr2},losses2={absoluteDifference:absoluteDifference2,computeWeightedLoss:computeWeightedLoss3,cosineDistance:cosineDistance2,hingeLoss:hingeLoss2,huberLoss:huberLoss2,logLoss:logLoss2,meanSquaredError:meanSquaredError4,sigmoidCrossEntropy:sigmoidCrossEntropy2,softmaxCrossEntropy:softmaxCrossEntropy2};var SELU_SCALEALPHA2=1.7580993408473768,SELU_SCALE2=1.0507009873554805;var absGradConfig2={kernelName:Abs2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,step2(cast2(x,"float32"),-1))}}};var acosGradConfig2={kernelName:Acos2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=square2(cast2(x,"float32")),b=sqrt2(sub2(scalar2(1),a));return neg2(div2(dy,b))}}}};var acoshGradConfig2={kernelName:Acosh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=sqrt2(sub2(square2(cast2(x,"float32")),1));return div2(dy,a)}}}};var addGradConfig2={kernelName:Add3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=dy,reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let res=dy,reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,b.shape)};return{a:derA,b:derB}}};var addNGradConfig2={kernelName:AddN2,saveAllInputs:!0,gradFunc:(dy,saved)=>{let ders={};return saved.forEach((_,i)=>{ders[i]=()=>dy.clone()}),ders}};var argMaxGradConfig2={kernelName:ArgMax2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>zerosLike3(x)}}};var argMinGradConfig2={kernelName:ArgMin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>zerosLike3(x)}}};var asinGradConfig2={kernelName:Asin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,sqrt2(sub2(scalar2(1),square2(cast2(x,"float32")))))}}};var asinhGradConfig2={kernelName:Asinh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let a=sqrt2(add4(scalar2(1),square2(cast2(x,"float32"))));return div2(dy,a)}}}};var atan2GradConfig2={kernelName:Atan22,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let d=add4(square2(a),square2(b)),res=mul2(dy,div2(b,d)),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let d=add4(square2(a),square2(b)),res=neg2(mul2(dy,div2(a,d))),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,b.shape)};return{a:derA,b:derB}}};var atanGradConfig2={kernelName:Atan3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,add4(square2(cast2(x,"float32")),1))}}};var atanhGradConfig2={kernelName:Atanh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,sub2(scalar2(1),square2(cast2(x,"float32"))))}}};function avgPool3dBackprop_2(dy,input2,filterSize,strides,dilations=[1,1,1],pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","avgPool3dBackprop"),$input=convertToTensor2(input2,"input","avgPool3dBackprop"),dy5D=$dy,input5D=$input,reshapedTo5D=!1;$input.rank===4&&(reshapedTo5D=!0,dy5D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2],$dy.shape[3]]),input5D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2],$input.shape[3]])),assert3(dy5D.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${dy5D.rank}.`),assert3(input5D.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${input5D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool3DInfo2(input5D.shape,filterSize,strides,dilations,pad7,dimRoundingMode);return backend3.avgPool3dBackprop(dy5D,input5D,convInfo)},inputs={dy:dy5D,input:input5D},attrs={filterSize,strides,dilations,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,AvgPool3DBackprop2,attrs);return reshapedTo5D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3],res.shape[4]]):res}var avgPool3dBackprop2=op2({avgPool3dBackprop_:avgPool3dBackprop_2});var avgPool3DGradConfig2={kernelName:AvgPool3D2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{filterSize,strides,dilations,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1,1]:dilations;return{x:()=>avgPool3dBackprop2(dy,x,filterSize,strides,$dilations,pad7,dimRoundingMode)}}};function avgPoolBackprop_2(dy,input2,filterSize,strides,pad7){let $dy=convertToTensor2(dy,"dy","avgPoolBackprop"),$input=convertToTensor2(input2,"input","avgPoolBackprop");assert3($input.rank===$dy.rank,()=>`Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`);let input4D=$input,dy4D=$dy,reshapedTo4D=!1;$input.rank===3&&(reshapedTo4D=!0,input4D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2]]),dy4D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2]])),assert3(dy4D.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${dy4D.rank}.`),assert3(input4D.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${input4D.rank}.`);let forward=backend3=>{let convInfo=computePool2DInfo2(input4D.shape,filterSize,strides,1,pad7);return backend3.avgPoolBackprop(dy4D,input4D,convInfo)},inputs={dy:dy4D,input:input4D},attrs={filterSize,strides,pad:pad7},res=ENGINE2.runKernelFunc(forward,inputs,null,AvgPoolBackprop2,attrs);return reshapedTo4D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3]]):res}var avgPoolBackprop4=op2({avgPoolBackprop_:avgPoolBackprop_2});var avgPoolGradConfig2={kernelName:AvgPool2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{filterSize,strides,pad:pad7}=attrs;return{x:()=>avgPoolBackprop4(dy,x,filterSize,strides,pad7)}}};var batchMatMulGradConfig2={kernelName:BatchMatMul2,inputsToSave:["a","b"],gradFunc:(dy,saved,attrs)=>{let[a,b]=saved,{transposeA,transposeB}=attrs;return!transposeA&&!transposeB?{a:()=>matMul3(dy,b,!1,!0),b:()=>matMul3(a,dy,!0,!1)}:!transposeA&&transposeB?{a:()=>matMul3(dy,b,!1,!1),b:()=>matMul3(dy,a,!0,!1)}:transposeA&&!transposeB?{a:()=>matMul3(b,dy,!1,!0),b:()=>matMul3(a,dy,!1,!1)}:{a:()=>matMul3(b,dy,!0,!0),b:()=>matMul3(dy,a,!0,!0)}}};var batchToSpaceNDGradConfig2={kernelName:BatchToSpaceND2,gradFunc:(dy,saved,attrs)=>{let{blockShape,crops}=attrs;return{x:()=>spaceToBatchND3(dy,blockShape,crops)}}};var broadcastToGradConfig2={kernelName:BroadcastTo2,gradFunc:(dy,saved,attrs)=>{let broadCastToAttrs=attrs,inputShape=broadCastToAttrs.inputShape,outputShape=broadCastToAttrs.shape,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)throw new Error(`broadcastTo(): [${inputShape}] cannot be broadcast to [${outputShape}].`);let axes=[];for(let i=0;i1&&axes.push(i);return{x:()=>sum3(dy,axes,!0)}}};var castGradConfig2={kernelName:Cast2,gradFunc:dy=>({x:()=>dy.clone()})};var ceilGradConfig2={kernelName:Ceil2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var clipByValueGradConfig2={kernelName:ClipByValue2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{clipValueMin,clipValueMax}=attrs;return{x:()=>where2(logicalAnd2(greaterEqual2(x,clipValueMin),lessEqual2(x,clipValueMax)),dy,zerosLike3(dy))}}};var concatGradConfig2={kernelName:Concat2,saveAllInputs:!0,gradFunc:(dy,saved,attrs)=>{let shapes=saved.map(t=>t.shape),{axis}=attrs,$axis=parseAxisParam2(axis,saved[0].shape)[0],sizeSplits=shapes.map(s=>s[$axis]),derTensors=split2(dy,sizeSplits,$axis);return derTensors.map(t=>()=>t)}};var conv2DGradConfig2={kernelName:Conv2D3,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let[x4D,$filter]=saved,{dilations,strides,pad:pad7,dataFormat}=attrs;return assert3(tupleValuesAreOne2(dilations),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${dilations}'`),{x:()=>conv2DBackpropInput4(x4D.shape,dy,$filter,strides,pad7,dataFormat),filter:()=>conv2DBackpropFilter3(x4D,dy,$filter.shape,strides,pad7,dataFormat)}}};var conv2DBackpropInputGradConfig2={kernelName:Conv2DBackpropInput2,inputsToSave:["dy","filter"],gradFunc:(ddx,saved,attrs)=>{let[dy,filter]=saved,{strides,pad:pad7,dataFormat,dimRoundingMode}=attrs;return{dy:()=>conv2d2(ddx,filter,strides,pad7,dataFormat,1,dimRoundingMode),filter:()=>conv2DBackpropFilter3(ddx,dy,filter.shape,strides,pad7,dataFormat,dimRoundingMode)}}};function conv3DBackpropFilter_2(x,dy,filterShape,strides,pad7){let x5D=x;x.rank===4&&(x5D=reshape2(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]));let dy5D=dy;dy5D.rank===4&&(dy5D=reshape2(dy,[1,dy.shape[0],dy.shape[1],dy.shape[2],dy.shape[3]])),assert3(x5D.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${x5D.shape}.`),assert3(dy5D.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${dy5D.shape}.`),assert3(filterShape.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${filterShape}.`),assert3(x5D.shape[4]===filterShape[3],()=>`Error in conv3dDerFilter: depth of input ${x5D.shape[4]}) must match input depth in filter (${filterShape[3]}.`),assert3(dy5D.shape[4]===filterShape[4],()=>`Error in conv3dDerFilter: depth of dy (${dy5D.shape[4]}) must match output depth for filter (${filterShape[4]}).`);let forward=backend3=>{let dilations=1,convInfo=computeConv3DInfo2(x5D.shape,filterShape,strides,dilations,pad7);return backend3.conv3dDerFilter(x5D,dy5D,convInfo)},inputs={x:x5D,dy:dy5D},attrs={strides,pad:pad7,filterShape};return ENGINE2.runKernelFunc(forward,inputs,null,Conv3DBackpropFilterV22,attrs)}var conv3DBackpropFilter2=op2({conv3DBackpropFilter_:conv3DBackpropFilter_2});var conv3DGradConfig2={kernelName:Conv3D3,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let{dilations,strides,pad:pad7}=attrs;assert3(tupleValuesAreOne2(dilations),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${dilations}'`);let[x5D,$filter]=saved;return{x:()=>conv3DBackpropInput2(x5D.shape,dy,$filter,strides,pad7),filter:()=>conv3DBackpropFilter2(x5D,dy,$filter.shape,strides,pad7)}}};var cosGradConfig2={kernelName:Cos2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(neg2(sin2(cast2(x,"float32"))),dy)}}};var coshGradConfig2={kernelName:Cosh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(sinh2(cast2(x,"float32")),dy)}}};var cumsumGradConfig2={kernelName:Cumsum2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{axis,exclusive,reverse:reverse8}=attrs;return{x:()=>{let permutation=getAxesPermutation2([axis],x.rank),out=cumsum2(dy,axis,exclusive,!reverse8);return permutation!=null&&(out=transpose2(out,permutation)),out}}}};var depthwiseConv2dNativeGradConfig2={kernelName:DepthwiseConv2dNative2,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let{dilations,strides,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1]:dilations;assert3(tupleValuesAreOne2($dilations),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${$dilations}'`);let[x,filter]=saved;return assert3(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),assert3(filter.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${filter.rank}.`),assert3(x.shape[3]===filter.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${filter.shape[2]}.`),assert3(eitherStridesOrDilationsAreOne2(strides,$dilations),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${strides} and dilations '${$dilations}'.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`),{x:()=>depthwiseConv2dNativeBackpropInput3(x.shape,dy,filter,strides,pad7,dilations,dimRoundingMode),filter:()=>depthwiseConv2dNativeBackpropFilter3(x,dy,filter.shape,strides,pad7,dilations,dimRoundingMode)}}};var dilation2dGradConfig2={kernelName:Dilation2D2,inputsToSave:["x","filter"],gradFunc:(dy,saved,attrs)=>{let[x,filter]=saved,inputInputs={x,filter,dy},filterInputs={x,filter,dy};return{x:()=>ENGINE2.runKernel(Dilation2DBackpropInput2,inputInputs,attrs),filter:()=>ENGINE2.runKernel(Dilation2DBackpropFilter2,filterInputs,attrs)}}};var divGradConfig2={kernelName:Div2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=div2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);reduceAxes.length>0&&(res=reshape2(sum3(res,reduceAxes),b.shape));let tmp=square2(b);return neg2(div2(res,cast2(tmp,"float32")))};return{a:derA,b:derB}}};var eluGradConfig2={kernelName:Elu3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved,backPropKernelFunc=backend3=>backend3.eluDer(dy,y),inputs={dy,y};return{x:()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,EluGrad2)}}};var erfGradConfig2={kernelName:Erf2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved,a=mul2(exp2(neg2(square2(x))),2/Math.sqrt(Math.PI));return{x:()=>mul2(dy,a)}}};var expGradConfig2={kernelName:Exp2,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(dy,y)}}};var expm1GradConfig2={kernelName:Expm12,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,exp2(x))}}};var floorGradConfig2={kernelName:Floor2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var floorDivGradConfig2={kernelName:FloorDiv2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=div2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);reduceAxes.length>0&&(res=reshape2(sum3(res,reduceAxes),b.shape));let tmp=square2(b);return neg2(div2(res,cast2(tmp,"float32")))};return{a:derA,b:derB}}};var fusedBatchNormGradConfig2={kernelName:FusedBatchNorm2,inputsToSave:["x","mean","variance","scale"],gradFunc:(dy,saved,attrs)=>{let{varianceEpsilon}=attrs,[x,mean7,variance,scale3]=saved,scaleValue=scale3==null?scalar2(1):scale3,reductionAxes=getReductionAxes2(mean7.shape,x.shape),tileShape=[];if(mean7.rank===1){for(let i=0;imean7.rank===1?reshape2(mul2(mul2(dy,tile2(reshape2(oneOverSqrtVariance,[1,1,1,mean7.shape[0]]),tileShape)),scaleValue),x.shape):reshape2(mul2(mul2(dy,oneOverSqrtVariance),scaleValue),x.shape),derMean=()=>{let meanDer=mul2(mul2(oneOverSqrtVariance,scalar2(-1)),dyTimesScaleValue);return mean7.rank===1&&(meanDer=sum3(meanDer,reductionAxes)),reshape2(meanDer,mean7.shape)},derVariance=()=>{let varianceDer=mul2(mul2(minusHalfRCube,xMinusMean),dyTimesScaleValue);return mean7.rank===1&&(varianceDer=sum3(varianceDer,reductionAxes)),reshape2(varianceDer,mean7.shape)},derScale=()=>{let xMinusMean2TimesRsqrt=mul2(xMinusMean,oneOverSqrtVariance),scaleDer=mul2(dy,xMinusMean2TimesRsqrt);return mean7.rank===1&&(scaleDer=sum3(scaleDer,reductionAxes)),reshape2(scaleDer,mean7.shape)},derOffset=()=>{let offsetDer=dy;return mean7.rank===1&&(offsetDer=sum3(offsetDer,reductionAxes)),reshape2(offsetDer,mean7.shape)};return{x:derX,mean:derMean,variance:derVariance,scale:derScale,offset:derOffset}}};var gatherGradConfig2={kernelName:GatherV22,inputsToSave:["x","indices"],gradFunc:(dy,saved,attrs)=>{let[x,indices]=saved,{axis}=attrs,parsedAxis=parseAxisParam2(axis,x.shape)[0],derX=()=>{let paramsShape=x.shape,indicesSize=indices.size,outerShape=paramsShape.slice(0,parsedAxis),outerDims=outerShape.length,innerShape=paramsShape.slice(axis,paramsShape.length).slice(1),innerDims=innerShape.length,outerAxesIndices=arrayRange2(0,outerDims),innerAxesIndices=arrayRange2(outerDims+1,outerDims+1+innerDims),valuesShape=arrayConcat2([outerShape,[indicesSize],innerShape]),values=reshape2(dy,valuesShape),reshapedIndices=reshape2(indices,[indicesSize]),transposeDims=arrayConcat2([[outerDims],outerAxesIndices,innerAxesIndices]),valuesTranspose=transpose2(values,transposeDims),paramsGrad=unsortedSegmentSum2(valuesTranspose,reshapedIndices,x.shape[parsedAxis]),invertTransposeDims=getUndoAxesPermutation2(transposeDims);return paramsGrad=transpose2(paramsGrad,invertTransposeDims),paramsGrad};return{x:derX,indices:()=>indices}}};function arrayRange2(start,stop){let result=[];for(let i=start;i{let[a,b]=saved;return{a:()=>zerosLike3(a),b:()=>zerosLike3(b)}}};var identityGradConfig2={kernelName:Identity3,gradFunc:dy=>({x:()=>cast2(dy,"float32")})};var isFiniteGradConfig2={kernelName:IsFinite2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var isInfGradConfig2={kernelName:IsInf2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var isNanGradConfig2={kernelName:IsNan2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var log1pGradConfig2={kernelName:Log1p2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,add4(x,1))}}};var logGradConfig2={kernelName:Log2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,cast2(x,"float32"))}}};var logSoftmaxGradConfig2={kernelName:LogSoftmax3,inputsToSave:[],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[value]=saved,{axis}=attrs;return{logits:()=>{let keepDims=!0,softmax7=exp2(value);return sub2(dy,mul2(sum3(dy,axis,keepDims),softmax7))}}}};function localResponseNormalizationBackprop_2(x,y,dy,depthRadius=5,bias=1,alpha=1,beta=.5){let forward=backend3=>backend3.LRNGrad(dy,x,y,depthRadius,bias,alpha,beta),inputs={x,y,dy},attrs={depthRadius,bias,alpha,beta};return ENGINE2.runKernelFunc(forward,inputs,null,LRNBackprop2,attrs)}var localResponseNormalizationBackprop2=op2({localResponseNormalizationBackprop_:localResponseNormalizationBackprop_2});var lrnGradConfig2={kernelName:LRN2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{depthRadius,bias,alpha,beta}=attrs;return{x:()=>localResponseNormalizationBackprop2(x,y,dy,depthRadius,bias,alpha,beta)}}};function gradForMinAndMax2(dy,y,xOrig,origAxes){return y.rank{let dx=mul2(dy,cast2(equal2(xOrig,y),dy.dtype));return dx}}}var maxGradConfig2={kernelName:Max2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let maxAttrs=attrs,{reductionIndices}=maxAttrs,x=saved[0],y=saved[1],origAxes=parseAxisParam2(reductionIndices,x.shape),maxGrad=gradForMinAndMax2(dy,y,x,origAxes);return{x:()=>maxGrad.x()}}};var maximumGradConfig2={kernelName:Maximum3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,derA=()=>mul2(dy,cast2(greaterEqual2(a,b),"float32")),derB=()=>mul2(dy,cast2(less2(a,b),"float32"));return{a:derA,b:derB}}};function maxPool3dBackprop_2(dy,input2,output,filterSize,strides,dilations=[1,1,1],pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","maxPool3dBackprop"),$input=convertToTensor2(input2,"input","maxPool3dBackprop"),$output=convertToTensor2(output,"output","maxPool3dBackprop"),dy5D=$dy,input5D=$input,output5D=$output,reshapedTo5D=!1;$input.rank===4&&(reshapedTo5D=!0,dy5D=reshape2($dy,[1,$dy.shape[0],$dy.shape[1],$dy.shape[2],$dy.shape[3]]),input5D=reshape2($input,[1,$input.shape[0],$input.shape[1],$input.shape[2],$input.shape[3]]),output5D=reshape2($output,[1,$output.shape[0],$output.shape[1],$output.shape[2],$output.shape[3]])),assert3(dy5D.rank===5,()=>`Error in maxPool3dBackprop: dy must be rank 5 but got rank ${dy5D.rank}.`),assert3(input5D.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${input5D.rank}.`),assert3(output5D.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${output5D.rank}.`),assert3(eitherStridesOrDilationsAreOne2(strides,dilations),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${strides} and dilations '${dilations}'`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool3DInfo2(input5D.shape,filterSize,strides,dilations,pad7,dimRoundingMode);return backend3.maxPool3dBackprop(dy5D,input5D,output5D,convInfo)},inputs={dy:dy5D,input:input5D,output:output5D},attrs={filterSize,strides,dilations,pad:pad7,dimRoundingMode},res=ENGINE2.runKernelFunc(forward,inputs,null,MaxPool3DBackprop2,attrs);return reshapedTo5D?reshape2(res,[res.shape[1],res.shape[2],res.shape[3],res.shape[4]]):res}var maxPool3dBackprop2=op2({maxPool3dBackprop_:maxPool3dBackprop_2});var maxPool3DGradConfig2={kernelName:MaxPool3D2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{filterSize,strides,dilations,pad:pad7,dimRoundingMode}=attrs,$dilations=dilations==null?[1,1,1]:dilations;return{x:()=>maxPool3dBackprop2(dy,x,y,filterSize,strides,$dilations,pad7,dimRoundingMode)}}};function maxPoolBackprop_2(dy,input2,output,filterSize,strides,pad7,dimRoundingMode){let $dy=convertToTensor2(dy,"dy","maxPoolBackprop"),$input=convertToTensor2(input2,"input","maxPoolBackprop"),$output=convertToTensor2(output,"output","maxPoolBackprop");assert3($input.rank===$dy.rank,()=>`Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`),assert3($dy.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${$dy.rank}.`),assert3($input.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${$input.rank}.`),dimRoundingMode!=null&&assert3(isInt2(pad7),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${dimRoundingMode} but got pad ${pad7}.`);let forward=backend3=>{let convInfo=computePool2DInfo2($input.shape,filterSize,strides,1,pad7,dimRoundingMode);return backend3.maxPoolBackprop($dy,$input,$output,convInfo)},inputs={dy:$dy,input:$input,output:$output},attrs={filterSize,strides,pad:pad7,dimRoundingMode};return ENGINE2.runKernelFunc(forward,inputs,null,MaxPoolBackprop2,attrs)}var maxPoolBackprop4=op2({maxPoolBackprop_:maxPoolBackprop_2});var maxPoolGradConfig2={kernelName:MaxPool2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[x,y]=saved,{filterSize,strides,pad:pad7}=attrs;return{x:()=>maxPoolBackprop4(dy,x,y,filterSize,strides,pad7)}}};var minGradConfig2={kernelName:Min2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let minAttrs=attrs,{axis}=minAttrs,[x,y]=saved,origAxes=parseAxisParam2(axis,x.shape),minGrad=gradForMinAndMax2(dy,y,x,origAxes);return{x:()=>minGrad.x()}}};var minimumGradConfig2={kernelName:Minimum3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,derA=()=>mul2(dy,cast2(lessEqual2(a,b),"float32")),derB=()=>mul2(dy,cast2(greater2(a,b),"float32"));return{a:derA,b:derB}}};var mirrorPadGradConfig2={kernelName:MirrorPad2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let x=saved[0],{paddings}=attrs,begin=paddings.map(p2=>p2[0]);return{x:()=>slice2(dy,begin,x.shape)}}};var modGradConfig2={kernelName:Mod2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(dy,reduceAxes),a.shape):dy},derB=()=>{let res=mul2(dy,neg2(floor2(div2(a,b)))),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),b.shape):res};return{a:derA,b:derB}}};var multiplyGradConfig2={kernelName:Multiply3,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=mul2(dy,cast2(b,"float32")),reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),a.shape):res},derB=()=>{let res=mul2(dy,cast2(a,"float32")),reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0?reshape2(sum3(res,reduceAxes),b.shape):res};return{a:derA,b:derB}}};var negateGradConfig2={kernelName:Negate2,gradFunc:dy=>({x:()=>neg2(dy)})};var oneHotGradConfig2={kernelName:OneHot2,inputsToSave:["indices"],gradFunc:(dy,saved)=>{let indices=saved[0];return{indices:()=>zeros2(indices.shape,"float32")}}};var onesLikeGradConfig2={kernelName:OnesLike2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var padV2GradConfig2={kernelName:PadV22,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let x=saved[0],{paddings}=attrs,begin=paddings.map(p2=>p2[0]);return{x:()=>slice2(dy,begin,x.shape)}}};var powGradConfig2={kernelName:Pow2,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(dy,saved)=>{let[a,b,y]=saved,base2=a,exp14=b,outShape=assertAndGetBroadcastShape2(base2.shape,exp14.shape),derBase=()=>{let expFloat=cast2(exp14,"float32"),res=mul2(dy,mul2(expFloat,pow2(base2,sub2(expFloat,scalar2(1))))),reduceAxes=getReductionAxes2(base2.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,base2.shape)},derExp=()=>{let condition=greater2(base2,0),logBase=where2(condition,log2(base2),zerosLike3(base2)),res=mul2(dy,mul2(y,logBase)),reduceAxes=getReductionAxes2(exp14.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,exp14.shape)};return{a:derBase,b:derExp}}};var preluGradConfig2={kernelName:Prelu2,inputsToSave:["x","alpha"],gradFunc:(dy,saved)=>{let[x,alpha]=saved,mask=greater2(x,0);return{x:()=>where2(mask,dy,mul2(dy,alpha)),alpha:()=>{let res=where2(mask,zerosLike3(dy),mul2(dy,x)),reduceAxes=getReductionAxes2(alpha.shape,dy.shape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,alpha.shape)}}}};var reciprocalGradConfig2={kernelName:Reciprocal2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,neg2(square2(x)))}}};var relu6GradConfig2={kernelName:Relu63,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved,mask=mul2(lessEqual2(x,6),step2(x));return{x:()=>mul2(dy,cast2(mask,"float32"))}}};var reluGradConfig2={kernelName:Relu3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,cast2(step2(x),"float32"))}}};var reshapeGradConfig2={kernelName:Reshape3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>reshape2(dy,x.shape)}}};var resizeBilinearGradConfig2={kernelName:ResizeBilinear2,inputsToSave:["images"],gradFunc:(dy,saved,attrs)=>{let[images]=saved,backPropKernelFunc=backend3=>{let{alignCorners}=attrs;return backend3.resizeBilinearBackprop(dy,images,alignCorners)},inputs={images},imagesDer=()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,ResizeBilinearGrad2,attrs);return{images:imagesDer}}};var resizeNearestNeighborGradConfig2={kernelName:ResizeNearestNeighbor2,inputsToSave:["images"],gradFunc:(dy,saved,attrs)=>{let[images]=saved,backPropKernelFunc=backend3=>{let{alignCorners}=attrs;return backend3.resizeNearestNeighborBackprop(dy,images,alignCorners)},inputs={images},imagesDer=()=>ENGINE2.runKernelFunc(backPropKernelFunc,inputs,null,ResizeNearestNeighborGrad2,attrs);return{images:imagesDer}}};var reverseGradConfig2={kernelName:Reverse2,gradFunc:(dy,saved,attrs)=>{let{dims}=attrs,axes=parseAxisParam2(dims,dy.shape);return{x:()=>reverse2(dy,axes)}}};var roundGradConfig2={kernelName:Round2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var rsqrtGradConfig2={kernelName:Rsqrt2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>neg2(div2(dy,mul2(pow2(x,1.5),2)))}}};var selectV2PoolGradConfig2={kernelName:SelectV22,inputsToSave:["condition"],gradFunc:(dy,saved)=>{let[condition]=saved;return{condition:()=>cast2(zerosLike3(condition),"float32"),t:()=>mul2(dy,cast2(condition,dy.dtype)),e:()=>mul2(dy,cast2(logicalNot3(condition),dy.dtype))}}};var seluGradConfig2={kernelName:Selu3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>{let mask=greater2(x,scalar2(0)),scaleAlpha2=scalar2(SELU_SCALEALPHA2),scale3=scalar2(SELU_SCALE2),greaterThanZeroDer=mul2(dy,scale3),lessEqualZeroDer=mul2(mul2(dy,scaleAlpha2),exp2(cast2(x,"float32")));return where2(mask,greaterThanZeroDer,lessEqualZeroDer)}}}};var sigmoidGradConfig2={kernelName:Sigmoid3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(dy,mul2(y,sub2(scalar2(1),y)))}}};var signGradConfig2={kernelName:Sign2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var sinGradConfig2={kernelName:Sin2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(cos2(cast2(x,"float32")),dy)}}};var sinhGradConfig2={kernelName:Sinh2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(cosh2(cast2(x,"float32")),dy)}}};var sliceGradConfig2={kernelName:Slice2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{begin,size}=attrs,inputShape=x.shape,[begin_,size_]=parseSliceParams2(x,begin,size),paddings=[];for(let i=0;ipad2(dy,paddings)}}};var softmaxGradConfig2={kernelName:Softmax4,outputsToSave:[!0],gradFunc:(dy,saved,attrs)=>{let[y]=saved,{dim}=attrs,keepDims=!0,dyTimesY=mul2(dy,y);return{logits:()=>sub2(dyTimesY,mul2(sum3(dyTimesY,[dim],keepDims),y))}}};var softplusGradConfig2={kernelName:Softplus3,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,sigmoid3(x))}}};var spaceToBatchNDGradConfig2={kernelName:SpaceToBatchND2,gradFunc:(dy,saved,attrs)=>{let{blockShape,paddings}=attrs;return{x:()=>batchToSpaceND2(dy,blockShape,paddings)}}};var splitVGradConfig2={kernelName:SplitV2,gradFunc:(dy,saved,attrs)=>{let{axis}=attrs;return{x:()=>concat2(dy,axis)}}};var sqrtGradConfig2={kernelName:Sqrt2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,mul2(sqrt2(cast2(x,"float32")),2))}}};var squareGradConfig2={kernelName:Square2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>mul2(dy,mul2(cast2(x,"float32"),2))}}};var squaredDifferenceGradConfig2={kernelName:SquaredDifference2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,two=scalar2(2),derA=()=>mul2(dy,mul2(two,sub2(a,b))),derB=()=>mul2(dy,mul2(two,sub2(b,a)));return{a:derA,b:derB}}};var stepGradConfig2={kernelName:Step2,gradFunc:dy=>({x:()=>zerosLike3(dy)})};var subGradConfig2={kernelName:Sub2,inputsToSave:["a","b"],gradFunc:(dy,saved)=>{let[a,b]=saved,outShape=assertAndGetBroadcastShape2(a.shape,b.shape),derA=()=>{let res=dy,reduceAxes=getReductionAxes2(a.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(res,a.shape)},derB=()=>{let res=dy,reduceAxes=getReductionAxes2(b.shape,outShape);return reduceAxes.length>0&&(res=sum3(res,reduceAxes)),reshape2(neg2(res),b.shape)};return{a:derA,b:derB}}};var sumGradConfig2={kernelName:Sum2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,expandedDyShape=x.shape.slice(),{axis}=attrs,axes=parseAxisParam2(axis,x.shape);axes.forEach(axis2=>{expandedDyShape[axis2]=1});let expandedDy=reshape2(dy,expandedDyShape),derX=mul2(expandedDy,ones4(x.shape,"float32"));return{x:()=>derX}}};var tanGradConfig2={kernelName:Tan2,inputsToSave:["x"],gradFunc:(dy,saved)=>{let[x]=saved;return{x:()=>div2(dy,square2(cos2(x)))}}};var tanhGradConfig2={kernelName:Tanh3,outputsToSave:[!0],gradFunc:(dy,saved)=>{let[y]=saved;return{x:()=>mul2(sub2(scalar2(1),square2(y)),dy)}}};var tileGradConfig2={kernelName:Tile2,inputsToSave:["x"],gradFunc:(dy,saved,attrs)=>{let[x]=saved,{reps}=attrs,derX=()=>{let xGrad=zerosLike3(x);if(x.rank===1)for(let i=0;i{let transposeAttrs=attrs,{perm}=transposeAttrs,undoPerm=getUndoAxesPermutation2(perm);return{x:()=>transpose2(dy,undoPerm)}}};var unpackGradConfig2={kernelName:Unpack2,gradFunc:(dy,saved,attrs)=>{let unpackAttrs=attrs,{axis}=unpackAttrs;return{value:()=>stack2(dy,axis)}}};var unsortedSegmentSumGradConfig2={kernelName:UnsortedSegmentSum2,inputsToSave:["segmentIds"],gradFunc:(dy,saved)=>{let[segmentIds]=saved,derX=()=>gatherDropNegatives2(dy,segmentIds);return{x:derX}}};function gatherDropNegatives2(x,indices){let zeroClippedIndices=maximum2(indices,zerosLike3(indices)),gathered=gather2(x,zeroClippedIndices),isPositive=greaterEqual2(indices,scalar2(0,"int32")),numIters=gathered.rank-isPositive.rank;for(let i=0;i({x:()=>zerosLike3(dy)})};var gradConfigs2=[absGradConfig2,acosGradConfig2,acoshGradConfig2,addGradConfig2,addNGradConfig2,argMaxGradConfig2,argMinGradConfig2,asinGradConfig2,asinhGradConfig2,atan2GradConfig2,atanGradConfig2,atanhGradConfig2,avgPool3DGradConfig2,avgPoolGradConfig2,batchMatMulGradConfig2,batchToSpaceNDGradConfig2,broadcastToGradConfig2,castGradConfig2,ceilGradConfig2,clipByValueGradConfig2,concatGradConfig2,conv2DBackpropInputGradConfig2,conv2DGradConfig2,conv3DGradConfig2,cosGradConfig2,coshGradConfig2,cumsumGradConfig2,depthwiseConv2dNativeGradConfig2,dilation2dGradConfig2,divGradConfig2,eluGradConfig2,erfGradConfig2,expGradConfig2,expm1GradConfig2,floorDivGradConfig2,floorGradConfig2,fusedBatchNormGradConfig2,gatherGradConfig2,greaterEqualGradConfig2,identityGradConfig2,isFiniteGradConfig2,isInfGradConfig2,isNanGradConfig2,log1pGradConfig2,logGradConfig2,logSoftmaxGradConfig2,lrnGradConfig2,maxGradConfig2,maxGradConfig2,maximumGradConfig2,maxPool3DGradConfig2,maxPoolGradConfig2,minGradConfig2,minimumGradConfig2,mirrorPadGradConfig2,modGradConfig2,multiplyGradConfig2,negateGradConfig2,oneHotGradConfig2,onesLikeGradConfig2,padV2GradConfig2,padV2GradConfig2,powGradConfig2,preluGradConfig2,reciprocalGradConfig2,relu6GradConfig2,reluGradConfig2,reshapeGradConfig2,resizeBilinearGradConfig2,resizeNearestNeighborGradConfig2,reverseGradConfig2,roundGradConfig2,rsqrtGradConfig2,selectV2PoolGradConfig2,seluGradConfig2,sigmoidGradConfig2,signGradConfig2,sinGradConfig2,sinhGradConfig2,sliceGradConfig2,softmaxGradConfig2,softplusGradConfig2,spaceToBatchNDGradConfig2,spaceToBatchNDGradConfig2,splitVGradConfig2,splitVGradConfig2,sqrtGradConfig2,squaredDifferenceGradConfig2,squareGradConfig2,stepGradConfig2,subGradConfig2,sumGradConfig2,tanGradConfig2,tanhGradConfig2,tileGradConfig2,transposeGradConfig2,unpackGradConfig2,unsortedSegmentSumGradConfig2,zerosLikeGradConfig2];for(let gradientConfig of gradConfigs2)registerGradient2(gradientConfig);Tensor2.prototype.abs=function(){return this.throwIfDisposed(),abs2(this)};Tensor2.prototype.acos=function(){return this.throwIfDisposed(),acos2(this)};Tensor2.prototype.acosh=function(){return this.throwIfDisposed(),acosh2(this)};Tensor2.prototype.addStrict=function(x){return this.throwIfDisposed(),addStrict2(this,x)};Tensor2.prototype.add=function(b){return this.throwIfDisposed(),add4(this,b)};Tensor2.prototype.all=function(axis,keepDims){return this.throwIfDisposed(),all2(this,axis,keepDims)};Tensor2.prototype.any=function(axis,keepDims){return this.throwIfDisposed(),any2(this,axis,keepDims)};Tensor2.prototype.argMax=function(axis){return this.throwIfDisposed(),argMax2(this,axis)};Tensor2.prototype.argMin=function(axis){return this.throwIfDisposed(),argMin2(this,axis)};Tensor2.prototype.asScalar=function(){return this.throwIfDisposed(),assert3(this.size===1,()=>"The array must have only 1 element."),reshape2(this,[])};Tensor2.prototype.asType=function(dtype){return this.throwIfDisposed(),cast2(this,dtype)};Tensor2.prototype.as1D=function(){return this.throwIfDisposed(),reshape2(this,[this.size])};Tensor2.prototype.as2D=function(rows,columns){return this.throwIfDisposed(),reshape2(this,[rows,columns])};Tensor2.prototype.as3D=function(rows,columns,depth){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth])};Tensor2.prototype.as4D=function(rows,columns,depth,depth2){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth,depth2])};Tensor2.prototype.as5D=function(rows,columns,depth,depth2,depth3){return this.throwIfDisposed(),reshape2(this,[rows,columns,depth,depth2,depth3])};Tensor2.prototype.asin=function(){return this.throwIfDisposed(),asin2(this)};Tensor2.prototype.asinh=function(){return this.throwIfDisposed(),asinh2(this)};Tensor2.prototype.atan=function(){return this.throwIfDisposed(),atan3(this)};Tensor2.prototype.atan2=function(b){return this.throwIfDisposed(),atan22(this,b)};Tensor2.prototype.atanh=function(){return this.throwIfDisposed(),atanh2(this)};Tensor2.prototype.avgPool=function(filterSize,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),avgPool5(this,filterSize,strides,pad7,dimRoundingMode)};Tensor2.prototype.batchToSpaceND=function(blockShape,crops){return this.throwIfDisposed(),batchToSpaceND2(this,blockShape,crops)};Tensor2.prototype.batchNorm=function(mean7,variance,offset,scale3,varianceEpsilon){return this.throwIfDisposed(),batchNorm4(this,mean7,variance,offset,scale3,varianceEpsilon)};Tensor2.prototype.broadcastTo=function(shape){return this.throwIfDisposed(),broadcastTo2(this,shape)};Tensor2.prototype.cast=function(dtype){return this.throwIfDisposed(),cast2(this,dtype)};Tensor2.prototype.ceil=function(){return this.throwIfDisposed(),ceil2(this)};Tensor2.prototype.clipByValue=function(min9,max11){return this.throwIfDisposed(),clipByValue2(this,min9,max11)};Tensor2.prototype.concat=function(x,axis){return this.throwIfDisposed(),x instanceof Tensor2&&(x=[x]),concat2([this,...x],axis)};Tensor2.prototype.conv1d=function(filter,stride,pad7,dataFormat,dilation,dimRoundingMode){return this.throwIfDisposed(),conv1d2(this,filter,stride,pad7,dataFormat,dilation,dimRoundingMode)};Tensor2.prototype.conv2dTranspose=function(filter,outputShape,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),conv2dTranspose3(this,filter,outputShape,strides,pad7,dimRoundingMode)};Tensor2.prototype.conv2d=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return this.throwIfDisposed(),conv2d2(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.cos=function(){return this.throwIfDisposed(),cos2(this)};Tensor2.prototype.cosh=function(){return this.throwIfDisposed(),cosh2(this)};Tensor2.prototype.cumsum=function(axis,exclusive,reverse8){return this.throwIfDisposed(),cumsum2(this,axis,exclusive,reverse8)};Tensor2.prototype.depthToSpace=function(blockSize,dataFormat){return this.throwIfDisposed(),depthToSpace3(this,blockSize,dataFormat)};Tensor2.prototype.depthwiseConv2D=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return deprecationWarn2("depthwiseConv2D is deprecated, use depthwiseConv2d instead"),this.throwIfDisposed(),depthwiseConv2d6(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.depthwiseConv2d=function(filter,strides,pad7,dataFormat,dilations,dimRoundingMode){return this.throwIfDisposed(),depthwiseConv2d6(this,filter,strides,pad7,dataFormat,dilations,dimRoundingMode)};Tensor2.prototype.dilation2d=function(filter,strides,pad7,dilations,dataFormat){return this.throwIfDisposed(),dilation2d2(this,filter,strides,pad7,dilations,dataFormat)};Tensor2.prototype.divNoNan=function(b){return this.throwIfDisposed(),divNoNan2(this,b)};Tensor2.prototype.divStrict=function(x){return this.throwIfDisposed(),divStrict2(this,x)};Tensor2.prototype.div=function(b){return this.throwIfDisposed(),div2(this,b)};Tensor2.prototype.dot=function(b){return this.throwIfDisposed(),dot2(this,b)};Tensor2.prototype.elu=function(){return this.throwIfDisposed(),elu2(this)};Tensor2.prototype.equalStrict=function(x){return this.throwIfDisposed(),equalStrict2(this,x)};Tensor2.prototype.equal=function(b){return this.throwIfDisposed(),equal2(this,b)};Tensor2.prototype.erf=function(){return this.throwIfDisposed(),erf2(this)};Tensor2.prototype.exp=function(){return this.throwIfDisposed(),exp2(this)};Tensor2.prototype.expandDims=function(axis){return this.throwIfDisposed(),expandDims3(this,axis)};Tensor2.prototype.expm1=function(){return this.throwIfDisposed(),expm12(this)};Tensor2.prototype.fft=function(){return this.throwIfDisposed(),fft2(this)};Tensor2.prototype.flatten=function(){return this.throwIfDisposed(),reshape2(this,[this.size])};Tensor2.prototype.floor=function(){return this.throwIfDisposed(),floor2(this)};Tensor2.prototype.floorDiv=function(b){return this.throwIfDisposed(),floorDiv2(this,b)};Tensor2.prototype.gather=function(indices,axis){return this.throwIfDisposed(),gather2(this,indices,axis)};Tensor2.prototype.greaterEqualStrict=function(x){return this.throwIfDisposed(),greaterEqualStrict2(this,x)};Tensor2.prototype.greaterEqual=function(b){return this.throwIfDisposed(),greaterEqual2(this,b)};Tensor2.prototype.greaterStrict=function(x){return this.throwIfDisposed(),greaterStrict2(this,x)};Tensor2.prototype.greater=function(b){return this.throwIfDisposed(),greater2(this,b)};Tensor2.prototype.ifft=function(){return this.throwIfDisposed(),ifft2(this)};Tensor2.prototype.irfft=function(){return this.throwIfDisposed(),irfft2(this)};Tensor2.prototype.isFinite=function(){return this.throwIfDisposed(),isFinite4(this)};Tensor2.prototype.isInf=function(){return this.throwIfDisposed(),isInf3(this)};Tensor2.prototype.isNaN=function(){return this.throwIfDisposed(),isNaN4(this)};Tensor2.prototype.leakyRelu=function(alpha){return this.throwIfDisposed(),leakyRelu2(this,alpha)};Tensor2.prototype.lessEqualStrict=function(x){return this.throwIfDisposed(),lessEqualStrict2(this,x)};Tensor2.prototype.lessEqual=function(b){return this.throwIfDisposed(),lessEqual2(this,b)};Tensor2.prototype.lessStrict=function(x){return this.throwIfDisposed(),lessStrict2(this,x)};Tensor2.prototype.less=function(b){return this.throwIfDisposed(),less2(this,b)};Tensor2.prototype.localResponseNormalization=function(depthRadius,bias,alpha,beta){return this.throwIfDisposed(),localResponseNormalization2(this,depthRadius,bias,alpha,beta)};Tensor2.prototype.logSigmoid=function(){return this.throwIfDisposed(),logSigmoid2(this)};Tensor2.prototype.logSoftmax=function(axis){return this.throwIfDisposed(),logSoftmax2(this,axis)};Tensor2.prototype.logSumExp=function(axis,keepDims){return this.throwIfDisposed(),logSumExp2(this,axis,keepDims)};Tensor2.prototype.log=function(){return this.throwIfDisposed(),log2(this)};Tensor2.prototype.log1p=function(){return this.throwIfDisposed(),log1p2(this)};Tensor2.prototype.logicalAnd=function(b){return this.throwIfDisposed(),logicalAnd2(this,b)};Tensor2.prototype.logicalNot=function(){return this.throwIfDisposed(),logicalNot3(this)};Tensor2.prototype.logicalOr=function(b){return this.throwIfDisposed(),logicalOr2(this,b)};Tensor2.prototype.logicalXor=function(b){return this.throwIfDisposed(),logicalXor2(this,b)};Tensor2.prototype.matMul=function(b,transposeA,transposeB){return this.throwIfDisposed(),matMul3(this,b,transposeA,transposeB)};Tensor2.prototype.maxPool=function(filterSize,strides,pad7,dimRoundingMode){return this.throwIfDisposed(),maxPool5(this,filterSize,strides,pad7,dimRoundingMode)};Tensor2.prototype.max=function(axis,keepDims){return this.throwIfDisposed(),max2(this,axis,keepDims)};Tensor2.prototype.maximumStrict=function(x){return this.throwIfDisposed(),maximumStrict2(this,x)};Tensor2.prototype.maximum=function(b){return this.throwIfDisposed(),maximum2(this,b)};Tensor2.prototype.mean=function(axis,keepDims){return this.throwIfDisposed(),mean2(this,axis,keepDims)};Tensor2.prototype.min=function(axis,keepDims){return this.throwIfDisposed(),min2(this,axis,keepDims)};Tensor2.prototype.minimumStrict=function(x){return this.throwIfDisposed(),minimumStrict2(this,x)};Tensor2.prototype.minimum=function(b){return this.throwIfDisposed(),minimum2(this,b)};Tensor2.prototype.mirrorPad=function(paddings,mode){return this.throwIfDisposed(),mirrorPad3(this,paddings,mode)};Tensor2.prototype.modStrict=function(x){return this.throwIfDisposed(),modStrict2(this,x)};Tensor2.prototype.mod=function(b){return this.throwIfDisposed(),mod2(this,b)};Tensor2.prototype.mulStrict=function(x){return this.throwIfDisposed(),mulStrict2(this,x)};Tensor2.prototype.mul=function(b){return this.throwIfDisposed(),mul2(this,b)};Tensor2.prototype.neg=function(){return this.throwIfDisposed(),neg2(this)};Tensor2.prototype.norm=function(ord,axis,keepDims){return this.throwIfDisposed(),norm2(this,ord,axis,keepDims)};Tensor2.prototype.notEqualStrict=function(x){return this.throwIfDisposed(),notEqualStrict2(this,x)};Tensor2.prototype.notEqual=function(b){return this.throwIfDisposed(),notEqual4(this,b)};Tensor2.prototype.oneHot=function(depth,onValue=1,offValue=0){return this.throwIfDisposed(),oneHot3(this,depth,onValue,offValue)};Tensor2.prototype.onesLike=function(){return this.throwIfDisposed(),onesLike3(this)};Tensor2.prototype.pad=function(paddings,constantValue){return this.throwIfDisposed(),pad2(this,paddings,constantValue)};Tensor2.prototype.pool=function(windowShape,poolingType,padding,dilationRate,strides){return this.throwIfDisposed(),pool2(this,windowShape,poolingType,padding,dilationRate,strides)};Tensor2.prototype.powStrict=function(exp14){return this.throwIfDisposed(),powStrict2(this,exp14)};Tensor2.prototype.pow=function(exp14){return this.throwIfDisposed(),pow2(this,exp14)};Tensor2.prototype.prelu=function(alpha){return this.throwIfDisposed(),prelu2(this,alpha)};Tensor2.prototype.prod=function(axis,keepDims){return this.throwIfDisposed(),prod2(this,axis,keepDims)};Tensor2.prototype.reciprocal=function(){return this.throwIfDisposed(),reciprocal2(this)};Tensor2.prototype.relu=function(){return this.throwIfDisposed(),relu2(this)};Tensor2.prototype.relu6=function(){return this.throwIfDisposed(),relu62(this)};Tensor2.prototype.reshapeAs=function(x){return this.throwIfDisposed(),reshape2(this,x.shape)};Tensor2.prototype.reshape=function(shape){return this.throwIfDisposed(),reshape2(this,shape)};Tensor2.prototype.resizeBilinear=function(newShape2D,alignCorners){return this.throwIfDisposed(),resizeBilinear3(this,newShape2D,alignCorners)};Tensor2.prototype.resizeNearestNeighbor=function(newShape2D,alignCorners){return this.throwIfDisposed(),resizeNearestNeighbor2(this,newShape2D,alignCorners)};Tensor2.prototype.reverse=function(axis){return this.throwIfDisposed(),reverse2(this,axis)};Tensor2.prototype.rfft=function(){return this.throwIfDisposed(),rfft2(this)};Tensor2.prototype.round=function(){return this.throwIfDisposed(),round3(this)};Tensor2.prototype.rsqrt=function(){return this.throwIfDisposed(),rsqrt2(this)};Tensor2.prototype.selu=function(){return this.throwIfDisposed(),selu2(this)};Tensor2.prototype.separableConv2d=function(depthwiseFilter,pointwiseFilter,strides,pad7,dilation,dataFormat){return this.throwIfDisposed(),separableConv2d3(this,depthwiseFilter,pointwiseFilter,strides,pad7,dilation,dataFormat)};Tensor2.prototype.sigmoid=function(){return this.throwIfDisposed(),sigmoid3(this)};Tensor2.prototype.sign=function(){return this.throwIfDisposed(),sign2(this)};Tensor2.prototype.sin=function(){return this.throwIfDisposed(),sin2(this)};Tensor2.prototype.sinh=function(){return this.throwIfDisposed(),sinh2(this)};Tensor2.prototype.slice=function(begin,size){return this.throwIfDisposed(),slice2(this,begin,size)};Tensor2.prototype.softmax=function(dim){return this.throwIfDisposed(),softmax2(this,dim)};Tensor2.prototype.softplus=function(){return this.throwIfDisposed(),softplus2(this)};Tensor2.prototype.spaceToBatchND=function(blockShape,paddings){return this.throwIfDisposed(),spaceToBatchND3(this,blockShape,paddings)};Tensor2.prototype.split=function(numOrSizeSplits,axis){return this.throwIfDisposed(),split2(this,numOrSizeSplits,axis)};Tensor2.prototype.sqrt=function(){return this.throwIfDisposed(),sqrt2(this)};Tensor2.prototype.square=function(){return this.throwIfDisposed(),square2(this)};Tensor2.prototype.squaredDifference=function(b){return this.throwIfDisposed(),squaredDifference4(this,b)};Tensor2.prototype.squaredDifferenceStrict=function(x){return this.throwIfDisposed(),squaredDifferenceStrict2(this,x)};Tensor2.prototype.squeeze=function(axis){return this.throwIfDisposed(),squeeze2(this,axis)};Tensor2.prototype.stack=function(x,axis){this.throwIfDisposed();let tensorsToBeStacked=x instanceof Tensor2?[this,x]:[this,...x];return stack2(tensorsToBeStacked,axis)};Tensor2.prototype.step=function(alpha){return this.throwIfDisposed(),step2(this,alpha)};Tensor2.prototype.stridedSlice=function(begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask){return this.throwIfDisposed(),stridedSlice3(this,begin,end,strides,beginMask,endMask,ellipsisMask,newAxisMask,shrinkAxisMask)};Tensor2.prototype.subStrict=function(x){return this.throwIfDisposed(),subStrict2(this,x)};Tensor2.prototype.sub=function(b){return this.throwIfDisposed(),sub2(this,b)};Tensor2.prototype.sum=function(axis,keepDims){return this.throwIfDisposed(),sum3(this,axis,keepDims)};Tensor2.prototype.tan=function(){return this.throwIfDisposed(),tan2(this)};Tensor2.prototype.tanh=function(){return this.throwIfDisposed(),tanh3(this)};Tensor2.prototype.tile=function(reps){return this.throwIfDisposed(),tile2(this,reps)};Tensor2.prototype.toBool=function(){return this.throwIfDisposed(),cast2(this,"bool")};Tensor2.prototype.toFloat=function(){return this.throwIfDisposed(),cast2(this,"float32")};Tensor2.prototype.toInt=function(){return this.throwIfDisposed(),cast2(this,"int32")};Tensor2.prototype.topk=function(k,sorted){return this.throwIfDisposed(),topk2(this,k,sorted)};Tensor2.prototype.transpose=function(perm){return this.throwIfDisposed(),transpose2(this,perm)};Tensor2.prototype.unique=function(axis){return this.throwIfDisposed(),unique2(this,axis)};Tensor2.prototype.unsortedSegmentSum=function(segmentIds,numSegments){return this.throwIfDisposed(),unsortedSegmentSum2(this,segmentIds,numSegments)};Tensor2.prototype.unstack=function(axis){return this.throwIfDisposed(),unstack2(this,axis)};Tensor2.prototype.where=function(condition,x){return this.throwIfDisposed(),where2(condition,this,x)};Tensor2.prototype.zerosLike=function(){return this.throwIfDisposed(),zerosLike3(this)};function imageToSquare(input2,inputSize,centerImage=!1){let{Image,Canvas}=env2.getEnv();if(!(input2 instanceof Image||input2 instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input2),scale3=inputSize/Math.max(dims.height,dims.width),width=scale3*dims.width,height=scale3*dims.height,targetCanvas=createCanvas2({width:inputSize,height:inputSize}),inputCanvas=input2 instanceof Canvas?input2:createCanvasFromMedia(input2),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input2)){this._imageTensors[idx]=input2,this._inputDimensions[idx]=input2.shape;return}if(isTensor4D(input2)){let batchSize=input2.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input2,this._inputDimensions[idx]=input2.shape.slice(1);return}let canvas=input2 instanceof env2.getEnv().Canvas?input2:createCanvasFromMedia(input2);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range2(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tidy2(()=>{let inputTensors=range2(this.batchSize,0,1).map(batchIdx=>{let input2=this.getInput(batchIdx);if(input2 instanceof Tensor2){let imgTensor=isTensor4D(input2)?input2:input2.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=image2.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input2 instanceof env2.getEnv().Canvas)return browser_exports2.fromPixels(imageToSquare(input2,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input2}`)}),batchTensor=stack2(inputTensors.map(t=>cast2(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input2,i)=>{if(!isMediaElement(input2)&&!isTensor3D(input2)&&!isTensor4D(input2))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input2)){let batchSize=input2.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input2=>isMediaElement(input2)&&awaitMediaLoaded(input2))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input2,detections){let{Canvas}=env2.getEnv(),canvas=input2;if(!(input2 instanceof Canvas)){let netInput=await toNetInput(input2);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas2({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init2){let fetch3=env2.getEnv().fetch,res=await fetch3(url,init2);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return io_exports.loadWeights(manifest,modelBaseUri)}function matchDimensions(input2,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input2.width=width,input2.height=height,{width,height}}var NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor163){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor163}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor163})=>{this.reassignParamFromPath(path,tensor163.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable4})=>{let tensor163=tensor4(variable4.dataSync());variable4.dispose(),this.reassignParamFromPath(path,tensor163)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor163})=>Array.from(tensor163.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env2.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights2=io_exports.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights2(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}};function depthwiseSeparableConv(x,params,stride){return tidy(()=>{let out=separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=add2(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tidy(()=>{let out1=relu(isFirstLayer?add2(conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=relu(add2(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return relu(add2(out1,add2(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tidy(()=>{let out1=relu(isFirstLayer?add2(conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=relu(add2(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=relu(add2(out1,add2(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return relu(add2(out1,add2(out2,add2(out3,out4))))})}function convLayer(x,params,padding="same",withRelu=!1){return tidy(()=>{let out=add2(conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor163=weightMap[originalPath];if(!isTensor(tensor163,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor163}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor163}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input2){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}};function fullyConnectedLayer(x,params){return tidy(()=>add2(matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input2){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tidy(()=>{let bottleneckFeatures=input2 instanceof NetInput?this.faceFeatureExtractor.forwardInput(input2):input2;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input2){return tidy(()=>softmax(this.runNet(input2)))}async forward(input2){return this.forwardInput(await toNetInput(input2))}async predictExpressions(input2){let netInput=await toNetInput(input2),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round2(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range2(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range2(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return add2(conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(relu(out),params.separable_conv1,[1,1]),out=maxPool(out,[3,3],[2,2],"same"),out=add2(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(relu(out),params.separable_conv2,[1,1]),out=add2(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input2){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(256)),out=relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range2(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input2){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tidy(()=>{let bottleneckFeatures=input2 instanceof NetInput?this.faceFeatureExtractor.forwardInput(input2):input2,pooled=avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input2){return tidy(()=>{let{age,gender}=this.runNet(input2);return{age,gender:softmax(gender)}})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async predictAgeAndGender(input2){let netInput=await toNetInput(input2),out=await this.forwardInput(netInput),ages=unstack(out.age),genders=unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale3=inputSize/Math.max(height,width);return{width:width*scale3,height:height*scale3}}),batchSize=inputDimensions.length;return tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>stack([fill([68],fillX,"float32"),fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding2=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding2(batchIdx,(w,h)=>wgetPadding2(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input2){return tidy(()=>{let out=this.runNet(input2);return this.postProcess(out,input2.inputSize,input2.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async detectLandmarks(input2){let netInput=await toNetInput(input2),landmarkTensors=tidy(()=>unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven2(i)),yCoords=landmarksArray.filter((_,i)=>!isEven2(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input2){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input2){return this.forwardInput(await toNetInput(input2))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};function scale2(x,params){return add2(mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=conv2d(x,filters,strides,padding);return out=add2(out,bias),out=scale2(out,params.scale),withRelu?relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tidy(()=>transpose(tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tensor1d(extractWeights(numWeights)),biases=tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale3=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale3}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tidy(()=>transpose(tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale3=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale3}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=add2(out,x),out=relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=avgPool(x,2,2,"valid"),zeros10=zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=zeros(padShapeX);out=concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=zeros(padShapeY);out=concat([out,zerosH],2)}return pooled=isPad?concat([pooled,zeros10],3):pooled,out=add2(pooled,out),out=relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input2){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(scalar(256)),out=convDown(normalized,params.conv32_down);out=maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=matMul(globalAvg,params.fc);return fullyConnected})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async computeFaceDescriptor(input2){let netInput=await toNetInput(input2),faceDescriptorTensors=tidy(()=>unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tensor1d(extractWeights(numChannels)),batch_norm_offset=tensor1d(extractWeights(numChannels)),batch_norm_mean=tensor1d(extractWeights(numChannels)),batch_norm_variance=tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function pointwiseConvLayer(x,params,strides){return tidy(()=>{let out=conv2d(x,params.filters,strides,"same");return out=add2(out,params.batch_norm_offset),clipByValue(out,0,6)})}var epsilon3=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tidy(()=>{let out=depthwiseConv2d(x,params.filters,strides,"same");return out=batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon3),clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression4(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function getCenterCoordinatesAndSizesLayer(x){let vec=unstack(transpose(x,[1,0])),sizes=[sub(vec[2],vec[0]),sub(vec[3],vec[1])],centers=[add2(vec[0],div(sizes[0],scalar(2))),add2(vec[1],div(sizes[1],scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=unstack(transpose(x1,[1,0])),div0_out=div(mul(exp(div(vec[2],scalar(5))),sizes[0]),scalar(2)),add0_out=add2(mul(div(vec[0],scalar(10)),sizes[0]),centers[0]),div1_out=div(mul(exp(div(vec[3],scalar(5))),sizes[1]),scalar(2)),add1_out=add2(mul(div(vec[1],scalar(10)),sizes[1]),centers[1]);return transpose(stack([sub(add0_out,div0_out),sub(add1_out,div1_out),add2(add0_out,div0_out),add2(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(reshape(tile(params.extra_dim,[batchSize,1,1]),[-1,4]),reshape(boxPredictions,[-1,4]));boxes=reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=sigmoid(slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=unstack(boxes),scoresByBatch=unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}function boxPredictionLayer(x,params){return tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input2){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(512,!1),"float32"),x=sub(mul(batchTensor,scalar(.007843137718737125)),scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input2){return this.forwardInput(await toNetInput(input2))}async locateFaces(input2,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input2),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression4(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME2="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",isNumber3=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber3(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber3(a.x)&&isNumber3(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber3)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}function leaky(x){return tidy(()=>{let min9=mul(x,scalar(.10000000149011612));return add2(relu(sub(x,min9)),min9)})}function convWithBatchNorm(x,params){return tidy(()=>{let out=pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=conv2d(out,params.conv.filters,[1,1],"valid"),out=sub(out,params.bn.sub),out=mul(out,params.bn.truediv),out=add2(out,params.conv.bias),leaky(out)})}function depthwiseSeparableConv3(x,params){return tidy(()=>{let out=pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=add2(out,params.bias),leaky(out)})}function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub30=tensor1d(extractWeights(size)),truediv=tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub30,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub30=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub30,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input2,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tidy(()=>{let batchTensor=cast(input2.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input2,inputSize){return await this.forwardInput(await toNetInput(input2),inputSize)}async detect(input2,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input2),out=await this.forwardInput(netInput,inputSize),out0=tidy(()=>unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression2(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid2(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid2(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max11,curr)=>max11.classScore>curr.classScore?max11:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input2,forwardParams){let objectDetections=await this.detect(input2,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME2}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function extractAllFacesAndComputeResults(parentResults,input2,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input2 instanceof Tensor?await extractFaceTensors(input2,faceBoxes):await extractFaces(input2,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input2,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input2,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input2,forwardParams){let objectDetections=await this.detect(input2,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input2,options)=>nets.ssdMobilenetv1.locateFaces(input2,options),tinyFaceDetector=(input2,options)=>nets.tinyFaceDetector.locateFaces(input2,options),tinyYolov23=(input2,options)=>nets.tinyYolov2.locateFaces(input2,options),detectFaceLandmarks=input2=>nets.faceLandmark68Net.detectLandmarks(input2),detectFaceLandmarksTiny=input2=>nets.faceLandmark68TinyNet.detectLandmarks(input2),computeFaceDescriptor=input2=>nets.faceRecognitionNet.computeFaceDescriptor(input2),recognizeFaceExpressions=input2=>nets.faceExpressionNet.predictExpressions(input2),predictAgeAndGender=input2=>nets.ageGenderNet.predictAgeAndGender(input2),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input2,extractedFaces){super();this.parentTask=parentTask;this.input=input2;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input2,extractedFaces){super();this.parentTask=parentTask;this.input=input2;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input2){super();this.parentTask=parentTask;this.input=input2}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input2,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input2;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input2,options=new SsdMobilenetv1Options){super();this.input=input2;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input:input2,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input3=>nets.tinyFaceDetector.locateFaces(input3,options):options instanceof SsdMobilenetv1Options?input3=>nets.ssdMobilenetv1.locateFaces(input3,options):options instanceof TinyYolov2Options?input3=>nets.tinyYolov2.locateFaces(input3,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input2)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input2,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input2,options)}function detectAllFaces(input2,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input2,options)}async function allFacesSsdMobilenetv1(input2,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input2,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input2,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input2,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count2=1,createUniqueLabel=()=>`person ${count2++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json18){let labeledDescriptors=json18.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json18.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version3="0.9.1",node=typeof process!="undefined",browser=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version4={faceapi:version3,node,browser};return src_exports;})(); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/face-api.json b/dist/face-api.json index 7043a0d..32973d5 100644 --- a/dist/face-api.json +++ b/dist/face-api.json @@ -13201,7 +13201,7 @@ ] }, "package.json": { - "bytes": 1409, + "bytes": 1352, "imports": [] }, "src/index.ts": { diff --git a/dist/face-api.node-gpu.js b/dist/face-api.node-gpu.js index 4fbf9b6..20ada95 100644 --- a/dist/face-api.node-gpu.js +++ b/dist/face-api.node-gpu.js @@ -5,5 +5,5 @@ author: ' */ -var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__markAsModule=target=>__defProp(target,"__esModule",{value:!0}),__commonJS=(callback,module2)=>()=>(module2||(module2={exports:{}},callback(module2.exports,module2)),module2.exports),__export=(target,all)=>{__markAsModule(target);for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__exportStar=(target,module2,desc)=>{if(__markAsModule(target),module2&&typeof module2=="object"||typeof module2=="function")for(let key of __getOwnPropNames(module2))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module2[key],enumerable:!(desc=__getOwnPropDesc(module2,key))||desc.enumerable});return target},__toModule=module2=>module2&&module2.__esModule?module2:__exportStar(__defProp(module2!=null?__create(__getProtoOf(module2)):{},"default",{value:module2,enumerable:!0}),module2),require_tfjs_esm=__commonJS(exports2=>{var __create2=Object.create,__defProp2=Object.defineProperty,__getProtoOf2=Object.getPrototypeOf,__hasOwnProp2=Object.prototype.hasOwnProperty,__getOwnPropNames2=Object.getOwnPropertyNames,__getOwnPropDesc2=Object.getOwnPropertyDescriptor,__markAsModule2=target=>__defProp2(target,"__esModule",{value:!0}),__exportStar2=(target,module22,desc)=>{if(__markAsModule2(target),module22&&typeof module22=="object"||typeof module22=="function")for(let key of __getOwnPropNames2(module22))!__hasOwnProp2.call(target,key)&&key!=="default"&&__defProp2(target,key,{get:()=>module22[key],enumerable:!(desc=__getOwnPropDesc2(module22,key))||desc.enumerable});return target},__toModule2=module22=>module22&&module22.__esModule?module22:__exportStar2(__defProp2(module22!=null?__create2(__getProtoOf2(module22)):{},"default",{value:module22,enumerable:!0}),module22);__exportStar2(exports2,__toModule2(require("@tensorflow/tfjs-node-gpu")))}),require_isNodejs=__commonJS((exports2,module2)=>{__export(exports2,{isNodejs:()=>isNodejs3});function isNodejs3(){return typeof global=="object"&&!0&&typeof module2!="undefined"&&typeof process!="undefined"&&!!process.version}});__export(exports,{AgeGenderNet:()=>AgeGenderNet,BoundingBox:()=>BoundingBox,Box:()=>Box,ComposableTask:()=>ComposableTask,ComputeAllFaceDescriptorsTask:()=>ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase:()=>ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask:()=>ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask:()=>DetectAllFaceLandmarksTask,DetectAllFacesTask:()=>DetectAllFacesTask,DetectFaceLandmarksTaskBase:()=>DetectFaceLandmarksTaskBase,DetectFacesTaskBase:()=>DetectFacesTaskBase,DetectSingleFaceLandmarksTask:()=>DetectSingleFaceLandmarksTask,DetectSingleFaceTask:()=>DetectSingleFaceTask,Dimensions:()=>Dimensions,FACE_EXPRESSION_LABELS:()=>FACE_EXPRESSION_LABELS,FaceDetection:()=>FaceDetection,FaceDetectionNet:()=>FaceDetectionNet,FaceExpressionNet:()=>FaceExpressionNet,FaceExpressions:()=>FaceExpressions,FaceLandmark68Net:()=>FaceLandmark68Net,FaceLandmark68TinyNet:()=>FaceLandmark68TinyNet,FaceLandmarkNet:()=>FaceLandmarkNet,FaceLandmarks:()=>FaceLandmarks,FaceLandmarks5:()=>FaceLandmarks5,FaceLandmarks68:()=>FaceLandmarks68,FaceMatch:()=>FaceMatch,FaceMatcher:()=>FaceMatcher,FaceRecognitionNet:()=>FaceRecognitionNet,Gender:()=>Gender,LabeledBox:()=>LabeledBox,LabeledFaceDescriptors:()=>LabeledFaceDescriptors,NetInput:()=>NetInput,NeuralNetwork:()=>NeuralNetwork,ObjectDetection:()=>ObjectDetection,Point:()=>Point,PredictedBox:()=>PredictedBox,Rect:()=>Rect,SsdMobilenetv1:()=>SsdMobilenetv1,SsdMobilenetv1Options:()=>SsdMobilenetv1Options,TinyFaceDetector:()=>TinyFaceDetector,TinyFaceDetectorOptions:()=>TinyFaceDetectorOptions,TinyYolov2:()=>TinyYolov2,TinyYolov2Options:()=>TinyYolov2Options,TinyYolov2SizeType:()=>TinyYolov2SizeType,allFaces:()=>allFaces,allFacesSsdMobilenetv1:()=>allFacesSsdMobilenetv1,allFacesTinyYolov2:()=>allFacesTinyYolov2,awaitMediaLoaded:()=>awaitMediaLoaded,bufferToImage:()=>bufferToImage,computeFaceDescriptor:()=>computeFaceDescriptor,createCanvas:()=>createCanvas,createCanvasFromMedia:()=>createCanvasFromMedia,createFaceDetectionNet:()=>createFaceDetectionNet,createFaceRecognitionNet:()=>createFaceRecognitionNet,createSsdMobilenetv1:()=>createSsdMobilenetv1,createTinyFaceDetector:()=>createTinyFaceDetector,createTinyYolov2:()=>createTinyYolov2,detectAllFaces:()=>detectAllFaces,detectFaceLandmarks:()=>detectFaceLandmarks,detectFaceLandmarksTiny:()=>detectFaceLandmarksTiny,detectLandmarks:()=>detectLandmarks,detectSingleFace:()=>detectSingleFace,draw:()=>draw_exports,env:()=>env,euclideanDistance:()=>euclideanDistance,extendWithAge:()=>extendWithAge,extendWithFaceDescriptor:()=>extendWithFaceDescriptor,extendWithFaceDetection:()=>extendWithFaceDetection,extendWithFaceExpressions:()=>extendWithFaceExpressions,extendWithFaceLandmarks:()=>extendWithFaceLandmarks,extendWithGender:()=>extendWithGender,extractFaceTensors:()=>extractFaceTensors,extractFaces:()=>extractFaces,fetchImage:()=>fetchImage,fetchJson:()=>fetchJson,fetchNetWeights:()=>fetchNetWeights,fetchOrThrow:()=>fetchOrThrow,getContext2dOrThrow:()=>getContext2dOrThrow,getMediaDimensions:()=>getMediaDimensions,imageTensorToCanvas:()=>imageTensorToCanvas,imageToSquare:()=>imageToSquare,inverseSigmoid:()=>inverseSigmoid,iou:()=>iou,isMediaElement:()=>isMediaElement,isMediaLoaded:()=>isMediaLoaded,isWithAge:()=>isWithAge,isWithFaceDetection:()=>isWithFaceDetection,isWithFaceExpressions:()=>isWithFaceExpressions,isWithFaceLandmarks:()=>isWithFaceLandmarks,isWithGender:()=>isWithGender,loadAgeGenderModel:()=>loadAgeGenderModel,loadFaceDetectionModel:()=>loadFaceDetectionModel,loadFaceExpressionModel:()=>loadFaceExpressionModel,loadFaceLandmarkModel:()=>loadFaceLandmarkModel,loadFaceLandmarkTinyModel:()=>loadFaceLandmarkTinyModel,loadFaceRecognitionModel:()=>loadFaceRecognitionModel,loadSsdMobilenetv1Model:()=>loadSsdMobilenetv1Model,loadTinyFaceDetectorModel:()=>loadTinyFaceDetectorModel,loadTinyYolov2Model:()=>loadTinyYolov2Model,loadWeightMap:()=>loadWeightMap,locateFaces:()=>locateFaces,matchDimensions:()=>matchDimensions,minBbox:()=>minBbox,nets:()=>nets,nonMaxSuppression:()=>nonMaxSuppression,normalize:()=>normalize,padToSquare:()=>padToSquare,predictAgeAndGender:()=>predictAgeAndGender,recognizeFaceExpressions:()=>recognizeFaceExpressions,resizeResults:()=>resizeResults,resolveInput:()=>resolveInput,shuffleArray:()=>shuffleArray,sigmoid:()=>sigmoid,ssdMobilenetv1:()=>ssdMobilenetv1,tf:()=>tf42,tinyFaceDetector:()=>tinyFaceDetector,tinyYolov2:()=>tinyYolov23,toNetInput:()=>toNetInput,utils:()=>utils_exports,validateConfig:()=>validateConfig,version:()=>version2});var tf42=__toModule(require_tfjs_esm()),draw_exports={};__export(draw_exports,{AnchorPosition:()=>AnchorPosition,DrawBox:()=>DrawBox,DrawBoxOptions:()=>DrawBoxOptions,DrawFaceLandmarks:()=>DrawFaceLandmarks,DrawFaceLandmarksOptions:()=>DrawFaceLandmarksOptions,DrawTextField:()=>DrawTextField,DrawTextFieldOptions:()=>DrawTextFieldOptions,drawContour:()=>drawContour,drawDetections:()=>drawDetections,drawFaceExpressions:()=>drawFaceExpressions,drawFaceLandmarks:()=>drawFaceLandmarks});function drawContour(ctx,points,isClosed=!1){if(ctx.beginPath(),points.slice(1).forEach(({x,y},prevIdx)=>{let from=points[prevIdx];ctx.moveTo(from.x,from.y),ctx.lineTo(x,y)}),isClosed){let from=points[points.length-1],to=points[0];if(!from||!to)return;ctx.moveTo(from.x,from.y),ctx.lineTo(to.x,to.y)}ctx.stroke()}var utils_exports={};__export(utils_exports,{computeReshapedDimensions:()=>computeReshapedDimensions,getCenterPoint:()=>getCenterPoint,isDimensions:()=>isDimensions,isEven:()=>isEven,isFloat:()=>isFloat,isTensor:()=>isTensor,isTensor1D:()=>isTensor1D,isTensor2D:()=>isTensor2D,isTensor3D:()=>isTensor3D,isTensor4D:()=>isTensor4D,isValidNumber:()=>isValidNumber,isValidProbablitiy:()=>isValidProbablitiy,range:()=>range,round:()=>round});var tf=__toModule(require_tfjs_esm()),Dimensions=class{constructor(width,height){if(!isValidNumber(width)||!isValidNumber(height))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width,height})}`);this._width=width,this._height=height}get width(){return this._width}get height(){return this._height}reverse(){return new Dimensions(1/this.width,1/this.height)}};function isTensor(tensor2,dim){return tensor2 instanceof tf.Tensor&&tensor2.shape.length===dim}function isTensor1D(tensor2){return isTensor(tensor2,1)}function isTensor2D(tensor2){return isTensor(tensor2,2)}function isTensor3D(tensor2){return isTensor(tensor2,3)}function isTensor4D(tensor2){return isTensor(tensor2,4)}function isFloat(num){return num%1!==0}function isEven(num){return num%2===0}function round(num,prec=2){let f=Math.pow(10,prec);return Math.floor(num*f)/f}function isDimensions(obj){return obj&&obj.width&&obj.height}function computeReshapedDimensions({width,height},inputSize){let scale2=inputSize/Math.max(height,width);return new Dimensions(Math.round(width*scale2),Math.round(height*scale2))}function getCenterPoint(pts){return pts.reduce((sum,pt)=>sum.add(pt),new Point(0,0)).div(new Point(pts.length,pts.length))}function range(num,start,step){return Array(num).fill(0).map((_,i)=>start+i*step)}function isValidNumber(num){return!!num&&num!==Infinity&&num!==-Infinity&&!isNaN(num)||num===0}function isValidProbablitiy(num){return isValidNumber(num)&&0<=num&&num<=1}var Point=class{constructor(x,y){this._x=x,this._y=y}get x(){return this._x}get y(){return this._y}add(pt){return new Point(this.x+pt.x,this.y+pt.y)}sub(pt){return new Point(this.x-pt.x,this.y-pt.y)}mul(pt){return new Point(this.x*pt.x,this.y*pt.y)}div(pt){return new Point(this.x/pt.x,this.y/pt.y)}abs(){return new Point(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))}floor(){return new Point(Math.floor(this.x),Math.floor(this.y))}},Box=class{static isRect(rect){return!!rect&&[rect.x,rect.y,rect.width,rect.height].every(isValidNumber)}static assertIsValidBox(box,callee,allowNegativeDimensions=!1){if(!Box.isRect(box))throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);if(!allowNegativeDimensions&&(box.width<0||box.height<0))throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`)}constructor(_box,allowNegativeDimensions=!0){let box=_box||{},isBbox=[box.left,box.top,box.right,box.bottom].every(isValidNumber),isRect=[box.x,box.y,box.width,box.height].every(isValidNumber);if(!isRect&&!isBbox)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);let[x,y,width,height]=isRect?[box.x,box.y,box.width,box.height]:[box.left,box.top,box.right-box.left,box.bottom-box.top];Box.assertIsValidBox({x,y,width,height},"Box.constructor",allowNegativeDimensions),this._x=x,this._y=y,this._width=width,this._height=height}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Point(this.left,this.top)}get topRight(){return new Point(this.right,this.top)}get bottomLeft(){return new Point(this.left,this.bottom)}get bottomRight(){return new Point(this.right,this.bottom)}round(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.round(val));return new Box({x,y,width,height})}floor(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.floor(val));return new Box({x,y,width,height})}toSquare(){let{x,y,width,height}=this,diff=Math.abs(width-height);return widthimageWidth&&(edx=-ex+imageWidth+w,ex=imageWidth),ey>imageHeight&&(edy=-ey+imageHeight+h,ey=imageHeight),x<1&&(edy=2-x,x=1),y<1&&(edy=2-y,y=1),{dy,edy,dx,edx,y,ey,x,ex,w,h}}calibrate(region){return new Box({left:this.left+region.left*this.width,top:this.top+region.top*this.height,right:this.right+region.right*this.width,bottom:this.bottom+region.bottom*this.height}).toSquare().round()}},BoundingBox=class extends Box{constructor(left,top,right,bottom,allowNegativeDimensions=!1){super({left,top,right,bottom},allowNegativeDimensions)}};var ObjectDetection=class{constructor(score,classScore,className,relativeBox,imageDims){this._imageDims=new Dimensions(imageDims.width,imageDims.height),this._score=score,this._classScore=classScore,this._className=className,this._box=new Box(relativeBox).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new Box(this._box).rescale(this.imageDims.reverse())}forSize(width,height){return new ObjectDetection(this.score,this.classScore,this.className,this.relativeBox,{width,height})}},FaceDetection=class extends ObjectDetection{constructor(score,relativeBox,imageDims){super(score,score,"",relativeBox,imageDims)}forSize(width,height){let{score,relativeBox,imageDims}=super.forSize(width,height);return new FaceDetection(score,relativeBox,imageDims)}};function iou(box1,box2,isIOU=!0){let width=Math.max(0,Math.min(box1.right,box2.right)-Math.max(box1.left,box2.left)),height=Math.max(0,Math.min(box1.bottom,box2.bottom)-Math.max(box1.top,box2.top)),interSection=width*height;return isIOU?interSection/(box1.area+box2.area-interSection):interSection/Math.min(box1.area,box2.area)}function minBbox(pts){let xs=pts.map(pt=>pt.x),ys=pts.map(pt=>pt.y),minX=xs.reduce((min,x)=>xymaxmax({score,boxIndex})).sort((c1,c2)=>c1.score-c2.score).map(c=>c.boxIndex),pick=[];for(;indicesSortedByScore.length>0;){let curr=indicesSortedByScore.pop();pick.push(curr);let indices=indicesSortedByScore,outputs=[];for(let i=0;ioutputs[j]<=iouThreshold)}return pick}var tf2=__toModule(require_tfjs_esm());function normalize(x,meanRgb){return tf2.tidy(()=>{let[r,g,b]=meanRgb,avg_r=tf2.fill([...x.shape.slice(0,3),1],r,"float32"),avg_g=tf2.fill([...x.shape.slice(0,3),1],g,"float32"),avg_b=tf2.fill([...x.shape.slice(0,3),1],b,"float32"),avg_rgb=tf2.concat([avg_r,avg_g,avg_b],3);return tf2.sub(x,avg_rgb)})}var tf3=__toModule(require_tfjs_esm());function padToSquare(imgTensor,isCenterImage=!1){return tf3.tidy(()=>{let[height,width]=imgTensor.shape.slice(1);if(height===width)return imgTensor;let dimDiff=Math.abs(height-width),paddingAmount=Math.round(dimDiff*(isCenterImage?.5:1)),paddingAxis=height>width?2:1,createPaddingTensor=paddingAmount2=>{let paddingTensorShape=imgTensor.shape.slice();return paddingTensorShape[paddingAxis]=paddingAmount2,tf3.fill(paddingTensorShape,0,"float32")},paddingTensorAppend=createPaddingTensor(paddingAmount),remainingPaddingAmount=dimDiff-paddingTensorAppend.shape[paddingAxis],paddingTensorPrepend=isCenterImage&&remainingPaddingAmount?createPaddingTensor(remainingPaddingAmount):null,tensorsToStack=[paddingTensorPrepend,imgTensor,paddingTensorAppend].filter(t=>!!t).map(t=>tf3.cast(t,"float32"));return tf3.concat(tensorsToStack,paddingAxis)})}function shuffleArray(inputArray){let array=inputArray.slice();for(let i=array.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1)),x=array[i];array[i]=array[j],array[j]=x}return array}function sigmoid(x){return 1/(1+Math.exp(-x))}function inverseSigmoid(x){return Math.log(x/(1-x))}var Rect=class extends Box{constructor(x,y,width,height,allowNegativeDimensions=!1){super({x,y,width,height},allowNegativeDimensions)}},relX=.5,relY=.43,relScale=.45,FaceLandmarks=class{constructor(relativeFaceLandmarkPositions,imgDims,shift=new Point(0,0)){let{width,height}=imgDims;this._imgDims=new Dimensions(width,height),this._shift=shift,this._positions=relativeFaceLandmarkPositions.map(pt=>pt.mul(new Point(width,height)).add(shift))}get shift(){return new Point(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(pt=>pt.sub(this._shift).div(new Point(this.imageWidth,this.imageHeight)))}forSize(width,height){return new this.constructor(this.relativePositions,{width,height})}shiftBy(x,y){return new this.constructor(this.relativePositions,this._imgDims,new Point(x,y))}shiftByPoint(pt){return this.shiftBy(pt.x,pt.y)}align(detection,options={}){if(detection){let box=detection instanceof FaceDetection?detection.box.floor():new Box(detection);return this.shiftBy(box.x,box.y).align(null,options)}let{useDlibAlignment,minBoxPadding}=Object.assign({},{useDlibAlignment:!1,minBoxPadding:.2},options);return useDlibAlignment?this.alignDlib():this.alignMinBbox(minBoxPadding)}alignDlib(){let centers=this.getRefPointsForAlignment(),[leftEyeCenter,rightEyeCenter,mouthCenter]=centers,distToMouth=pt=>mouthCenter.sub(pt).magnitude(),eyeToMouthDist=(distToMouth(leftEyeCenter)+distToMouth(rightEyeCenter))/2,size=Math.floor(eyeToMouthDist/relScale),refPoint=getCenterPoint(centers),x=Math.floor(Math.max(0,refPoint.x-relX*size)),y=Math.floor(Math.max(0,refPoint.y-relY*size));return new Rect(x,y,Math.min(size,this.imageWidth+x),Math.min(size,this.imageHeight+y))}alignMinBbox(padding){let box=minBbox(this.positions);return box.pad(box.width*padding,box.height*padding)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var FaceLandmarks5=class extends FaceLandmarks{getRefPointsForAlignment(){let pts=this.positions;return[pts[0],pts[1],getCenterPoint([pts[3],pts[4]])]}};var FaceLandmarks68=class extends FaceLandmarks{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(getCenterPoint)}};var FaceMatch=class{constructor(label,distance){this._label=label,this._distance=distance}get label(){return this._label}get distance(){return this._distance}toString(withDistance=!0){return`${this.label}${withDistance?` (${round(this.distance)})`:""}`}};var LabeledBox=class extends Box{static assertIsValidLabeledBox(box,callee){if(Box.assertIsValidBox(box,callee),!isValidNumber(box.label))throw new Error(`${callee} - expected property label (${box.label}) to be a number`)}constructor(box,label){super(box);this._label=label}get label(){return this._label}};var LabeledFaceDescriptors=class{constructor(label,descriptors){if(!(typeof label=="string"))throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(descriptors)||descriptors.some(desc=>!(desc instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=label,this._descriptors=descriptors}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(d=>Array.from(d))}}static fromJSON(json){let descriptors=json.descriptors.map(d=>new Float32Array(d));return new LabeledFaceDescriptors(json.label,descriptors)}};var PredictedBox=class extends LabeledBox{static assertIsValidPredictedBox(box,callee){if(LabeledBox.assertIsValidLabeledBox(box,callee),!isValidProbablitiy(box.score)||!isValidProbablitiy(box.classScore))throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`)}constructor(box,label,score,classScore){super(box,label);this._score=score,this._classScore=classScore}get score(){return this._score}get classScore(){return this._classScore}};function isWithFaceDetection(obj){return obj.detection instanceof FaceDetection}function extendWithFaceDetection(sourceObj,detection){let extension={detection};return Object.assign({},sourceObj,extension)}function createBrowserEnv(){let fetch=window.fetch||function(){throw new Error("fetch - missing fetch implementation for browser environment")},readFile=function(){throw new Error("readFile - filesystem not available for browser environment")};return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch,readFile}}function createFileSystem(fs){let requireFsError="";if(!fs)try{fs=require("fs")}catch(err){requireFsError=err.toString()}let readFile=fs?function(filePath){return new Promise((res,rej)=>{fs.readFile(filePath,function(err,buffer){return err?rej(err):res(buffer)})})}:function(){throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)};return{readFile}}function createNodejsEnv(){let Canvas=global.Canvas||global.HTMLCanvasElement,Image=global.Image||global.HTMLImageElement,createCanvasElement=function(){if(Canvas)return new Canvas;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},createImageElement=function(){if(Image)return new Image;throw new Error("createImageElement - missing Image implementation for nodejs environment")},fetch=global.fetch||function(){throw new Error("fetch - missing fetch implementation for nodejs environment")},fileSystem=createFileSystem();return{Canvas:Canvas||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:Image||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement,createImageElement,fetch,...fileSystem}}function isBrowser(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var isNodejs=__toModule(require_isNodejs()),environment;function getEnv(){if(!environment)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return environment}function setEnv(env16){environment=env16}function initialize(){if(isBrowser())return setEnv(createBrowserEnv());if(isNodejs.isNodejs())return setEnv(createNodejsEnv())}function monkeyPatch(env16){if(environment||initialize(),!environment)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas=environment.Canvas,Image=environment.Image}=env16;environment.Canvas=Canvas,environment.Image=Image,environment.createCanvasElement=env16.createCanvasElement||(()=>new Canvas),environment.createImageElement=env16.createImageElement||(()=>new Image),environment.ImageData=env16.ImageData||environment.ImageData,environment.Video=env16.Video||environment.Video,environment.fetch=env16.fetch||environment.fetch,environment.readFile=env16.readFile||environment.readFile}var env={getEnv,setEnv,initialize,createBrowserEnv,createFileSystem,createNodejsEnv,monkeyPatch,isBrowser,isNodejs:isNodejs.isNodejs};initialize();function resolveInput(arg){return!env.isNodejs()&&typeof arg=="string"?document.getElementById(arg):arg}function getContext2dOrThrow(canvasArg){let{Canvas,CanvasRenderingContext2D:CanvasRenderingContext2D2}=env.getEnv();if(canvasArg instanceof CanvasRenderingContext2D2)return canvasArg;let canvas=resolveInput(canvasArg);if(!(canvas instanceof Canvas))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let ctx=canvas.getContext("2d");if(!ctx)throw new Error("resolveContext2d - canvas 2d context is null");return ctx}var AnchorPosition;(function(AnchorPosition2){AnchorPosition2.TOP_LEFT="TOP_LEFT",AnchorPosition2.TOP_RIGHT="TOP_RIGHT",AnchorPosition2.BOTTOM_LEFT="BOTTOM_LEFT",AnchorPosition2.BOTTOM_RIGHT="BOTTOM_RIGHT"})(AnchorPosition||(AnchorPosition={}));var DrawTextFieldOptions=class{constructor(options={}){let{anchorPosition,backgroundColor,fontColor,fontSize,fontStyle,padding}=options;this.anchorPosition=anchorPosition||AnchorPosition.TOP_LEFT,this.backgroundColor=backgroundColor||"rgba(0, 0, 0, 0.5)",this.fontColor=fontColor||"rgba(255, 255, 255, 1)",this.fontSize=fontSize||14,this.fontStyle=fontStyle||"Georgia",this.padding=padding||4}},DrawTextField=class{constructor(text,anchor,options={}){this.text=typeof text=="string"?[text]:text instanceof DrawTextField?text.text:text,this.anchor=anchor,this.options=new DrawTextFieldOptions(options)}measureWidth(ctx){let{padding}=this.options;return this.text.map(l=>ctx.measureText(l).width).reduce((w0,w1)=>w0{let x=padding+upperLeft.x,y=padding+upperLeft.y+(i+1)*fontSize;ctx.fillText(textLine,x,y)})}},DrawBoxOptions=class{constructor(options={}){let{boxColor,lineWidth,label,drawLabelOptions}=options;this.boxColor=boxColor||"rgba(0, 0, 255, 1)",this.lineWidth=lineWidth||2,this.label=label;let defaultDrawLabelOptions={anchorPosition:AnchorPosition.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new DrawTextFieldOptions(Object.assign({},defaultDrawLabelOptions,drawLabelOptions))}},DrawBox=class{constructor(box,options={}){this.box=new Box(box),this.options=new DrawBoxOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{boxColor,lineWidth}=this.options,{x,y,width,height}=this.box;ctx.strokeStyle=boxColor,ctx.lineWidth=lineWidth,ctx.strokeRect(x,y,width,height);let{label}=this.options;label&&new DrawTextField([label],{x:x-lineWidth/2,y},this.options.drawLabelOptions).draw(canvasArg)}};function drawDetections(canvasArg,detections){let detectionsArray=Array.isArray(detections)?detections:[detections];detectionsArray.forEach(det=>{let score=det instanceof FaceDetection?det.score:isWithFaceDetection(det)?det.detection.score:void 0,box=det instanceof FaceDetection?det.box:isWithFaceDetection(det)?det.detection.box:new Box(det),label=score?`${round(score)}`:void 0;new DrawBox(box,{label}).draw(canvasArg)})}var tf18=__toModule(require_tfjs_esm());function isMediaLoaded(media){let{Image,Video}=env.getEnv();return media instanceof Image&&media.complete||media instanceof Video&&media.readyState>=3}function awaitMediaLoaded(media){return new Promise((resolve,reject)=>{if(media instanceof env.getEnv().Canvas||isMediaLoaded(media))return resolve(null);function onLoad(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),resolve(e)}function onError(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),reject(e)}media.addEventListener("load",onLoad),media.addEventListener("error",onError)})}function bufferToImage(buf){return new Promise((resolve,reject)=>{if(!(buf instanceof Blob))return reject("bufferToImage - expected buf to be of type: Blob");let reader=new FileReader;reader.onload=()=>{if(typeof reader.result!="string")return reject("bufferToImage - expected reader.result to be a string, in onload");let img=env.getEnv().createImageElement();img.onload=()=>resolve(img),img.onerror=reject,img.src=reader.result},reader.onerror=reject,reader.readAsDataURL(buf)})}function getMediaDimensions(input){let{Image,Video}=env.getEnv();return input instanceof Image?new Dimensions(input.naturalWidth,input.naturalHeight):input instanceof Video?new Dimensions(input.videoWidth,input.videoHeight):new Dimensions(input.width,input.height)}function createCanvas({width,height}){let{createCanvasElement}=env.getEnv(),canvas=createCanvasElement();return canvas.width=width,canvas.height=height,canvas}function createCanvasFromMedia(media,dims){let{ImageData:ImageData2}=env.getEnv();if(!(media instanceof ImageData2)&&!isMediaLoaded(media))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width,height}=dims||getMediaDimensions(media),canvas=createCanvas({width,height});return media instanceof ImageData2?getContext2dOrThrow(canvas).putImageData(media,0,0):getContext2dOrThrow(canvas).drawImage(media,0,0,width,height),canvas}var tf4=__toModule(require_tfjs_esm());async function imageTensorToCanvas(imgTensor,canvas){let targetCanvas=canvas||env.getEnv().createCanvasElement(),[height,width,numChannels]=imgTensor.shape.slice(isTensor4D(imgTensor)?1:0),imgTensor3D=tf4.tidy(()=>imgTensor.as3D(height,width,numChannels).toInt());return await tf4.browser.toPixels(imgTensor3D,targetCanvas),imgTensor3D.dispose(),targetCanvas}function isMediaElement(input){let{Image,Canvas,Video}=env.getEnv();return input instanceof Image||input instanceof Canvas||input instanceof Video}var tf5=__toModule(require("@tensorflow/tfjs-core"));function imageToSquare(input,inputSize,centerImage=!1){let{Image,Canvas}=env.getEnv();if(!(input instanceof Image||input instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input),scale2=inputSize/Math.max(dims.height,dims.width),width=scale2*dims.width,height=scale2*dims.height,targetCanvas=createCanvas({width:inputSize,height:inputSize}),inputCanvas=input instanceof Canvas?input:createCanvasFromMedia(input),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input)){this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape;return}if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape.slice(1);return}let canvas=input instanceof env.getEnv().Canvas?input:createCanvasFromMedia(input);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tf5.tidy(()=>{let inputTensors=range(this.batchSize,0,1).map(batchIdx=>{let input=this.getInput(batchIdx);if(input instanceof tf5.Tensor){let imgTensor=isTensor4D(input)?input:input.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=tf5.image.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input instanceof env.getEnv().Canvas)return tf5.browser.fromPixels(imageToSquare(input,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`)}),batchTensor=tf5.stack(inputTensors.map(t=>tf5.cast(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input,i)=>{if(!isMediaElement(input)&&!isTensor3D(input)&&!isTensor4D(input))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input=>isMediaElement(input)&&awaitMediaLoaded(input))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input,detections){let{Canvas}=env.getEnv(),canvas=input;if(!(input instanceof Canvas)){let netInput=await toNetInput(input);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}var tf6=__toModule(require_tfjs_esm());async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tf6.tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>tf6.slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init){let fetch=env.getEnv().fetch,res=await fetch(url,init);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}var tf7=__toModule(require_tfjs_esm());function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return tf7.io.loadWeights(manifest,modelBaseUri)}function matchDimensions(input,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input.width=width,input.height=height,{width,height}}var tf15=__toModule(require_tfjs_esm()),tf8=__toModule(require_tfjs_esm()),NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor2){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor2}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof tf8.Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof tf8.Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor2})=>{this.reassignParamFromPath(path,tensor2.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable})=>{let tensor2=tf8.tensor(variable.dataSync());variable.dispose(),this.reassignParamFromPath(path,tensor2)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor2})=>Array.from(tensor2.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights=tf8.io.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof tf8.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}},tf10=__toModule(require_tfjs_esm()),tf9=__toModule(require_tfjs_esm());function depthwiseSeparableConv(x,params,stride){return tf9.tidy(()=>{let out=tf9.separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=tf9.add(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=tf10.relu(tf10.add(out1,tf10.add(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,tf10.add(out3,out4))))})}var tf11=__toModule(require_tfjs_esm());function convLayer(x,params,padding="same",withRelu=!1){return tf11.tidy(()=>{let out=tf11.add(tf11.conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?tf11.relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}var tf12=__toModule(require_tfjs_esm());function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tf12.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf12.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}var tf13=__toModule(require_tfjs_esm());function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tf13.tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tf13.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var tf14=__toModule(require_tfjs_esm()),SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tf14.tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tf14.tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tf14.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor2=weightMap[originalPath];if(!isTensor(tensor2,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor2}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tf15.tidy(()=>{let batchTensor=tf15.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf15.scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=tf15.avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}},tf17=__toModule(require_tfjs_esm()),tf16=__toModule(require_tfjs_esm());function fullyConnectedLayer(x,params){return tf16.tidy(()=>tf16.add(tf16.matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf17.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input){return tf18.tidy(()=>tf18.softmax(this.runNet(input)))}async forward(input){return this.forwardInput(await toNetInput(input))}async predictExpressions(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(tf18.unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}var tf20=__toModule(require_tfjs_esm()),tf19=__toModule(require_tfjs_esm());function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return tf19.add(tf19.conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?tf19.relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=tf19.maxPool(out,[3,3],[2,2],"same"),out=tf19.add(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(tf19.relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv2,[1,1]),out=tf19.add(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tf19.tidy(()=>{let batchTensor=tf19.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf19.scalar(256)),out=tf19.relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=tf19.relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf20.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input,pooled=tf20.avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input){return tf20.tidy(()=>{let{age,gender}=this.runNet(input);return{age,gender:tf20.softmax(gender)}})}async forward(input){return this.forwardInput(await toNetInput(input))}async predictAgeAndGender(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),ages=tf20.unstack(out.age),genders=tf20.unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var tf21=__toModule(require_tfjs_esm()),FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale2=inputSize/Math.max(height,width);return{width:width*scale2,height:height*scale2}}),batchSize=inputDimensions.length;return tf21.tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>tf21.stack([tf21.fill([68],fillX,"float32"),tf21.fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding(batchIdx,(w,h)=>wgetPadding(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input){return tf21.tidy(()=>{let out=this.runNet(input);return this.postProcess(out,input.inputSize,input.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input){return this.forwardInput(await toNetInput(input))}async detectLandmarks(input){let netInput=await toNetInput(input),landmarkTensors=tf21.tidy(()=>tf21.unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven(i)),yCoords=landmarksArray.filter((_,i)=>!isEven(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var tf22=__toModule(require_tfjs_esm());function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tf22.tidy(()=>{let batchTensor=tf22.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf22.scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=tf22.avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};var tf27=__toModule(require_tfjs_esm()),tf24=__toModule(require_tfjs_esm()),tf23=__toModule(require_tfjs_esm());function scale(x,params){return tf23.add(tf23.mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=tf24.conv2d(x,filters,strides,padding);return out=tf24.add(out,bias),out=scale(out,params.scale),withRelu?tf24.relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}var tf25=__toModule(require_tfjs_esm());function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tf25.tidy(()=>tf25.transpose(tf25.tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tf25.tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tf25.tensor1d(extractWeights(numWeights)),biases=tf25.tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale2=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale2}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tf25.tidy(()=>tf25.transpose(tf25.tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale2=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale2}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf26=__toModule(require_tfjs_esm());function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=tf26.add(out,x),out=tf26.relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=tf26.avgPool(x,2,2,"valid"),zeros2=tf26.zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=tf26.zeros(padShapeX);out=tf26.concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=tf26.zeros(padShapeY);out=tf26.concat([out,zerosH],2)}return pooled=isPad?tf26.concat([pooled,zeros2],3):pooled,out=tf26.add(pooled,out),out=tf26.relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tf27.tidy(()=>{let batchTensor=tf27.cast(input.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf27.scalar(256)),out=convDown(normalized,params.conv32_down);out=tf27.maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=tf27.matMul(globalAvg,params.fc);return fullyConnected})}async forward(input){return this.forwardInput(await toNetInput(input))}async computeFaceDescriptor(input){let netInput=await toNetInput(input),faceDescriptorTensors=tf27.tidy(()=>tf27.unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}var tf34=__toModule(require_tfjs_esm()),tf28=__toModule(require_tfjs_esm());function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tf28.tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tf28.tensor1d(extractWeights(numChannels)),batch_norm_offset=tf28.tensor1d(extractWeights(numChannels)),batch_norm_mean=tf28.tensor1d(extractWeights(numChannels)),batch_norm_variance=tf28.tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tf28.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf28.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tf28.tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf30=__toModule(require_tfjs_esm()),tf29=__toModule(require_tfjs_esm());function pointwiseConvLayer(x,params,strides){return tf29.tidy(()=>{let out=tf29.conv2d(x,params.filters,strides,"same");return out=tf29.add(out,params.batch_norm_offset),tf29.clipByValue(out,0,6)})}var epsilon=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tf30.tidy(()=>{let out=tf30.depthwiseConv2d(x,params.filters,strides,"same");return out=tf30.batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon),tf30.clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tf30.tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}var tf31=__toModule(require_tfjs_esm());function getCenterCoordinatesAndSizesLayer(x){let vec=tf31.unstack(tf31.transpose(x,[1,0])),sizes=[tf31.sub(vec[2],vec[0]),tf31.sub(vec[3],vec[1])],centers=[tf31.add(vec[0],tf31.div(sizes[0],tf31.scalar(2))),tf31.add(vec[1],tf31.div(sizes[1],tf31.scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=tf31.unstack(tf31.transpose(x1,[1,0])),div0_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2],tf31.scalar(5))),sizes[0]),tf31.scalar(2)),add0_out=tf31.add(tf31.mul(tf31.div(vec[0],tf31.scalar(10)),sizes[0]),centers[0]),div1_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3],tf31.scalar(5))),sizes[1]),tf31.scalar(2)),add1_out=tf31.add(tf31.mul(tf31.div(vec[1],tf31.scalar(10)),sizes[1]),centers[1]);return tf31.transpose(tf31.stack([tf31.sub(add0_out,div0_out),tf31.sub(add1_out,div1_out),tf31.add(add0_out,div0_out),tf31.add(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tf31.tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim,[batchSize,1,1]),[-1,4]),tf31.reshape(boxPredictions,[-1,4]));boxes=tf31.reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=tf31.sigmoid(tf31.slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=tf31.slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=tf31.reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=tf31.unstack(boxes),scoresByBatch=tf31.unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}var tf33=__toModule(require_tfjs_esm()),tf32=__toModule(require_tfjs_esm());function boxPredictionLayer(x,params){return tf32.tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=tf32.reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=tf32.reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tf33.tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=tf33.concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=tf33.concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tf34.tidy(()=>{let batchTensor=tf34.cast(input.toBatchTensor(512,!1),"float32"),x=tf34.sub(tf34.mul(batchTensor,tf34.scalar(.007843137718737125)),tf34.scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input){return this.forwardInput(await toNetInput(input))}async locateFaces(input,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression2(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",tf39=__toModule(require_tfjs_esm()),isNumber=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber(a.x)&&isNumber(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}var tf36=__toModule(require_tfjs_esm()),tf35=__toModule(require_tfjs_esm());function leaky(x){return tf35.tidy(()=>{let min=tf35.mul(x,tf35.scalar(.10000000149011612));return tf35.add(tf35.relu(tf35.sub(x,min)),min)})}function convWithBatchNorm(x,params){return tf36.tidy(()=>{let out=tf36.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf36.conv2d(out,params.conv.filters,[1,1],"valid"),out=tf36.sub(out,params.bn.sub),out=tf36.mul(out,params.bn.truediv),out=tf36.add(out,params.conv.bias),leaky(out)})}var tf37=__toModule(require_tfjs_esm());function depthwiseSeparableConv3(x,params){return tf37.tidy(()=>{let out=tf37.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf37.separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=tf37.add(out,params.bias),leaky(out)})}var tf38=__toModule(require_tfjs_esm());function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub6=tf38.tensor1d(extractWeights(size)),truediv=tf38.tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub6,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub6=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub6,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tf39.tidy(()=>{let batchTensor=tf39.cast(input.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(tf39.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input,inputSize){return await this.forwardInput(await toNetInput(input),inputSize)}async detect(input,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input),out=await this.forwardInput(netInput,inputSize),out0=tf39.tidy(()=>tf39.unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tf39.tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?tf39.softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):tf39.scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max,curr)=>max.classScore>curr.classScore?max:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}},tf41=__toModule(require_tfjs_esm()),tf40=__toModule(require_tfjs_esm());async function extractAllFacesAndComputeResults(parentResults,input,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input instanceof tf40.Tensor?await extractFaceTensors(input,faceBoxes):await extractFaces(input,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof tf40.Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input,options)=>nets.ssdMobilenetv1.locateFaces(input,options),tinyFaceDetector=(input,options)=>nets.tinyFaceDetector.locateFaces(input,options),tinyYolov23=(input,options)=>nets.tinyYolov2.locateFaces(input,options),detectFaceLandmarks=input=>nets.faceLandmark68Net.detectLandmarks(input),detectFaceLandmarksTiny=input=>nets.faceLandmark68TinyNet.detectLandmarks(input),computeFaceDescriptor=input=>nets.faceRecognitionNet.computeFaceDescriptor(input),recognizeFaceExpressions=input=>nets.faceExpressionNet.predictExpressions(input),predictAgeAndGender=input=>nets.ageGenderNet.predictAgeAndGender(input),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input){super();this.parentTask=parentTask;this.input=input}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input,options=new SsdMobilenetv1Options){super();this.input=input;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input2=>nets.tinyFaceDetector.locateFaces(input2,options):options instanceof SsdMobilenetv1Options?input2=>nets.ssdMobilenetv1.locateFaces(input2,options):options instanceof TinyYolov2Options?input2=>nets.tinyYolov2.locateFaces(input2,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input,options)}function detectAllFaces(input,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input,options)}async function allFacesSsdMobilenetv1(input,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count=1,createUniqueLabel=()=>`person ${count++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json){let labeledDescriptors=json.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version="0.8.9",node=typeof process!="undefined",browser3=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version2={faceapi:version,node,browser:browser3}; +var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__markAsModule=target=>__defProp(target,"__esModule",{value:!0}),__commonJS=(callback,module2)=>()=>(module2||(module2={exports:{}},callback(module2.exports,module2)),module2.exports),__export=(target,all)=>{__markAsModule(target);for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__exportStar=(target,module2,desc)=>{if(__markAsModule(target),module2&&typeof module2=="object"||typeof module2=="function")for(let key of __getOwnPropNames(module2))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module2[key],enumerable:!(desc=__getOwnPropDesc(module2,key))||desc.enumerable});return target},__toModule=module2=>module2&&module2.__esModule?module2:__exportStar(__defProp(module2!=null?__create(__getProtoOf(module2)):{},"default",{value:module2,enumerable:!0}),module2),require_tfjs_esm=__commonJS(exports2=>{var __create2=Object.create,__defProp2=Object.defineProperty,__getProtoOf2=Object.getPrototypeOf,__hasOwnProp2=Object.prototype.hasOwnProperty,__getOwnPropNames2=Object.getOwnPropertyNames,__getOwnPropDesc2=Object.getOwnPropertyDescriptor,__markAsModule2=target=>__defProp2(target,"__esModule",{value:!0}),__exportStar2=(target,module22,desc)=>{if(__markAsModule2(target),module22&&typeof module22=="object"||typeof module22=="function")for(let key of __getOwnPropNames2(module22))!__hasOwnProp2.call(target,key)&&key!=="default"&&__defProp2(target,key,{get:()=>module22[key],enumerable:!(desc=__getOwnPropDesc2(module22,key))||desc.enumerable});return target},__toModule2=module22=>module22&&module22.__esModule?module22:__exportStar2(__defProp2(module22!=null?__create2(__getProtoOf2(module22)):{},"default",{value:module22,enumerable:!0}),module22);__exportStar2(exports2,__toModule2(require("@tensorflow/tfjs-node-gpu")))}),require_isNodejs=__commonJS((exports2,module2)=>{__export(exports2,{isNodejs:()=>isNodejs3});function isNodejs3(){return typeof global=="object"&&!0&&typeof module2!="undefined"&&typeof process!="undefined"&&!!process.version}});__export(exports,{AgeGenderNet:()=>AgeGenderNet,BoundingBox:()=>BoundingBox,Box:()=>Box,ComposableTask:()=>ComposableTask,ComputeAllFaceDescriptorsTask:()=>ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase:()=>ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask:()=>ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask:()=>DetectAllFaceLandmarksTask,DetectAllFacesTask:()=>DetectAllFacesTask,DetectFaceLandmarksTaskBase:()=>DetectFaceLandmarksTaskBase,DetectFacesTaskBase:()=>DetectFacesTaskBase,DetectSingleFaceLandmarksTask:()=>DetectSingleFaceLandmarksTask,DetectSingleFaceTask:()=>DetectSingleFaceTask,Dimensions:()=>Dimensions,FACE_EXPRESSION_LABELS:()=>FACE_EXPRESSION_LABELS,FaceDetection:()=>FaceDetection,FaceDetectionNet:()=>FaceDetectionNet,FaceExpressionNet:()=>FaceExpressionNet,FaceExpressions:()=>FaceExpressions,FaceLandmark68Net:()=>FaceLandmark68Net,FaceLandmark68TinyNet:()=>FaceLandmark68TinyNet,FaceLandmarkNet:()=>FaceLandmarkNet,FaceLandmarks:()=>FaceLandmarks,FaceLandmarks5:()=>FaceLandmarks5,FaceLandmarks68:()=>FaceLandmarks68,FaceMatch:()=>FaceMatch,FaceMatcher:()=>FaceMatcher,FaceRecognitionNet:()=>FaceRecognitionNet,Gender:()=>Gender,LabeledBox:()=>LabeledBox,LabeledFaceDescriptors:()=>LabeledFaceDescriptors,NetInput:()=>NetInput,NeuralNetwork:()=>NeuralNetwork,ObjectDetection:()=>ObjectDetection,Point:()=>Point,PredictedBox:()=>PredictedBox,Rect:()=>Rect,SsdMobilenetv1:()=>SsdMobilenetv1,SsdMobilenetv1Options:()=>SsdMobilenetv1Options,TinyFaceDetector:()=>TinyFaceDetector,TinyFaceDetectorOptions:()=>TinyFaceDetectorOptions,TinyYolov2:()=>TinyYolov2,TinyYolov2Options:()=>TinyYolov2Options,TinyYolov2SizeType:()=>TinyYolov2SizeType,allFaces:()=>allFaces,allFacesSsdMobilenetv1:()=>allFacesSsdMobilenetv1,allFacesTinyYolov2:()=>allFacesTinyYolov2,awaitMediaLoaded:()=>awaitMediaLoaded,bufferToImage:()=>bufferToImage,computeFaceDescriptor:()=>computeFaceDescriptor,createCanvas:()=>createCanvas,createCanvasFromMedia:()=>createCanvasFromMedia,createFaceDetectionNet:()=>createFaceDetectionNet,createFaceRecognitionNet:()=>createFaceRecognitionNet,createSsdMobilenetv1:()=>createSsdMobilenetv1,createTinyFaceDetector:()=>createTinyFaceDetector,createTinyYolov2:()=>createTinyYolov2,detectAllFaces:()=>detectAllFaces,detectFaceLandmarks:()=>detectFaceLandmarks,detectFaceLandmarksTiny:()=>detectFaceLandmarksTiny,detectLandmarks:()=>detectLandmarks,detectSingleFace:()=>detectSingleFace,draw:()=>draw_exports,env:()=>env,euclideanDistance:()=>euclideanDistance,extendWithAge:()=>extendWithAge,extendWithFaceDescriptor:()=>extendWithFaceDescriptor,extendWithFaceDetection:()=>extendWithFaceDetection,extendWithFaceExpressions:()=>extendWithFaceExpressions,extendWithFaceLandmarks:()=>extendWithFaceLandmarks,extendWithGender:()=>extendWithGender,extractFaceTensors:()=>extractFaceTensors,extractFaces:()=>extractFaces,fetchImage:()=>fetchImage,fetchJson:()=>fetchJson,fetchNetWeights:()=>fetchNetWeights,fetchOrThrow:()=>fetchOrThrow,getContext2dOrThrow:()=>getContext2dOrThrow,getMediaDimensions:()=>getMediaDimensions,imageTensorToCanvas:()=>imageTensorToCanvas,imageToSquare:()=>imageToSquare,inverseSigmoid:()=>inverseSigmoid,iou:()=>iou,isMediaElement:()=>isMediaElement,isMediaLoaded:()=>isMediaLoaded,isWithAge:()=>isWithAge,isWithFaceDetection:()=>isWithFaceDetection,isWithFaceExpressions:()=>isWithFaceExpressions,isWithFaceLandmarks:()=>isWithFaceLandmarks,isWithGender:()=>isWithGender,loadAgeGenderModel:()=>loadAgeGenderModel,loadFaceDetectionModel:()=>loadFaceDetectionModel,loadFaceExpressionModel:()=>loadFaceExpressionModel,loadFaceLandmarkModel:()=>loadFaceLandmarkModel,loadFaceLandmarkTinyModel:()=>loadFaceLandmarkTinyModel,loadFaceRecognitionModel:()=>loadFaceRecognitionModel,loadSsdMobilenetv1Model:()=>loadSsdMobilenetv1Model,loadTinyFaceDetectorModel:()=>loadTinyFaceDetectorModel,loadTinyYolov2Model:()=>loadTinyYolov2Model,loadWeightMap:()=>loadWeightMap,locateFaces:()=>locateFaces,matchDimensions:()=>matchDimensions,minBbox:()=>minBbox,nets:()=>nets,nonMaxSuppression:()=>nonMaxSuppression,normalize:()=>normalize,padToSquare:()=>padToSquare,predictAgeAndGender:()=>predictAgeAndGender,recognizeFaceExpressions:()=>recognizeFaceExpressions,resizeResults:()=>resizeResults,resolveInput:()=>resolveInput,shuffleArray:()=>shuffleArray,sigmoid:()=>sigmoid,ssdMobilenetv1:()=>ssdMobilenetv1,tf:()=>tf42,tinyFaceDetector:()=>tinyFaceDetector,tinyYolov2:()=>tinyYolov23,toNetInput:()=>toNetInput,utils:()=>utils_exports,validateConfig:()=>validateConfig,version:()=>version2});var tf42=__toModule(require_tfjs_esm()),draw_exports={};__export(draw_exports,{AnchorPosition:()=>AnchorPosition,DrawBox:()=>DrawBox,DrawBoxOptions:()=>DrawBoxOptions,DrawFaceLandmarks:()=>DrawFaceLandmarks,DrawFaceLandmarksOptions:()=>DrawFaceLandmarksOptions,DrawTextField:()=>DrawTextField,DrawTextFieldOptions:()=>DrawTextFieldOptions,drawContour:()=>drawContour,drawDetections:()=>drawDetections,drawFaceExpressions:()=>drawFaceExpressions,drawFaceLandmarks:()=>drawFaceLandmarks});function drawContour(ctx,points,isClosed=!1){if(ctx.beginPath(),points.slice(1).forEach(({x,y},prevIdx)=>{let from=points[prevIdx];ctx.moveTo(from.x,from.y),ctx.lineTo(x,y)}),isClosed){let from=points[points.length-1],to=points[0];if(!from||!to)return;ctx.moveTo(from.x,from.y),ctx.lineTo(to.x,to.y)}ctx.stroke()}var utils_exports={};__export(utils_exports,{computeReshapedDimensions:()=>computeReshapedDimensions,getCenterPoint:()=>getCenterPoint,isDimensions:()=>isDimensions,isEven:()=>isEven,isFloat:()=>isFloat,isTensor:()=>isTensor,isTensor1D:()=>isTensor1D,isTensor2D:()=>isTensor2D,isTensor3D:()=>isTensor3D,isTensor4D:()=>isTensor4D,isValidNumber:()=>isValidNumber,isValidProbablitiy:()=>isValidProbablitiy,range:()=>range,round:()=>round});var tf=__toModule(require_tfjs_esm()),Dimensions=class{constructor(width,height){if(!isValidNumber(width)||!isValidNumber(height))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width,height})}`);this._width=width,this._height=height}get width(){return this._width}get height(){return this._height}reverse(){return new Dimensions(1/this.width,1/this.height)}};function isTensor(tensor2,dim){return tensor2 instanceof tf.Tensor&&tensor2.shape.length===dim}function isTensor1D(tensor2){return isTensor(tensor2,1)}function isTensor2D(tensor2){return isTensor(tensor2,2)}function isTensor3D(tensor2){return isTensor(tensor2,3)}function isTensor4D(tensor2){return isTensor(tensor2,4)}function isFloat(num){return num%1!==0}function isEven(num){return num%2===0}function round(num,prec=2){let f=Math.pow(10,prec);return Math.floor(num*f)/f}function isDimensions(obj){return obj&&obj.width&&obj.height}function computeReshapedDimensions({width,height},inputSize){let scale2=inputSize/Math.max(height,width);return new Dimensions(Math.round(width*scale2),Math.round(height*scale2))}function getCenterPoint(pts){return pts.reduce((sum,pt)=>sum.add(pt),new Point(0,0)).div(new Point(pts.length,pts.length))}function range(num,start,step){return Array(num).fill(0).map((_,i)=>start+i*step)}function isValidNumber(num){return!!num&&num!==Infinity&&num!==-Infinity&&!isNaN(num)||num===0}function isValidProbablitiy(num){return isValidNumber(num)&&0<=num&&num<=1}var Point=class{constructor(x,y){this._x=x,this._y=y}get x(){return this._x}get y(){return this._y}add(pt){return new Point(this.x+pt.x,this.y+pt.y)}sub(pt){return new Point(this.x-pt.x,this.y-pt.y)}mul(pt){return new Point(this.x*pt.x,this.y*pt.y)}div(pt){return new Point(this.x/pt.x,this.y/pt.y)}abs(){return new Point(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))}floor(){return new Point(Math.floor(this.x),Math.floor(this.y))}},Box=class{static isRect(rect){return!!rect&&[rect.x,rect.y,rect.width,rect.height].every(isValidNumber)}static assertIsValidBox(box,callee,allowNegativeDimensions=!1){if(!Box.isRect(box))throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);if(!allowNegativeDimensions&&(box.width<0||box.height<0))throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`)}constructor(_box,allowNegativeDimensions=!0){let box=_box||{},isBbox=[box.left,box.top,box.right,box.bottom].every(isValidNumber),isRect=[box.x,box.y,box.width,box.height].every(isValidNumber);if(!isRect&&!isBbox)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);let[x,y,width,height]=isRect?[box.x,box.y,box.width,box.height]:[box.left,box.top,box.right-box.left,box.bottom-box.top];Box.assertIsValidBox({x,y,width,height},"Box.constructor",allowNegativeDimensions),this._x=x,this._y=y,this._width=width,this._height=height}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Point(this.left,this.top)}get topRight(){return new Point(this.right,this.top)}get bottomLeft(){return new Point(this.left,this.bottom)}get bottomRight(){return new Point(this.right,this.bottom)}round(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.round(val));return new Box({x,y,width,height})}floor(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.floor(val));return new Box({x,y,width,height})}toSquare(){let{x,y,width,height}=this,diff=Math.abs(width-height);return widthimageWidth&&(edx=-ex+imageWidth+w,ex=imageWidth),ey>imageHeight&&(edy=-ey+imageHeight+h,ey=imageHeight),x<1&&(edy=2-x,x=1),y<1&&(edy=2-y,y=1),{dy,edy,dx,edx,y,ey,x,ex,w,h}}calibrate(region){return new Box({left:this.left+region.left*this.width,top:this.top+region.top*this.height,right:this.right+region.right*this.width,bottom:this.bottom+region.bottom*this.height}).toSquare().round()}},BoundingBox=class extends Box{constructor(left,top,right,bottom,allowNegativeDimensions=!1){super({left,top,right,bottom},allowNegativeDimensions)}};var ObjectDetection=class{constructor(score,classScore,className,relativeBox,imageDims){this._imageDims=new Dimensions(imageDims.width,imageDims.height),this._score=score,this._classScore=classScore,this._className=className,this._box=new Box(relativeBox).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new Box(this._box).rescale(this.imageDims.reverse())}forSize(width,height){return new ObjectDetection(this.score,this.classScore,this.className,this.relativeBox,{width,height})}},FaceDetection=class extends ObjectDetection{constructor(score,relativeBox,imageDims){super(score,score,"",relativeBox,imageDims)}forSize(width,height){let{score,relativeBox,imageDims}=super.forSize(width,height);return new FaceDetection(score,relativeBox,imageDims)}};function iou(box1,box2,isIOU=!0){let width=Math.max(0,Math.min(box1.right,box2.right)-Math.max(box1.left,box2.left)),height=Math.max(0,Math.min(box1.bottom,box2.bottom)-Math.max(box1.top,box2.top)),interSection=width*height;return isIOU?interSection/(box1.area+box2.area-interSection):interSection/Math.min(box1.area,box2.area)}function minBbox(pts){let xs=pts.map(pt=>pt.x),ys=pts.map(pt=>pt.y),minX=xs.reduce((min,x)=>xymaxmax({score,boxIndex})).sort((c1,c2)=>c1.score-c2.score).map(c=>c.boxIndex),pick=[];for(;indicesSortedByScore.length>0;){let curr=indicesSortedByScore.pop();pick.push(curr);let indices=indicesSortedByScore,outputs=[];for(let i=0;ioutputs[j]<=iouThreshold)}return pick}var tf2=__toModule(require_tfjs_esm());function normalize(x,meanRgb){return tf2.tidy(()=>{let[r,g,b]=meanRgb,avg_r=tf2.fill([...x.shape.slice(0,3),1],r,"float32"),avg_g=tf2.fill([...x.shape.slice(0,3),1],g,"float32"),avg_b=tf2.fill([...x.shape.slice(0,3),1],b,"float32"),avg_rgb=tf2.concat([avg_r,avg_g,avg_b],3);return tf2.sub(x,avg_rgb)})}var tf3=__toModule(require_tfjs_esm());function padToSquare(imgTensor,isCenterImage=!1){return tf3.tidy(()=>{let[height,width]=imgTensor.shape.slice(1);if(height===width)return imgTensor;let dimDiff=Math.abs(height-width),paddingAmount=Math.round(dimDiff*(isCenterImage?.5:1)),paddingAxis=height>width?2:1,createPaddingTensor=paddingAmount2=>{let paddingTensorShape=imgTensor.shape.slice();return paddingTensorShape[paddingAxis]=paddingAmount2,tf3.fill(paddingTensorShape,0,"float32")},paddingTensorAppend=createPaddingTensor(paddingAmount),remainingPaddingAmount=dimDiff-paddingTensorAppend.shape[paddingAxis],paddingTensorPrepend=isCenterImage&&remainingPaddingAmount?createPaddingTensor(remainingPaddingAmount):null,tensorsToStack=[paddingTensorPrepend,imgTensor,paddingTensorAppend].filter(t=>!!t).map(t=>tf3.cast(t,"float32"));return tf3.concat(tensorsToStack,paddingAxis)})}function shuffleArray(inputArray){let array=inputArray.slice();for(let i=array.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1)),x=array[i];array[i]=array[j],array[j]=x}return array}function sigmoid(x){return 1/(1+Math.exp(-x))}function inverseSigmoid(x){return Math.log(x/(1-x))}var Rect=class extends Box{constructor(x,y,width,height,allowNegativeDimensions=!1){super({x,y,width,height},allowNegativeDimensions)}},relX=.5,relY=.43,relScale=.45,FaceLandmarks=class{constructor(relativeFaceLandmarkPositions,imgDims,shift=new Point(0,0)){let{width,height}=imgDims;this._imgDims=new Dimensions(width,height),this._shift=shift,this._positions=relativeFaceLandmarkPositions.map(pt=>pt.mul(new Point(width,height)).add(shift))}get shift(){return new Point(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(pt=>pt.sub(this._shift).div(new Point(this.imageWidth,this.imageHeight)))}forSize(width,height){return new this.constructor(this.relativePositions,{width,height})}shiftBy(x,y){return new this.constructor(this.relativePositions,this._imgDims,new Point(x,y))}shiftByPoint(pt){return this.shiftBy(pt.x,pt.y)}align(detection,options={}){if(detection){let box=detection instanceof FaceDetection?detection.box.floor():new Box(detection);return this.shiftBy(box.x,box.y).align(null,options)}let{useDlibAlignment,minBoxPadding}=Object.assign({},{useDlibAlignment:!1,minBoxPadding:.2},options);return useDlibAlignment?this.alignDlib():this.alignMinBbox(minBoxPadding)}alignDlib(){let centers=this.getRefPointsForAlignment(),[leftEyeCenter,rightEyeCenter,mouthCenter]=centers,distToMouth=pt=>mouthCenter.sub(pt).magnitude(),eyeToMouthDist=(distToMouth(leftEyeCenter)+distToMouth(rightEyeCenter))/2,size=Math.floor(eyeToMouthDist/relScale),refPoint=getCenterPoint(centers),x=Math.floor(Math.max(0,refPoint.x-relX*size)),y=Math.floor(Math.max(0,refPoint.y-relY*size));return new Rect(x,y,Math.min(size,this.imageWidth+x),Math.min(size,this.imageHeight+y))}alignMinBbox(padding){let box=minBbox(this.positions);return box.pad(box.width*padding,box.height*padding)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var FaceLandmarks5=class extends FaceLandmarks{getRefPointsForAlignment(){let pts=this.positions;return[pts[0],pts[1],getCenterPoint([pts[3],pts[4]])]}};var FaceLandmarks68=class extends FaceLandmarks{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(getCenterPoint)}};var FaceMatch=class{constructor(label,distance){this._label=label,this._distance=distance}get label(){return this._label}get distance(){return this._distance}toString(withDistance=!0){return`${this.label}${withDistance?` (${round(this.distance)})`:""}`}};var LabeledBox=class extends Box{static assertIsValidLabeledBox(box,callee){if(Box.assertIsValidBox(box,callee),!isValidNumber(box.label))throw new Error(`${callee} - expected property label (${box.label}) to be a number`)}constructor(box,label){super(box);this._label=label}get label(){return this._label}};var LabeledFaceDescriptors=class{constructor(label,descriptors){if(!(typeof label=="string"))throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(descriptors)||descriptors.some(desc=>!(desc instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=label,this._descriptors=descriptors}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(d=>Array.from(d))}}static fromJSON(json){let descriptors=json.descriptors.map(d=>new Float32Array(d));return new LabeledFaceDescriptors(json.label,descriptors)}};var PredictedBox=class extends LabeledBox{static assertIsValidPredictedBox(box,callee){if(LabeledBox.assertIsValidLabeledBox(box,callee),!isValidProbablitiy(box.score)||!isValidProbablitiy(box.classScore))throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`)}constructor(box,label,score,classScore){super(box,label);this._score=score,this._classScore=classScore}get score(){return this._score}get classScore(){return this._classScore}};function isWithFaceDetection(obj){return obj.detection instanceof FaceDetection}function extendWithFaceDetection(sourceObj,detection){let extension={detection};return Object.assign({},sourceObj,extension)}function createBrowserEnv(){let fetch=window.fetch||function(){throw new Error("fetch - missing fetch implementation for browser environment")},readFile=function(){throw new Error("readFile - filesystem not available for browser environment")};return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch,readFile}}function createFileSystem(fs){let requireFsError="";if(!fs)try{fs=require("fs")}catch(err){requireFsError=err.toString()}let readFile=fs?function(filePath){return new Promise((res,rej)=>{fs.readFile(filePath,function(err,buffer){return err?rej(err):res(buffer)})})}:function(){throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)};return{readFile}}function createNodejsEnv(){let Canvas=global.Canvas||global.HTMLCanvasElement,Image=global.Image||global.HTMLImageElement,createCanvasElement=function(){if(Canvas)return new Canvas;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},createImageElement=function(){if(Image)return new Image;throw new Error("createImageElement - missing Image implementation for nodejs environment")},fetch=global.fetch||function(){throw new Error("fetch - missing fetch implementation for nodejs environment")},fileSystem=createFileSystem();return{Canvas:Canvas||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:Image||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement,createImageElement,fetch,...fileSystem}}function isBrowser(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var isNodejs=__toModule(require_isNodejs()),environment;function getEnv(){if(!environment)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return environment}function setEnv(env16){environment=env16}function initialize(){if(isBrowser())return setEnv(createBrowserEnv());if(isNodejs.isNodejs())return setEnv(createNodejsEnv())}function monkeyPatch(env16){if(environment||initialize(),!environment)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas=environment.Canvas,Image=environment.Image}=env16;environment.Canvas=Canvas,environment.Image=Image,environment.createCanvasElement=env16.createCanvasElement||(()=>new Canvas),environment.createImageElement=env16.createImageElement||(()=>new Image),environment.ImageData=env16.ImageData||environment.ImageData,environment.Video=env16.Video||environment.Video,environment.fetch=env16.fetch||environment.fetch,environment.readFile=env16.readFile||environment.readFile}var env={getEnv,setEnv,initialize,createBrowserEnv,createFileSystem,createNodejsEnv,monkeyPatch,isBrowser,isNodejs:isNodejs.isNodejs};initialize();function resolveInput(arg){return!env.isNodejs()&&typeof arg=="string"?document.getElementById(arg):arg}function getContext2dOrThrow(canvasArg){let{Canvas,CanvasRenderingContext2D:CanvasRenderingContext2D2}=env.getEnv();if(canvasArg instanceof CanvasRenderingContext2D2)return canvasArg;let canvas=resolveInput(canvasArg);if(!(canvas instanceof Canvas))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let ctx=canvas.getContext("2d");if(!ctx)throw new Error("resolveContext2d - canvas 2d context is null");return ctx}var AnchorPosition;(function(AnchorPosition2){AnchorPosition2.TOP_LEFT="TOP_LEFT",AnchorPosition2.TOP_RIGHT="TOP_RIGHT",AnchorPosition2.BOTTOM_LEFT="BOTTOM_LEFT",AnchorPosition2.BOTTOM_RIGHT="BOTTOM_RIGHT"})(AnchorPosition||(AnchorPosition={}));var DrawTextFieldOptions=class{constructor(options={}){let{anchorPosition,backgroundColor,fontColor,fontSize,fontStyle,padding}=options;this.anchorPosition=anchorPosition||AnchorPosition.TOP_LEFT,this.backgroundColor=backgroundColor||"rgba(0, 0, 0, 0.5)",this.fontColor=fontColor||"rgba(255, 255, 255, 1)",this.fontSize=fontSize||14,this.fontStyle=fontStyle||"Georgia",this.padding=padding||4}},DrawTextField=class{constructor(text,anchor,options={}){this.text=typeof text=="string"?[text]:text instanceof DrawTextField?text.text:text,this.anchor=anchor,this.options=new DrawTextFieldOptions(options)}measureWidth(ctx){let{padding}=this.options;return this.text.map(l=>ctx.measureText(l).width).reduce((w0,w1)=>w0{let x=padding+upperLeft.x,y=padding+upperLeft.y+(i+1)*fontSize;ctx.fillText(textLine,x,y)})}},DrawBoxOptions=class{constructor(options={}){let{boxColor,lineWidth,label,drawLabelOptions}=options;this.boxColor=boxColor||"rgba(0, 0, 255, 1)",this.lineWidth=lineWidth||2,this.label=label;let defaultDrawLabelOptions={anchorPosition:AnchorPosition.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new DrawTextFieldOptions(Object.assign({},defaultDrawLabelOptions,drawLabelOptions))}},DrawBox=class{constructor(box,options={}){this.box=new Box(box),this.options=new DrawBoxOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{boxColor,lineWidth}=this.options,{x,y,width,height}=this.box;ctx.strokeStyle=boxColor,ctx.lineWidth=lineWidth,ctx.strokeRect(x,y,width,height);let{label}=this.options;label&&new DrawTextField([label],{x:x-lineWidth/2,y},this.options.drawLabelOptions).draw(canvasArg)}};function drawDetections(canvasArg,detections){let detectionsArray=Array.isArray(detections)?detections:[detections];detectionsArray.forEach(det=>{let score=det instanceof FaceDetection?det.score:isWithFaceDetection(det)?det.detection.score:void 0,box=det instanceof FaceDetection?det.box:isWithFaceDetection(det)?det.detection.box:new Box(det),label=score?`${round(score)}`:void 0;new DrawBox(box,{label}).draw(canvasArg)})}var tf18=__toModule(require_tfjs_esm());function isMediaLoaded(media){let{Image,Video}=env.getEnv();return media instanceof Image&&media.complete||media instanceof Video&&media.readyState>=3}function awaitMediaLoaded(media){return new Promise((resolve,reject)=>{if(media instanceof env.getEnv().Canvas||isMediaLoaded(media))return resolve(null);function onLoad(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),resolve(e)}function onError(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),reject(e)}media.addEventListener("load",onLoad),media.addEventListener("error",onError)})}function bufferToImage(buf){return new Promise((resolve,reject)=>{if(!(buf instanceof Blob))return reject("bufferToImage - expected buf to be of type: Blob");let reader=new FileReader;reader.onload=()=>{if(typeof reader.result!="string")return reject("bufferToImage - expected reader.result to be a string, in onload");let img=env.getEnv().createImageElement();img.onload=()=>resolve(img),img.onerror=reject,img.src=reader.result},reader.onerror=reject,reader.readAsDataURL(buf)})}function getMediaDimensions(input){let{Image,Video}=env.getEnv();return input instanceof Image?new Dimensions(input.naturalWidth,input.naturalHeight):input instanceof Video?new Dimensions(input.videoWidth,input.videoHeight):new Dimensions(input.width,input.height)}function createCanvas({width,height}){let{createCanvasElement}=env.getEnv(),canvas=createCanvasElement();return canvas.width=width,canvas.height=height,canvas}function createCanvasFromMedia(media,dims){let{ImageData:ImageData2}=env.getEnv();if(!(media instanceof ImageData2)&&!isMediaLoaded(media))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width,height}=dims||getMediaDimensions(media),canvas=createCanvas({width,height});return media instanceof ImageData2?getContext2dOrThrow(canvas).putImageData(media,0,0):getContext2dOrThrow(canvas).drawImage(media,0,0,width,height),canvas}var tf4=__toModule(require_tfjs_esm());async function imageTensorToCanvas(imgTensor,canvas){let targetCanvas=canvas||env.getEnv().createCanvasElement(),[height,width,numChannels]=imgTensor.shape.slice(isTensor4D(imgTensor)?1:0),imgTensor3D=tf4.tidy(()=>imgTensor.as3D(height,width,numChannels).toInt());return await tf4.browser.toPixels(imgTensor3D,targetCanvas),imgTensor3D.dispose(),targetCanvas}function isMediaElement(input){let{Image,Canvas,Video}=env.getEnv();return input instanceof Image||input instanceof Canvas||input instanceof Video}var tf5=__toModule(require("@tensorflow/tfjs-core"));function imageToSquare(input,inputSize,centerImage=!1){let{Image,Canvas}=env.getEnv();if(!(input instanceof Image||input instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input),scale2=inputSize/Math.max(dims.height,dims.width),width=scale2*dims.width,height=scale2*dims.height,targetCanvas=createCanvas({width:inputSize,height:inputSize}),inputCanvas=input instanceof Canvas?input:createCanvasFromMedia(input),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input)){this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape;return}if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape.slice(1);return}let canvas=input instanceof env.getEnv().Canvas?input:createCanvasFromMedia(input);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tf5.tidy(()=>{let inputTensors=range(this.batchSize,0,1).map(batchIdx=>{let input=this.getInput(batchIdx);if(input instanceof tf5.Tensor){let imgTensor=isTensor4D(input)?input:input.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=tf5.image.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input instanceof env.getEnv().Canvas)return tf5.browser.fromPixels(imageToSquare(input,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`)}),batchTensor=tf5.stack(inputTensors.map(t=>tf5.cast(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input,i)=>{if(!isMediaElement(input)&&!isTensor3D(input)&&!isTensor4D(input))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input=>isMediaElement(input)&&awaitMediaLoaded(input))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input,detections){let{Canvas}=env.getEnv(),canvas=input;if(!(input instanceof Canvas)){let netInput=await toNetInput(input);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}var tf6=__toModule(require_tfjs_esm());async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tf6.tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>tf6.slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init){let fetch=env.getEnv().fetch,res=await fetch(url,init);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}var tf7=__toModule(require_tfjs_esm());function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return tf7.io.loadWeights(manifest,modelBaseUri)}function matchDimensions(input,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input.width=width,input.height=height,{width,height}}var tf15=__toModule(require_tfjs_esm()),tf8=__toModule(require_tfjs_esm()),NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor2){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor2}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof tf8.Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof tf8.Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor2})=>{this.reassignParamFromPath(path,tensor2.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable})=>{let tensor2=tf8.tensor(variable.dataSync());variable.dispose(),this.reassignParamFromPath(path,tensor2)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor2})=>Array.from(tensor2.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights=tf8.io.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof tf8.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}},tf10=__toModule(require_tfjs_esm()),tf9=__toModule(require_tfjs_esm());function depthwiseSeparableConv(x,params,stride){return tf9.tidy(()=>{let out=tf9.separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=tf9.add(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=tf10.relu(tf10.add(out1,tf10.add(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,tf10.add(out3,out4))))})}var tf11=__toModule(require_tfjs_esm());function convLayer(x,params,padding="same",withRelu=!1){return tf11.tidy(()=>{let out=tf11.add(tf11.conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?tf11.relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}var tf12=__toModule(require_tfjs_esm());function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tf12.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf12.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}var tf13=__toModule(require_tfjs_esm());function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tf13.tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tf13.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var tf14=__toModule(require_tfjs_esm()),SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tf14.tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tf14.tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tf14.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor2=weightMap[originalPath];if(!isTensor(tensor2,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor2}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tf15.tidy(()=>{let batchTensor=tf15.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf15.scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=tf15.avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}},tf17=__toModule(require_tfjs_esm()),tf16=__toModule(require_tfjs_esm());function fullyConnectedLayer(x,params){return tf16.tidy(()=>tf16.add(tf16.matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf17.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input){return tf18.tidy(()=>tf18.softmax(this.runNet(input)))}async forward(input){return this.forwardInput(await toNetInput(input))}async predictExpressions(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(tf18.unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}var tf20=__toModule(require_tfjs_esm()),tf19=__toModule(require_tfjs_esm());function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return tf19.add(tf19.conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?tf19.relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=tf19.maxPool(out,[3,3],[2,2],"same"),out=tf19.add(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(tf19.relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv2,[1,1]),out=tf19.add(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tf19.tidy(()=>{let batchTensor=tf19.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf19.scalar(256)),out=tf19.relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=tf19.relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf20.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input,pooled=tf20.avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input){return tf20.tidy(()=>{let{age,gender}=this.runNet(input);return{age,gender:tf20.softmax(gender)}})}async forward(input){return this.forwardInput(await toNetInput(input))}async predictAgeAndGender(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),ages=tf20.unstack(out.age),genders=tf20.unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var tf21=__toModule(require_tfjs_esm()),FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale2=inputSize/Math.max(height,width);return{width:width*scale2,height:height*scale2}}),batchSize=inputDimensions.length;return tf21.tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>tf21.stack([tf21.fill([68],fillX,"float32"),tf21.fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding(batchIdx,(w,h)=>wgetPadding(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input){return tf21.tidy(()=>{let out=this.runNet(input);return this.postProcess(out,input.inputSize,input.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input){return this.forwardInput(await toNetInput(input))}async detectLandmarks(input){let netInput=await toNetInput(input),landmarkTensors=tf21.tidy(()=>tf21.unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven(i)),yCoords=landmarksArray.filter((_,i)=>!isEven(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var tf22=__toModule(require_tfjs_esm());function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tf22.tidy(()=>{let batchTensor=tf22.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf22.scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=tf22.avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};var tf27=__toModule(require_tfjs_esm()),tf24=__toModule(require_tfjs_esm()),tf23=__toModule(require_tfjs_esm());function scale(x,params){return tf23.add(tf23.mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=tf24.conv2d(x,filters,strides,padding);return out=tf24.add(out,bias),out=scale(out,params.scale),withRelu?tf24.relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}var tf25=__toModule(require_tfjs_esm());function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tf25.tidy(()=>tf25.transpose(tf25.tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tf25.tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tf25.tensor1d(extractWeights(numWeights)),biases=tf25.tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale2=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale2}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tf25.tidy(()=>tf25.transpose(tf25.tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale2=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale2}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf26=__toModule(require_tfjs_esm());function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=tf26.add(out,x),out=tf26.relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=tf26.avgPool(x,2,2,"valid"),zeros2=tf26.zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=tf26.zeros(padShapeX);out=tf26.concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=tf26.zeros(padShapeY);out=tf26.concat([out,zerosH],2)}return pooled=isPad?tf26.concat([pooled,zeros2],3):pooled,out=tf26.add(pooled,out),out=tf26.relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tf27.tidy(()=>{let batchTensor=tf27.cast(input.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf27.scalar(256)),out=convDown(normalized,params.conv32_down);out=tf27.maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=tf27.matMul(globalAvg,params.fc);return fullyConnected})}async forward(input){return this.forwardInput(await toNetInput(input))}async computeFaceDescriptor(input){let netInput=await toNetInput(input),faceDescriptorTensors=tf27.tidy(()=>tf27.unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}var tf34=__toModule(require_tfjs_esm()),tf28=__toModule(require_tfjs_esm());function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tf28.tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tf28.tensor1d(extractWeights(numChannels)),batch_norm_offset=tf28.tensor1d(extractWeights(numChannels)),batch_norm_mean=tf28.tensor1d(extractWeights(numChannels)),batch_norm_variance=tf28.tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tf28.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf28.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tf28.tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf30=__toModule(require_tfjs_esm()),tf29=__toModule(require_tfjs_esm());function pointwiseConvLayer(x,params,strides){return tf29.tidy(()=>{let out=tf29.conv2d(x,params.filters,strides,"same");return out=tf29.add(out,params.batch_norm_offset),tf29.clipByValue(out,0,6)})}var epsilon=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tf30.tidy(()=>{let out=tf30.depthwiseConv2d(x,params.filters,strides,"same");return out=tf30.batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon),tf30.clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tf30.tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}var tf31=__toModule(require_tfjs_esm());function getCenterCoordinatesAndSizesLayer(x){let vec=tf31.unstack(tf31.transpose(x,[1,0])),sizes=[tf31.sub(vec[2],vec[0]),tf31.sub(vec[3],vec[1])],centers=[tf31.add(vec[0],tf31.div(sizes[0],tf31.scalar(2))),tf31.add(vec[1],tf31.div(sizes[1],tf31.scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=tf31.unstack(tf31.transpose(x1,[1,0])),div0_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2],tf31.scalar(5))),sizes[0]),tf31.scalar(2)),add0_out=tf31.add(tf31.mul(tf31.div(vec[0],tf31.scalar(10)),sizes[0]),centers[0]),div1_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3],tf31.scalar(5))),sizes[1]),tf31.scalar(2)),add1_out=tf31.add(tf31.mul(tf31.div(vec[1],tf31.scalar(10)),sizes[1]),centers[1]);return tf31.transpose(tf31.stack([tf31.sub(add0_out,div0_out),tf31.sub(add1_out,div1_out),tf31.add(add0_out,div0_out),tf31.add(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tf31.tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim,[batchSize,1,1]),[-1,4]),tf31.reshape(boxPredictions,[-1,4]));boxes=tf31.reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=tf31.sigmoid(tf31.slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=tf31.slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=tf31.reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=tf31.unstack(boxes),scoresByBatch=tf31.unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}var tf33=__toModule(require_tfjs_esm()),tf32=__toModule(require_tfjs_esm());function boxPredictionLayer(x,params){return tf32.tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=tf32.reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=tf32.reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tf33.tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=tf33.concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=tf33.concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tf34.tidy(()=>{let batchTensor=tf34.cast(input.toBatchTensor(512,!1),"float32"),x=tf34.sub(tf34.mul(batchTensor,tf34.scalar(.007843137718737125)),tf34.scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input){return this.forwardInput(await toNetInput(input))}async locateFaces(input,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression2(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",tf39=__toModule(require_tfjs_esm()),isNumber=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber(a.x)&&isNumber(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}var tf36=__toModule(require_tfjs_esm()),tf35=__toModule(require_tfjs_esm());function leaky(x){return tf35.tidy(()=>{let min=tf35.mul(x,tf35.scalar(.10000000149011612));return tf35.add(tf35.relu(tf35.sub(x,min)),min)})}function convWithBatchNorm(x,params){return tf36.tidy(()=>{let out=tf36.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf36.conv2d(out,params.conv.filters,[1,1],"valid"),out=tf36.sub(out,params.bn.sub),out=tf36.mul(out,params.bn.truediv),out=tf36.add(out,params.conv.bias),leaky(out)})}var tf37=__toModule(require_tfjs_esm());function depthwiseSeparableConv3(x,params){return tf37.tidy(()=>{let out=tf37.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf37.separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=tf37.add(out,params.bias),leaky(out)})}var tf38=__toModule(require_tfjs_esm());function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub6=tf38.tensor1d(extractWeights(size)),truediv=tf38.tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub6,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub6=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub6,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tf39.tidy(()=>{let batchTensor=tf39.cast(input.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(tf39.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input,inputSize){return await this.forwardInput(await toNetInput(input),inputSize)}async detect(input,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input),out=await this.forwardInput(netInput,inputSize),out0=tf39.tidy(()=>tf39.unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tf39.tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?tf39.softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):tf39.scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max,curr)=>max.classScore>curr.classScore?max:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}},tf41=__toModule(require_tfjs_esm()),tf40=__toModule(require_tfjs_esm());async function extractAllFacesAndComputeResults(parentResults,input,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input instanceof tf40.Tensor?await extractFaceTensors(input,faceBoxes):await extractFaces(input,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof tf40.Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input,options)=>nets.ssdMobilenetv1.locateFaces(input,options),tinyFaceDetector=(input,options)=>nets.tinyFaceDetector.locateFaces(input,options),tinyYolov23=(input,options)=>nets.tinyYolov2.locateFaces(input,options),detectFaceLandmarks=input=>nets.faceLandmark68Net.detectLandmarks(input),detectFaceLandmarksTiny=input=>nets.faceLandmark68TinyNet.detectLandmarks(input),computeFaceDescriptor=input=>nets.faceRecognitionNet.computeFaceDescriptor(input),recognizeFaceExpressions=input=>nets.faceExpressionNet.predictExpressions(input),predictAgeAndGender=input=>nets.ageGenderNet.predictAgeAndGender(input),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input){super();this.parentTask=parentTask;this.input=input}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input,options=new SsdMobilenetv1Options){super();this.input=input;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input2=>nets.tinyFaceDetector.locateFaces(input2,options):options instanceof SsdMobilenetv1Options?input2=>nets.ssdMobilenetv1.locateFaces(input2,options):options instanceof TinyYolov2Options?input2=>nets.tinyYolov2.locateFaces(input2,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input,options)}function detectAllFaces(input,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input,options)}async function allFacesSsdMobilenetv1(input,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count=1,createUniqueLabel=()=>`person ${count++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json){let labeledDescriptors=json.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version="0.9.1",node=typeof process!="undefined",browser3=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version2={faceapi:version,node,browser:browser3}; //# sourceMappingURL=face-api.node-gpu.js.map diff --git a/dist/face-api.node-gpu.json b/dist/face-api.node-gpu.json index 207bba7..9e47e0b 100644 --- a/dist/face-api.node-gpu.json +++ b/dist/face-api.node-gpu.json @@ -2060,7 +2060,7 @@ ] }, "package.json": { - "bytes": 1409, + "bytes": 1352, "imports": [] }, "src/index.ts": { diff --git a/dist/face-api.node.js b/dist/face-api.node.js index 4b4af47..a52f46a 100644 --- a/dist/face-api.node.js +++ b/dist/face-api.node.js @@ -5,5 +5,5 @@ author: ' */ -var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__markAsModule=target=>__defProp(target,"__esModule",{value:!0}),__commonJS=(callback,module2)=>()=>(module2||(module2={exports:{}},callback(module2.exports,module2)),module2.exports),__export=(target,all)=>{__markAsModule(target);for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__exportStar=(target,module2,desc)=>{if(__markAsModule(target),module2&&typeof module2=="object"||typeof module2=="function")for(let key of __getOwnPropNames(module2))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module2[key],enumerable:!(desc=__getOwnPropDesc(module2,key))||desc.enumerable});return target},__toModule=module2=>module2&&module2.__esModule?module2:__exportStar(__defProp(module2!=null?__create(__getProtoOf(module2)):{},"default",{value:module2,enumerable:!0}),module2),require_tfjs_esm=__commonJS(exports2=>{var __create2=Object.create,__defProp2=Object.defineProperty,__getProtoOf2=Object.getPrototypeOf,__hasOwnProp2=Object.prototype.hasOwnProperty,__getOwnPropNames2=Object.getOwnPropertyNames,__getOwnPropDesc2=Object.getOwnPropertyDescriptor,__markAsModule2=target=>__defProp2(target,"__esModule",{value:!0}),__exportStar2=(target,module22,desc)=>{if(__markAsModule2(target),module22&&typeof module22=="object"||typeof module22=="function")for(let key of __getOwnPropNames2(module22))!__hasOwnProp2.call(target,key)&&key!=="default"&&__defProp2(target,key,{get:()=>module22[key],enumerable:!(desc=__getOwnPropDesc2(module22,key))||desc.enumerable});return target},__toModule2=module22=>module22&&module22.__esModule?module22:__exportStar2(__defProp2(module22!=null?__create2(__getProtoOf2(module22)):{},"default",{value:module22,enumerable:!0}),module22);__exportStar2(exports2,__toModule2(require("@tensorflow/tfjs-node")))}),require_isNodejs=__commonJS((exports2,module2)=>{__export(exports2,{isNodejs:()=>isNodejs3});function isNodejs3(){return typeof global=="object"&&!0&&typeof module2!="undefined"&&typeof process!="undefined"&&!!process.version}});__export(exports,{AgeGenderNet:()=>AgeGenderNet,BoundingBox:()=>BoundingBox,Box:()=>Box,ComposableTask:()=>ComposableTask,ComputeAllFaceDescriptorsTask:()=>ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase:()=>ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask:()=>ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask:()=>DetectAllFaceLandmarksTask,DetectAllFacesTask:()=>DetectAllFacesTask,DetectFaceLandmarksTaskBase:()=>DetectFaceLandmarksTaskBase,DetectFacesTaskBase:()=>DetectFacesTaskBase,DetectSingleFaceLandmarksTask:()=>DetectSingleFaceLandmarksTask,DetectSingleFaceTask:()=>DetectSingleFaceTask,Dimensions:()=>Dimensions,FACE_EXPRESSION_LABELS:()=>FACE_EXPRESSION_LABELS,FaceDetection:()=>FaceDetection,FaceDetectionNet:()=>FaceDetectionNet,FaceExpressionNet:()=>FaceExpressionNet,FaceExpressions:()=>FaceExpressions,FaceLandmark68Net:()=>FaceLandmark68Net,FaceLandmark68TinyNet:()=>FaceLandmark68TinyNet,FaceLandmarkNet:()=>FaceLandmarkNet,FaceLandmarks:()=>FaceLandmarks,FaceLandmarks5:()=>FaceLandmarks5,FaceLandmarks68:()=>FaceLandmarks68,FaceMatch:()=>FaceMatch,FaceMatcher:()=>FaceMatcher,FaceRecognitionNet:()=>FaceRecognitionNet,Gender:()=>Gender,LabeledBox:()=>LabeledBox,LabeledFaceDescriptors:()=>LabeledFaceDescriptors,NetInput:()=>NetInput,NeuralNetwork:()=>NeuralNetwork,ObjectDetection:()=>ObjectDetection,Point:()=>Point,PredictedBox:()=>PredictedBox,Rect:()=>Rect,SsdMobilenetv1:()=>SsdMobilenetv1,SsdMobilenetv1Options:()=>SsdMobilenetv1Options,TinyFaceDetector:()=>TinyFaceDetector,TinyFaceDetectorOptions:()=>TinyFaceDetectorOptions,TinyYolov2:()=>TinyYolov2,TinyYolov2Options:()=>TinyYolov2Options,TinyYolov2SizeType:()=>TinyYolov2SizeType,allFaces:()=>allFaces,allFacesSsdMobilenetv1:()=>allFacesSsdMobilenetv1,allFacesTinyYolov2:()=>allFacesTinyYolov2,awaitMediaLoaded:()=>awaitMediaLoaded,bufferToImage:()=>bufferToImage,computeFaceDescriptor:()=>computeFaceDescriptor,createCanvas:()=>createCanvas,createCanvasFromMedia:()=>createCanvasFromMedia,createFaceDetectionNet:()=>createFaceDetectionNet,createFaceRecognitionNet:()=>createFaceRecognitionNet,createSsdMobilenetv1:()=>createSsdMobilenetv1,createTinyFaceDetector:()=>createTinyFaceDetector,createTinyYolov2:()=>createTinyYolov2,detectAllFaces:()=>detectAllFaces,detectFaceLandmarks:()=>detectFaceLandmarks,detectFaceLandmarksTiny:()=>detectFaceLandmarksTiny,detectLandmarks:()=>detectLandmarks,detectSingleFace:()=>detectSingleFace,draw:()=>draw_exports,env:()=>env,euclideanDistance:()=>euclideanDistance,extendWithAge:()=>extendWithAge,extendWithFaceDescriptor:()=>extendWithFaceDescriptor,extendWithFaceDetection:()=>extendWithFaceDetection,extendWithFaceExpressions:()=>extendWithFaceExpressions,extendWithFaceLandmarks:()=>extendWithFaceLandmarks,extendWithGender:()=>extendWithGender,extractFaceTensors:()=>extractFaceTensors,extractFaces:()=>extractFaces,fetchImage:()=>fetchImage,fetchJson:()=>fetchJson,fetchNetWeights:()=>fetchNetWeights,fetchOrThrow:()=>fetchOrThrow,getContext2dOrThrow:()=>getContext2dOrThrow,getMediaDimensions:()=>getMediaDimensions,imageTensorToCanvas:()=>imageTensorToCanvas,imageToSquare:()=>imageToSquare,inverseSigmoid:()=>inverseSigmoid,iou:()=>iou,isMediaElement:()=>isMediaElement,isMediaLoaded:()=>isMediaLoaded,isWithAge:()=>isWithAge,isWithFaceDetection:()=>isWithFaceDetection,isWithFaceExpressions:()=>isWithFaceExpressions,isWithFaceLandmarks:()=>isWithFaceLandmarks,isWithGender:()=>isWithGender,loadAgeGenderModel:()=>loadAgeGenderModel,loadFaceDetectionModel:()=>loadFaceDetectionModel,loadFaceExpressionModel:()=>loadFaceExpressionModel,loadFaceLandmarkModel:()=>loadFaceLandmarkModel,loadFaceLandmarkTinyModel:()=>loadFaceLandmarkTinyModel,loadFaceRecognitionModel:()=>loadFaceRecognitionModel,loadSsdMobilenetv1Model:()=>loadSsdMobilenetv1Model,loadTinyFaceDetectorModel:()=>loadTinyFaceDetectorModel,loadTinyYolov2Model:()=>loadTinyYolov2Model,loadWeightMap:()=>loadWeightMap,locateFaces:()=>locateFaces,matchDimensions:()=>matchDimensions,minBbox:()=>minBbox,nets:()=>nets,nonMaxSuppression:()=>nonMaxSuppression,normalize:()=>normalize,padToSquare:()=>padToSquare,predictAgeAndGender:()=>predictAgeAndGender,recognizeFaceExpressions:()=>recognizeFaceExpressions,resizeResults:()=>resizeResults,resolveInput:()=>resolveInput,shuffleArray:()=>shuffleArray,sigmoid:()=>sigmoid,ssdMobilenetv1:()=>ssdMobilenetv1,tf:()=>tf42,tinyFaceDetector:()=>tinyFaceDetector,tinyYolov2:()=>tinyYolov23,toNetInput:()=>toNetInput,utils:()=>utils_exports,validateConfig:()=>validateConfig,version:()=>version2});var tf42=__toModule(require_tfjs_esm()),draw_exports={};__export(draw_exports,{AnchorPosition:()=>AnchorPosition,DrawBox:()=>DrawBox,DrawBoxOptions:()=>DrawBoxOptions,DrawFaceLandmarks:()=>DrawFaceLandmarks,DrawFaceLandmarksOptions:()=>DrawFaceLandmarksOptions,DrawTextField:()=>DrawTextField,DrawTextFieldOptions:()=>DrawTextFieldOptions,drawContour:()=>drawContour,drawDetections:()=>drawDetections,drawFaceExpressions:()=>drawFaceExpressions,drawFaceLandmarks:()=>drawFaceLandmarks});function drawContour(ctx,points,isClosed=!1){if(ctx.beginPath(),points.slice(1).forEach(({x,y},prevIdx)=>{let from=points[prevIdx];ctx.moveTo(from.x,from.y),ctx.lineTo(x,y)}),isClosed){let from=points[points.length-1],to=points[0];if(!from||!to)return;ctx.moveTo(from.x,from.y),ctx.lineTo(to.x,to.y)}ctx.stroke()}var utils_exports={};__export(utils_exports,{computeReshapedDimensions:()=>computeReshapedDimensions,getCenterPoint:()=>getCenterPoint,isDimensions:()=>isDimensions,isEven:()=>isEven,isFloat:()=>isFloat,isTensor:()=>isTensor,isTensor1D:()=>isTensor1D,isTensor2D:()=>isTensor2D,isTensor3D:()=>isTensor3D,isTensor4D:()=>isTensor4D,isValidNumber:()=>isValidNumber,isValidProbablitiy:()=>isValidProbablitiy,range:()=>range,round:()=>round});var tf=__toModule(require_tfjs_esm()),Dimensions=class{constructor(width,height){if(!isValidNumber(width)||!isValidNumber(height))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width,height})}`);this._width=width,this._height=height}get width(){return this._width}get height(){return this._height}reverse(){return new Dimensions(1/this.width,1/this.height)}};function isTensor(tensor2,dim){return tensor2 instanceof tf.Tensor&&tensor2.shape.length===dim}function isTensor1D(tensor2){return isTensor(tensor2,1)}function isTensor2D(tensor2){return isTensor(tensor2,2)}function isTensor3D(tensor2){return isTensor(tensor2,3)}function isTensor4D(tensor2){return isTensor(tensor2,4)}function isFloat(num){return num%1!==0}function isEven(num){return num%2===0}function round(num,prec=2){let f=Math.pow(10,prec);return Math.floor(num*f)/f}function isDimensions(obj){return obj&&obj.width&&obj.height}function computeReshapedDimensions({width,height},inputSize){let scale2=inputSize/Math.max(height,width);return new Dimensions(Math.round(width*scale2),Math.round(height*scale2))}function getCenterPoint(pts){return pts.reduce((sum,pt)=>sum.add(pt),new Point(0,0)).div(new Point(pts.length,pts.length))}function range(num,start,step){return Array(num).fill(0).map((_,i)=>start+i*step)}function isValidNumber(num){return!!num&&num!==Infinity&&num!==-Infinity&&!isNaN(num)||num===0}function isValidProbablitiy(num){return isValidNumber(num)&&0<=num&&num<=1}var Point=class{constructor(x,y){this._x=x,this._y=y}get x(){return this._x}get y(){return this._y}add(pt){return new Point(this.x+pt.x,this.y+pt.y)}sub(pt){return new Point(this.x-pt.x,this.y-pt.y)}mul(pt){return new Point(this.x*pt.x,this.y*pt.y)}div(pt){return new Point(this.x/pt.x,this.y/pt.y)}abs(){return new Point(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))}floor(){return new Point(Math.floor(this.x),Math.floor(this.y))}},Box=class{static isRect(rect){return!!rect&&[rect.x,rect.y,rect.width,rect.height].every(isValidNumber)}static assertIsValidBox(box,callee,allowNegativeDimensions=!1){if(!Box.isRect(box))throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);if(!allowNegativeDimensions&&(box.width<0||box.height<0))throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`)}constructor(_box,allowNegativeDimensions=!0){let box=_box||{},isBbox=[box.left,box.top,box.right,box.bottom].every(isValidNumber),isRect=[box.x,box.y,box.width,box.height].every(isValidNumber);if(!isRect&&!isBbox)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);let[x,y,width,height]=isRect?[box.x,box.y,box.width,box.height]:[box.left,box.top,box.right-box.left,box.bottom-box.top];Box.assertIsValidBox({x,y,width,height},"Box.constructor",allowNegativeDimensions),this._x=x,this._y=y,this._width=width,this._height=height}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Point(this.left,this.top)}get topRight(){return new Point(this.right,this.top)}get bottomLeft(){return new Point(this.left,this.bottom)}get bottomRight(){return new Point(this.right,this.bottom)}round(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.round(val));return new Box({x,y,width,height})}floor(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.floor(val));return new Box({x,y,width,height})}toSquare(){let{x,y,width,height}=this,diff=Math.abs(width-height);return widthimageWidth&&(edx=-ex+imageWidth+w,ex=imageWidth),ey>imageHeight&&(edy=-ey+imageHeight+h,ey=imageHeight),x<1&&(edy=2-x,x=1),y<1&&(edy=2-y,y=1),{dy,edy,dx,edx,y,ey,x,ex,w,h}}calibrate(region){return new Box({left:this.left+region.left*this.width,top:this.top+region.top*this.height,right:this.right+region.right*this.width,bottom:this.bottom+region.bottom*this.height}).toSquare().round()}},BoundingBox=class extends Box{constructor(left,top,right,bottom,allowNegativeDimensions=!1){super({left,top,right,bottom},allowNegativeDimensions)}};var ObjectDetection=class{constructor(score,classScore,className,relativeBox,imageDims){this._imageDims=new Dimensions(imageDims.width,imageDims.height),this._score=score,this._classScore=classScore,this._className=className,this._box=new Box(relativeBox).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new Box(this._box).rescale(this.imageDims.reverse())}forSize(width,height){return new ObjectDetection(this.score,this.classScore,this.className,this.relativeBox,{width,height})}},FaceDetection=class extends ObjectDetection{constructor(score,relativeBox,imageDims){super(score,score,"",relativeBox,imageDims)}forSize(width,height){let{score,relativeBox,imageDims}=super.forSize(width,height);return new FaceDetection(score,relativeBox,imageDims)}};function iou(box1,box2,isIOU=!0){let width=Math.max(0,Math.min(box1.right,box2.right)-Math.max(box1.left,box2.left)),height=Math.max(0,Math.min(box1.bottom,box2.bottom)-Math.max(box1.top,box2.top)),interSection=width*height;return isIOU?interSection/(box1.area+box2.area-interSection):interSection/Math.min(box1.area,box2.area)}function minBbox(pts){let xs=pts.map(pt=>pt.x),ys=pts.map(pt=>pt.y),minX=xs.reduce((min,x)=>xymaxmax({score,boxIndex})).sort((c1,c2)=>c1.score-c2.score).map(c=>c.boxIndex),pick=[];for(;indicesSortedByScore.length>0;){let curr=indicesSortedByScore.pop();pick.push(curr);let indices=indicesSortedByScore,outputs=[];for(let i=0;ioutputs[j]<=iouThreshold)}return pick}var tf2=__toModule(require_tfjs_esm());function normalize(x,meanRgb){return tf2.tidy(()=>{let[r,g,b]=meanRgb,avg_r=tf2.fill([...x.shape.slice(0,3),1],r,"float32"),avg_g=tf2.fill([...x.shape.slice(0,3),1],g,"float32"),avg_b=tf2.fill([...x.shape.slice(0,3),1],b,"float32"),avg_rgb=tf2.concat([avg_r,avg_g,avg_b],3);return tf2.sub(x,avg_rgb)})}var tf3=__toModule(require_tfjs_esm());function padToSquare(imgTensor,isCenterImage=!1){return tf3.tidy(()=>{let[height,width]=imgTensor.shape.slice(1);if(height===width)return imgTensor;let dimDiff=Math.abs(height-width),paddingAmount=Math.round(dimDiff*(isCenterImage?.5:1)),paddingAxis=height>width?2:1,createPaddingTensor=paddingAmount2=>{let paddingTensorShape=imgTensor.shape.slice();return paddingTensorShape[paddingAxis]=paddingAmount2,tf3.fill(paddingTensorShape,0,"float32")},paddingTensorAppend=createPaddingTensor(paddingAmount),remainingPaddingAmount=dimDiff-paddingTensorAppend.shape[paddingAxis],paddingTensorPrepend=isCenterImage&&remainingPaddingAmount?createPaddingTensor(remainingPaddingAmount):null,tensorsToStack=[paddingTensorPrepend,imgTensor,paddingTensorAppend].filter(t=>!!t).map(t=>tf3.cast(t,"float32"));return tf3.concat(tensorsToStack,paddingAxis)})}function shuffleArray(inputArray){let array=inputArray.slice();for(let i=array.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1)),x=array[i];array[i]=array[j],array[j]=x}return array}function sigmoid(x){return 1/(1+Math.exp(-x))}function inverseSigmoid(x){return Math.log(x/(1-x))}var Rect=class extends Box{constructor(x,y,width,height,allowNegativeDimensions=!1){super({x,y,width,height},allowNegativeDimensions)}},relX=.5,relY=.43,relScale=.45,FaceLandmarks=class{constructor(relativeFaceLandmarkPositions,imgDims,shift=new Point(0,0)){let{width,height}=imgDims;this._imgDims=new Dimensions(width,height),this._shift=shift,this._positions=relativeFaceLandmarkPositions.map(pt=>pt.mul(new Point(width,height)).add(shift))}get shift(){return new Point(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(pt=>pt.sub(this._shift).div(new Point(this.imageWidth,this.imageHeight)))}forSize(width,height){return new this.constructor(this.relativePositions,{width,height})}shiftBy(x,y){return new this.constructor(this.relativePositions,this._imgDims,new Point(x,y))}shiftByPoint(pt){return this.shiftBy(pt.x,pt.y)}align(detection,options={}){if(detection){let box=detection instanceof FaceDetection?detection.box.floor():new Box(detection);return this.shiftBy(box.x,box.y).align(null,options)}let{useDlibAlignment,minBoxPadding}=Object.assign({},{useDlibAlignment:!1,minBoxPadding:.2},options);return useDlibAlignment?this.alignDlib():this.alignMinBbox(minBoxPadding)}alignDlib(){let centers=this.getRefPointsForAlignment(),[leftEyeCenter,rightEyeCenter,mouthCenter]=centers,distToMouth=pt=>mouthCenter.sub(pt).magnitude(),eyeToMouthDist=(distToMouth(leftEyeCenter)+distToMouth(rightEyeCenter))/2,size=Math.floor(eyeToMouthDist/relScale),refPoint=getCenterPoint(centers),x=Math.floor(Math.max(0,refPoint.x-relX*size)),y=Math.floor(Math.max(0,refPoint.y-relY*size));return new Rect(x,y,Math.min(size,this.imageWidth+x),Math.min(size,this.imageHeight+y))}alignMinBbox(padding){let box=minBbox(this.positions);return box.pad(box.width*padding,box.height*padding)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var FaceLandmarks5=class extends FaceLandmarks{getRefPointsForAlignment(){let pts=this.positions;return[pts[0],pts[1],getCenterPoint([pts[3],pts[4]])]}};var FaceLandmarks68=class extends FaceLandmarks{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(getCenterPoint)}};var FaceMatch=class{constructor(label,distance){this._label=label,this._distance=distance}get label(){return this._label}get distance(){return this._distance}toString(withDistance=!0){return`${this.label}${withDistance?` (${round(this.distance)})`:""}`}};var LabeledBox=class extends Box{static assertIsValidLabeledBox(box,callee){if(Box.assertIsValidBox(box,callee),!isValidNumber(box.label))throw new Error(`${callee} - expected property label (${box.label}) to be a number`)}constructor(box,label){super(box);this._label=label}get label(){return this._label}};var LabeledFaceDescriptors=class{constructor(label,descriptors){if(!(typeof label=="string"))throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(descriptors)||descriptors.some(desc=>!(desc instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=label,this._descriptors=descriptors}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(d=>Array.from(d))}}static fromJSON(json){let descriptors=json.descriptors.map(d=>new Float32Array(d));return new LabeledFaceDescriptors(json.label,descriptors)}};var PredictedBox=class extends LabeledBox{static assertIsValidPredictedBox(box,callee){if(LabeledBox.assertIsValidLabeledBox(box,callee),!isValidProbablitiy(box.score)||!isValidProbablitiy(box.classScore))throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`)}constructor(box,label,score,classScore){super(box,label);this._score=score,this._classScore=classScore}get score(){return this._score}get classScore(){return this._classScore}};function isWithFaceDetection(obj){return obj.detection instanceof FaceDetection}function extendWithFaceDetection(sourceObj,detection){let extension={detection};return Object.assign({},sourceObj,extension)}function createBrowserEnv(){let fetch=window.fetch||function(){throw new Error("fetch - missing fetch implementation for browser environment")},readFile=function(){throw new Error("readFile - filesystem not available for browser environment")};return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch,readFile}}function createFileSystem(fs){let requireFsError="";if(!fs)try{fs=require("fs")}catch(err){requireFsError=err.toString()}let readFile=fs?function(filePath){return new Promise((res,rej)=>{fs.readFile(filePath,function(err,buffer){return err?rej(err):res(buffer)})})}:function(){throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)};return{readFile}}function createNodejsEnv(){let Canvas=global.Canvas||global.HTMLCanvasElement,Image=global.Image||global.HTMLImageElement,createCanvasElement=function(){if(Canvas)return new Canvas;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},createImageElement=function(){if(Image)return new Image;throw new Error("createImageElement - missing Image implementation for nodejs environment")},fetch=global.fetch||function(){throw new Error("fetch - missing fetch implementation for nodejs environment")},fileSystem=createFileSystem();return{Canvas:Canvas||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:Image||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement,createImageElement,fetch,...fileSystem}}function isBrowser(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var isNodejs=__toModule(require_isNodejs()),environment;function getEnv(){if(!environment)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return environment}function setEnv(env16){environment=env16}function initialize(){if(isBrowser())return setEnv(createBrowserEnv());if(isNodejs.isNodejs())return setEnv(createNodejsEnv())}function monkeyPatch(env16){if(environment||initialize(),!environment)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas=environment.Canvas,Image=environment.Image}=env16;environment.Canvas=Canvas,environment.Image=Image,environment.createCanvasElement=env16.createCanvasElement||(()=>new Canvas),environment.createImageElement=env16.createImageElement||(()=>new Image),environment.ImageData=env16.ImageData||environment.ImageData,environment.Video=env16.Video||environment.Video,environment.fetch=env16.fetch||environment.fetch,environment.readFile=env16.readFile||environment.readFile}var env={getEnv,setEnv,initialize,createBrowserEnv,createFileSystem,createNodejsEnv,monkeyPatch,isBrowser,isNodejs:isNodejs.isNodejs};initialize();function resolveInput(arg){return!env.isNodejs()&&typeof arg=="string"?document.getElementById(arg):arg}function getContext2dOrThrow(canvasArg){let{Canvas,CanvasRenderingContext2D:CanvasRenderingContext2D2}=env.getEnv();if(canvasArg instanceof CanvasRenderingContext2D2)return canvasArg;let canvas=resolveInput(canvasArg);if(!(canvas instanceof Canvas))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let ctx=canvas.getContext("2d");if(!ctx)throw new Error("resolveContext2d - canvas 2d context is null");return ctx}var AnchorPosition;(function(AnchorPosition2){AnchorPosition2.TOP_LEFT="TOP_LEFT",AnchorPosition2.TOP_RIGHT="TOP_RIGHT",AnchorPosition2.BOTTOM_LEFT="BOTTOM_LEFT",AnchorPosition2.BOTTOM_RIGHT="BOTTOM_RIGHT"})(AnchorPosition||(AnchorPosition={}));var DrawTextFieldOptions=class{constructor(options={}){let{anchorPosition,backgroundColor,fontColor,fontSize,fontStyle,padding}=options;this.anchorPosition=anchorPosition||AnchorPosition.TOP_LEFT,this.backgroundColor=backgroundColor||"rgba(0, 0, 0, 0.5)",this.fontColor=fontColor||"rgba(255, 255, 255, 1)",this.fontSize=fontSize||14,this.fontStyle=fontStyle||"Georgia",this.padding=padding||4}},DrawTextField=class{constructor(text,anchor,options={}){this.text=typeof text=="string"?[text]:text instanceof DrawTextField?text.text:text,this.anchor=anchor,this.options=new DrawTextFieldOptions(options)}measureWidth(ctx){let{padding}=this.options;return this.text.map(l=>ctx.measureText(l).width).reduce((w0,w1)=>w0{let x=padding+upperLeft.x,y=padding+upperLeft.y+(i+1)*fontSize;ctx.fillText(textLine,x,y)})}},DrawBoxOptions=class{constructor(options={}){let{boxColor,lineWidth,label,drawLabelOptions}=options;this.boxColor=boxColor||"rgba(0, 0, 255, 1)",this.lineWidth=lineWidth||2,this.label=label;let defaultDrawLabelOptions={anchorPosition:AnchorPosition.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new DrawTextFieldOptions(Object.assign({},defaultDrawLabelOptions,drawLabelOptions))}},DrawBox=class{constructor(box,options={}){this.box=new Box(box),this.options=new DrawBoxOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{boxColor,lineWidth}=this.options,{x,y,width,height}=this.box;ctx.strokeStyle=boxColor,ctx.lineWidth=lineWidth,ctx.strokeRect(x,y,width,height);let{label}=this.options;label&&new DrawTextField([label],{x:x-lineWidth/2,y},this.options.drawLabelOptions).draw(canvasArg)}};function drawDetections(canvasArg,detections){let detectionsArray=Array.isArray(detections)?detections:[detections];detectionsArray.forEach(det=>{let score=det instanceof FaceDetection?det.score:isWithFaceDetection(det)?det.detection.score:void 0,box=det instanceof FaceDetection?det.box:isWithFaceDetection(det)?det.detection.box:new Box(det),label=score?`${round(score)}`:void 0;new DrawBox(box,{label}).draw(canvasArg)})}var tf18=__toModule(require_tfjs_esm());function isMediaLoaded(media){let{Image,Video}=env.getEnv();return media instanceof Image&&media.complete||media instanceof Video&&media.readyState>=3}function awaitMediaLoaded(media){return new Promise((resolve,reject)=>{if(media instanceof env.getEnv().Canvas||isMediaLoaded(media))return resolve(null);function onLoad(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),resolve(e)}function onError(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),reject(e)}media.addEventListener("load",onLoad),media.addEventListener("error",onError)})}function bufferToImage(buf){return new Promise((resolve,reject)=>{if(!(buf instanceof Blob))return reject("bufferToImage - expected buf to be of type: Blob");let reader=new FileReader;reader.onload=()=>{if(typeof reader.result!="string")return reject("bufferToImage - expected reader.result to be a string, in onload");let img=env.getEnv().createImageElement();img.onload=()=>resolve(img),img.onerror=reject,img.src=reader.result},reader.onerror=reject,reader.readAsDataURL(buf)})}function getMediaDimensions(input){let{Image,Video}=env.getEnv();return input instanceof Image?new Dimensions(input.naturalWidth,input.naturalHeight):input instanceof Video?new Dimensions(input.videoWidth,input.videoHeight):new Dimensions(input.width,input.height)}function createCanvas({width,height}){let{createCanvasElement}=env.getEnv(),canvas=createCanvasElement();return canvas.width=width,canvas.height=height,canvas}function createCanvasFromMedia(media,dims){let{ImageData:ImageData2}=env.getEnv();if(!(media instanceof ImageData2)&&!isMediaLoaded(media))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width,height}=dims||getMediaDimensions(media),canvas=createCanvas({width,height});return media instanceof ImageData2?getContext2dOrThrow(canvas).putImageData(media,0,0):getContext2dOrThrow(canvas).drawImage(media,0,0,width,height),canvas}var tf4=__toModule(require_tfjs_esm());async function imageTensorToCanvas(imgTensor,canvas){let targetCanvas=canvas||env.getEnv().createCanvasElement(),[height,width,numChannels]=imgTensor.shape.slice(isTensor4D(imgTensor)?1:0),imgTensor3D=tf4.tidy(()=>imgTensor.as3D(height,width,numChannels).toInt());return await tf4.browser.toPixels(imgTensor3D,targetCanvas),imgTensor3D.dispose(),targetCanvas}function isMediaElement(input){let{Image,Canvas,Video}=env.getEnv();return input instanceof Image||input instanceof Canvas||input instanceof Video}var tf5=__toModule(require("@tensorflow/tfjs-core"));function imageToSquare(input,inputSize,centerImage=!1){let{Image,Canvas}=env.getEnv();if(!(input instanceof Image||input instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input),scale2=inputSize/Math.max(dims.height,dims.width),width=scale2*dims.width,height=scale2*dims.height,targetCanvas=createCanvas({width:inputSize,height:inputSize}),inputCanvas=input instanceof Canvas?input:createCanvasFromMedia(input),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input)){this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape;return}if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape.slice(1);return}let canvas=input instanceof env.getEnv().Canvas?input:createCanvasFromMedia(input);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tf5.tidy(()=>{let inputTensors=range(this.batchSize,0,1).map(batchIdx=>{let input=this.getInput(batchIdx);if(input instanceof tf5.Tensor){let imgTensor=isTensor4D(input)?input:input.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=tf5.image.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input instanceof env.getEnv().Canvas)return tf5.browser.fromPixels(imageToSquare(input,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`)}),batchTensor=tf5.stack(inputTensors.map(t=>tf5.cast(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input,i)=>{if(!isMediaElement(input)&&!isTensor3D(input)&&!isTensor4D(input))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input=>isMediaElement(input)&&awaitMediaLoaded(input))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input,detections){let{Canvas}=env.getEnv(),canvas=input;if(!(input instanceof Canvas)){let netInput=await toNetInput(input);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}var tf6=__toModule(require_tfjs_esm());async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tf6.tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>tf6.slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init){let fetch=env.getEnv().fetch,res=await fetch(url,init);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}var tf7=__toModule(require_tfjs_esm());function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return tf7.io.loadWeights(manifest,modelBaseUri)}function matchDimensions(input,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input.width=width,input.height=height,{width,height}}var tf15=__toModule(require_tfjs_esm()),tf8=__toModule(require_tfjs_esm()),NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor2){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor2}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof tf8.Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof tf8.Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor2})=>{this.reassignParamFromPath(path,tensor2.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable})=>{let tensor2=tf8.tensor(variable.dataSync());variable.dispose(),this.reassignParamFromPath(path,tensor2)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor2})=>Array.from(tensor2.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights=tf8.io.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof tf8.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}},tf10=__toModule(require_tfjs_esm()),tf9=__toModule(require_tfjs_esm());function depthwiseSeparableConv(x,params,stride){return tf9.tidy(()=>{let out=tf9.separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=tf9.add(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=tf10.relu(tf10.add(out1,tf10.add(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,tf10.add(out3,out4))))})}var tf11=__toModule(require_tfjs_esm());function convLayer(x,params,padding="same",withRelu=!1){return tf11.tidy(()=>{let out=tf11.add(tf11.conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?tf11.relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}var tf12=__toModule(require_tfjs_esm());function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tf12.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf12.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}var tf13=__toModule(require_tfjs_esm());function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tf13.tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tf13.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var tf14=__toModule(require_tfjs_esm()),SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tf14.tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tf14.tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tf14.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor2=weightMap[originalPath];if(!isTensor(tensor2,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor2}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tf15.tidy(()=>{let batchTensor=tf15.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf15.scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=tf15.avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}},tf17=__toModule(require_tfjs_esm()),tf16=__toModule(require_tfjs_esm());function fullyConnectedLayer(x,params){return tf16.tidy(()=>tf16.add(tf16.matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf17.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input){return tf18.tidy(()=>tf18.softmax(this.runNet(input)))}async forward(input){return this.forwardInput(await toNetInput(input))}async predictExpressions(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(tf18.unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}var tf20=__toModule(require_tfjs_esm()),tf19=__toModule(require_tfjs_esm());function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return tf19.add(tf19.conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?tf19.relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=tf19.maxPool(out,[3,3],[2,2],"same"),out=tf19.add(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(tf19.relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv2,[1,1]),out=tf19.add(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tf19.tidy(()=>{let batchTensor=tf19.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf19.scalar(256)),out=tf19.relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=tf19.relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf20.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input,pooled=tf20.avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input){return tf20.tidy(()=>{let{age,gender}=this.runNet(input);return{age,gender:tf20.softmax(gender)}})}async forward(input){return this.forwardInput(await toNetInput(input))}async predictAgeAndGender(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),ages=tf20.unstack(out.age),genders=tf20.unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var tf21=__toModule(require_tfjs_esm()),FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale2=inputSize/Math.max(height,width);return{width:width*scale2,height:height*scale2}}),batchSize=inputDimensions.length;return tf21.tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>tf21.stack([tf21.fill([68],fillX,"float32"),tf21.fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding(batchIdx,(w,h)=>wgetPadding(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input){return tf21.tidy(()=>{let out=this.runNet(input);return this.postProcess(out,input.inputSize,input.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input){return this.forwardInput(await toNetInput(input))}async detectLandmarks(input){let netInput=await toNetInput(input),landmarkTensors=tf21.tidy(()=>tf21.unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven(i)),yCoords=landmarksArray.filter((_,i)=>!isEven(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var tf22=__toModule(require_tfjs_esm());function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tf22.tidy(()=>{let batchTensor=tf22.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf22.scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=tf22.avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};var tf27=__toModule(require_tfjs_esm()),tf24=__toModule(require_tfjs_esm()),tf23=__toModule(require_tfjs_esm());function scale(x,params){return tf23.add(tf23.mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=tf24.conv2d(x,filters,strides,padding);return out=tf24.add(out,bias),out=scale(out,params.scale),withRelu?tf24.relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}var tf25=__toModule(require_tfjs_esm());function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tf25.tidy(()=>tf25.transpose(tf25.tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tf25.tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tf25.tensor1d(extractWeights(numWeights)),biases=tf25.tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale2=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale2}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tf25.tidy(()=>tf25.transpose(tf25.tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale2=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale2}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf26=__toModule(require_tfjs_esm());function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=tf26.add(out,x),out=tf26.relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=tf26.avgPool(x,2,2,"valid"),zeros2=tf26.zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=tf26.zeros(padShapeX);out=tf26.concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=tf26.zeros(padShapeY);out=tf26.concat([out,zerosH],2)}return pooled=isPad?tf26.concat([pooled,zeros2],3):pooled,out=tf26.add(pooled,out),out=tf26.relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tf27.tidy(()=>{let batchTensor=tf27.cast(input.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf27.scalar(256)),out=convDown(normalized,params.conv32_down);out=tf27.maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=tf27.matMul(globalAvg,params.fc);return fullyConnected})}async forward(input){return this.forwardInput(await toNetInput(input))}async computeFaceDescriptor(input){let netInput=await toNetInput(input),faceDescriptorTensors=tf27.tidy(()=>tf27.unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}var tf34=__toModule(require_tfjs_esm()),tf28=__toModule(require_tfjs_esm());function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tf28.tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tf28.tensor1d(extractWeights(numChannels)),batch_norm_offset=tf28.tensor1d(extractWeights(numChannels)),batch_norm_mean=tf28.tensor1d(extractWeights(numChannels)),batch_norm_variance=tf28.tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tf28.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf28.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tf28.tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf30=__toModule(require_tfjs_esm()),tf29=__toModule(require_tfjs_esm());function pointwiseConvLayer(x,params,strides){return tf29.tidy(()=>{let out=tf29.conv2d(x,params.filters,strides,"same");return out=tf29.add(out,params.batch_norm_offset),tf29.clipByValue(out,0,6)})}var epsilon=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tf30.tidy(()=>{let out=tf30.depthwiseConv2d(x,params.filters,strides,"same");return out=tf30.batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon),tf30.clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tf30.tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}var tf31=__toModule(require_tfjs_esm());function getCenterCoordinatesAndSizesLayer(x){let vec=tf31.unstack(tf31.transpose(x,[1,0])),sizes=[tf31.sub(vec[2],vec[0]),tf31.sub(vec[3],vec[1])],centers=[tf31.add(vec[0],tf31.div(sizes[0],tf31.scalar(2))),tf31.add(vec[1],tf31.div(sizes[1],tf31.scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=tf31.unstack(tf31.transpose(x1,[1,0])),div0_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2],tf31.scalar(5))),sizes[0]),tf31.scalar(2)),add0_out=tf31.add(tf31.mul(tf31.div(vec[0],tf31.scalar(10)),sizes[0]),centers[0]),div1_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3],tf31.scalar(5))),sizes[1]),tf31.scalar(2)),add1_out=tf31.add(tf31.mul(tf31.div(vec[1],tf31.scalar(10)),sizes[1]),centers[1]);return tf31.transpose(tf31.stack([tf31.sub(add0_out,div0_out),tf31.sub(add1_out,div1_out),tf31.add(add0_out,div0_out),tf31.add(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tf31.tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim,[batchSize,1,1]),[-1,4]),tf31.reshape(boxPredictions,[-1,4]));boxes=tf31.reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=tf31.sigmoid(tf31.slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=tf31.slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=tf31.reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=tf31.unstack(boxes),scoresByBatch=tf31.unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}var tf33=__toModule(require_tfjs_esm()),tf32=__toModule(require_tfjs_esm());function boxPredictionLayer(x,params){return tf32.tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=tf32.reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=tf32.reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tf33.tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=tf33.concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=tf33.concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tf34.tidy(()=>{let batchTensor=tf34.cast(input.toBatchTensor(512,!1),"float32"),x=tf34.sub(tf34.mul(batchTensor,tf34.scalar(.007843137718737125)),tf34.scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input){return this.forwardInput(await toNetInput(input))}async locateFaces(input,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression2(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",tf39=__toModule(require_tfjs_esm()),isNumber=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber(a.x)&&isNumber(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}var tf36=__toModule(require_tfjs_esm()),tf35=__toModule(require_tfjs_esm());function leaky(x){return tf35.tidy(()=>{let min=tf35.mul(x,tf35.scalar(.10000000149011612));return tf35.add(tf35.relu(tf35.sub(x,min)),min)})}function convWithBatchNorm(x,params){return tf36.tidy(()=>{let out=tf36.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf36.conv2d(out,params.conv.filters,[1,1],"valid"),out=tf36.sub(out,params.bn.sub),out=tf36.mul(out,params.bn.truediv),out=tf36.add(out,params.conv.bias),leaky(out)})}var tf37=__toModule(require_tfjs_esm());function depthwiseSeparableConv3(x,params){return tf37.tidy(()=>{let out=tf37.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf37.separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=tf37.add(out,params.bias),leaky(out)})}var tf38=__toModule(require_tfjs_esm());function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub6=tf38.tensor1d(extractWeights(size)),truediv=tf38.tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub6,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub6=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub6,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tf39.tidy(()=>{let batchTensor=tf39.cast(input.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(tf39.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input,inputSize){return await this.forwardInput(await toNetInput(input),inputSize)}async detect(input,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input),out=await this.forwardInput(netInput,inputSize),out0=tf39.tidy(()=>tf39.unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tf39.tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?tf39.softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):tf39.scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max,curr)=>max.classScore>curr.classScore?max:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}},tf41=__toModule(require_tfjs_esm()),tf40=__toModule(require_tfjs_esm());async function extractAllFacesAndComputeResults(parentResults,input,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input instanceof tf40.Tensor?await extractFaceTensors(input,faceBoxes):await extractFaces(input,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof tf40.Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input,options)=>nets.ssdMobilenetv1.locateFaces(input,options),tinyFaceDetector=(input,options)=>nets.tinyFaceDetector.locateFaces(input,options),tinyYolov23=(input,options)=>nets.tinyYolov2.locateFaces(input,options),detectFaceLandmarks=input=>nets.faceLandmark68Net.detectLandmarks(input),detectFaceLandmarksTiny=input=>nets.faceLandmark68TinyNet.detectLandmarks(input),computeFaceDescriptor=input=>nets.faceRecognitionNet.computeFaceDescriptor(input),recognizeFaceExpressions=input=>nets.faceExpressionNet.predictExpressions(input),predictAgeAndGender=input=>nets.ageGenderNet.predictAgeAndGender(input),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input){super();this.parentTask=parentTask;this.input=input}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input,options=new SsdMobilenetv1Options){super();this.input=input;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input2=>nets.tinyFaceDetector.locateFaces(input2,options):options instanceof SsdMobilenetv1Options?input2=>nets.ssdMobilenetv1.locateFaces(input2,options):options instanceof TinyYolov2Options?input2=>nets.tinyYolov2.locateFaces(input2,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input,options)}function detectAllFaces(input,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input,options)}async function allFacesSsdMobilenetv1(input,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count=1,createUniqueLabel=()=>`person ${count++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json){let labeledDescriptors=json.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version="0.8.9",node=typeof process!="undefined",browser3=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version2={faceapi:version,node,browser:browser3}; +var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__markAsModule=target=>__defProp(target,"__esModule",{value:!0}),__commonJS=(callback,module2)=>()=>(module2||(module2={exports:{}},callback(module2.exports,module2)),module2.exports),__export=(target,all)=>{__markAsModule(target);for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__exportStar=(target,module2,desc)=>{if(__markAsModule(target),module2&&typeof module2=="object"||typeof module2=="function")for(let key of __getOwnPropNames(module2))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module2[key],enumerable:!(desc=__getOwnPropDesc(module2,key))||desc.enumerable});return target},__toModule=module2=>module2&&module2.__esModule?module2:__exportStar(__defProp(module2!=null?__create(__getProtoOf(module2)):{},"default",{value:module2,enumerable:!0}),module2),require_tfjs_esm=__commonJS(exports2=>{var __create2=Object.create,__defProp2=Object.defineProperty,__getProtoOf2=Object.getPrototypeOf,__hasOwnProp2=Object.prototype.hasOwnProperty,__getOwnPropNames2=Object.getOwnPropertyNames,__getOwnPropDesc2=Object.getOwnPropertyDescriptor,__markAsModule2=target=>__defProp2(target,"__esModule",{value:!0}),__exportStar2=(target,module22,desc)=>{if(__markAsModule2(target),module22&&typeof module22=="object"||typeof module22=="function")for(let key of __getOwnPropNames2(module22))!__hasOwnProp2.call(target,key)&&key!=="default"&&__defProp2(target,key,{get:()=>module22[key],enumerable:!(desc=__getOwnPropDesc2(module22,key))||desc.enumerable});return target},__toModule2=module22=>module22&&module22.__esModule?module22:__exportStar2(__defProp2(module22!=null?__create2(__getProtoOf2(module22)):{},"default",{value:module22,enumerable:!0}),module22);__exportStar2(exports2,__toModule2(require("@tensorflow/tfjs-node")))}),require_isNodejs=__commonJS((exports2,module2)=>{__export(exports2,{isNodejs:()=>isNodejs3});function isNodejs3(){return typeof global=="object"&&!0&&typeof module2!="undefined"&&typeof process!="undefined"&&!!process.version}});__export(exports,{AgeGenderNet:()=>AgeGenderNet,BoundingBox:()=>BoundingBox,Box:()=>Box,ComposableTask:()=>ComposableTask,ComputeAllFaceDescriptorsTask:()=>ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase:()=>ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask:()=>ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask:()=>DetectAllFaceLandmarksTask,DetectAllFacesTask:()=>DetectAllFacesTask,DetectFaceLandmarksTaskBase:()=>DetectFaceLandmarksTaskBase,DetectFacesTaskBase:()=>DetectFacesTaskBase,DetectSingleFaceLandmarksTask:()=>DetectSingleFaceLandmarksTask,DetectSingleFaceTask:()=>DetectSingleFaceTask,Dimensions:()=>Dimensions,FACE_EXPRESSION_LABELS:()=>FACE_EXPRESSION_LABELS,FaceDetection:()=>FaceDetection,FaceDetectionNet:()=>FaceDetectionNet,FaceExpressionNet:()=>FaceExpressionNet,FaceExpressions:()=>FaceExpressions,FaceLandmark68Net:()=>FaceLandmark68Net,FaceLandmark68TinyNet:()=>FaceLandmark68TinyNet,FaceLandmarkNet:()=>FaceLandmarkNet,FaceLandmarks:()=>FaceLandmarks,FaceLandmarks5:()=>FaceLandmarks5,FaceLandmarks68:()=>FaceLandmarks68,FaceMatch:()=>FaceMatch,FaceMatcher:()=>FaceMatcher,FaceRecognitionNet:()=>FaceRecognitionNet,Gender:()=>Gender,LabeledBox:()=>LabeledBox,LabeledFaceDescriptors:()=>LabeledFaceDescriptors,NetInput:()=>NetInput,NeuralNetwork:()=>NeuralNetwork,ObjectDetection:()=>ObjectDetection,Point:()=>Point,PredictedBox:()=>PredictedBox,Rect:()=>Rect,SsdMobilenetv1:()=>SsdMobilenetv1,SsdMobilenetv1Options:()=>SsdMobilenetv1Options,TinyFaceDetector:()=>TinyFaceDetector,TinyFaceDetectorOptions:()=>TinyFaceDetectorOptions,TinyYolov2:()=>TinyYolov2,TinyYolov2Options:()=>TinyYolov2Options,TinyYolov2SizeType:()=>TinyYolov2SizeType,allFaces:()=>allFaces,allFacesSsdMobilenetv1:()=>allFacesSsdMobilenetv1,allFacesTinyYolov2:()=>allFacesTinyYolov2,awaitMediaLoaded:()=>awaitMediaLoaded,bufferToImage:()=>bufferToImage,computeFaceDescriptor:()=>computeFaceDescriptor,createCanvas:()=>createCanvas,createCanvasFromMedia:()=>createCanvasFromMedia,createFaceDetectionNet:()=>createFaceDetectionNet,createFaceRecognitionNet:()=>createFaceRecognitionNet,createSsdMobilenetv1:()=>createSsdMobilenetv1,createTinyFaceDetector:()=>createTinyFaceDetector,createTinyYolov2:()=>createTinyYolov2,detectAllFaces:()=>detectAllFaces,detectFaceLandmarks:()=>detectFaceLandmarks,detectFaceLandmarksTiny:()=>detectFaceLandmarksTiny,detectLandmarks:()=>detectLandmarks,detectSingleFace:()=>detectSingleFace,draw:()=>draw_exports,env:()=>env,euclideanDistance:()=>euclideanDistance,extendWithAge:()=>extendWithAge,extendWithFaceDescriptor:()=>extendWithFaceDescriptor,extendWithFaceDetection:()=>extendWithFaceDetection,extendWithFaceExpressions:()=>extendWithFaceExpressions,extendWithFaceLandmarks:()=>extendWithFaceLandmarks,extendWithGender:()=>extendWithGender,extractFaceTensors:()=>extractFaceTensors,extractFaces:()=>extractFaces,fetchImage:()=>fetchImage,fetchJson:()=>fetchJson,fetchNetWeights:()=>fetchNetWeights,fetchOrThrow:()=>fetchOrThrow,getContext2dOrThrow:()=>getContext2dOrThrow,getMediaDimensions:()=>getMediaDimensions,imageTensorToCanvas:()=>imageTensorToCanvas,imageToSquare:()=>imageToSquare,inverseSigmoid:()=>inverseSigmoid,iou:()=>iou,isMediaElement:()=>isMediaElement,isMediaLoaded:()=>isMediaLoaded,isWithAge:()=>isWithAge,isWithFaceDetection:()=>isWithFaceDetection,isWithFaceExpressions:()=>isWithFaceExpressions,isWithFaceLandmarks:()=>isWithFaceLandmarks,isWithGender:()=>isWithGender,loadAgeGenderModel:()=>loadAgeGenderModel,loadFaceDetectionModel:()=>loadFaceDetectionModel,loadFaceExpressionModel:()=>loadFaceExpressionModel,loadFaceLandmarkModel:()=>loadFaceLandmarkModel,loadFaceLandmarkTinyModel:()=>loadFaceLandmarkTinyModel,loadFaceRecognitionModel:()=>loadFaceRecognitionModel,loadSsdMobilenetv1Model:()=>loadSsdMobilenetv1Model,loadTinyFaceDetectorModel:()=>loadTinyFaceDetectorModel,loadTinyYolov2Model:()=>loadTinyYolov2Model,loadWeightMap:()=>loadWeightMap,locateFaces:()=>locateFaces,matchDimensions:()=>matchDimensions,minBbox:()=>minBbox,nets:()=>nets,nonMaxSuppression:()=>nonMaxSuppression,normalize:()=>normalize,padToSquare:()=>padToSquare,predictAgeAndGender:()=>predictAgeAndGender,recognizeFaceExpressions:()=>recognizeFaceExpressions,resizeResults:()=>resizeResults,resolveInput:()=>resolveInput,shuffleArray:()=>shuffleArray,sigmoid:()=>sigmoid,ssdMobilenetv1:()=>ssdMobilenetv1,tf:()=>tf42,tinyFaceDetector:()=>tinyFaceDetector,tinyYolov2:()=>tinyYolov23,toNetInput:()=>toNetInput,utils:()=>utils_exports,validateConfig:()=>validateConfig,version:()=>version2});var tf42=__toModule(require_tfjs_esm()),draw_exports={};__export(draw_exports,{AnchorPosition:()=>AnchorPosition,DrawBox:()=>DrawBox,DrawBoxOptions:()=>DrawBoxOptions,DrawFaceLandmarks:()=>DrawFaceLandmarks,DrawFaceLandmarksOptions:()=>DrawFaceLandmarksOptions,DrawTextField:()=>DrawTextField,DrawTextFieldOptions:()=>DrawTextFieldOptions,drawContour:()=>drawContour,drawDetections:()=>drawDetections,drawFaceExpressions:()=>drawFaceExpressions,drawFaceLandmarks:()=>drawFaceLandmarks});function drawContour(ctx,points,isClosed=!1){if(ctx.beginPath(),points.slice(1).forEach(({x,y},prevIdx)=>{let from=points[prevIdx];ctx.moveTo(from.x,from.y),ctx.lineTo(x,y)}),isClosed){let from=points[points.length-1],to=points[0];if(!from||!to)return;ctx.moveTo(from.x,from.y),ctx.lineTo(to.x,to.y)}ctx.stroke()}var utils_exports={};__export(utils_exports,{computeReshapedDimensions:()=>computeReshapedDimensions,getCenterPoint:()=>getCenterPoint,isDimensions:()=>isDimensions,isEven:()=>isEven,isFloat:()=>isFloat,isTensor:()=>isTensor,isTensor1D:()=>isTensor1D,isTensor2D:()=>isTensor2D,isTensor3D:()=>isTensor3D,isTensor4D:()=>isTensor4D,isValidNumber:()=>isValidNumber,isValidProbablitiy:()=>isValidProbablitiy,range:()=>range,round:()=>round});var tf=__toModule(require_tfjs_esm()),Dimensions=class{constructor(width,height){if(!isValidNumber(width)||!isValidNumber(height))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width,height})}`);this._width=width,this._height=height}get width(){return this._width}get height(){return this._height}reverse(){return new Dimensions(1/this.width,1/this.height)}};function isTensor(tensor2,dim){return tensor2 instanceof tf.Tensor&&tensor2.shape.length===dim}function isTensor1D(tensor2){return isTensor(tensor2,1)}function isTensor2D(tensor2){return isTensor(tensor2,2)}function isTensor3D(tensor2){return isTensor(tensor2,3)}function isTensor4D(tensor2){return isTensor(tensor2,4)}function isFloat(num){return num%1!==0}function isEven(num){return num%2===0}function round(num,prec=2){let f=Math.pow(10,prec);return Math.floor(num*f)/f}function isDimensions(obj){return obj&&obj.width&&obj.height}function computeReshapedDimensions({width,height},inputSize){let scale2=inputSize/Math.max(height,width);return new Dimensions(Math.round(width*scale2),Math.round(height*scale2))}function getCenterPoint(pts){return pts.reduce((sum,pt)=>sum.add(pt),new Point(0,0)).div(new Point(pts.length,pts.length))}function range(num,start,step){return Array(num).fill(0).map((_,i)=>start+i*step)}function isValidNumber(num){return!!num&&num!==Infinity&&num!==-Infinity&&!isNaN(num)||num===0}function isValidProbablitiy(num){return isValidNumber(num)&&0<=num&&num<=1}var Point=class{constructor(x,y){this._x=x,this._y=y}get x(){return this._x}get y(){return this._y}add(pt){return new Point(this.x+pt.x,this.y+pt.y)}sub(pt){return new Point(this.x-pt.x,this.y-pt.y)}mul(pt){return new Point(this.x*pt.x,this.y*pt.y)}div(pt){return new Point(this.x/pt.x,this.y/pt.y)}abs(){return new Point(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))}floor(){return new Point(Math.floor(this.x),Math.floor(this.y))}},Box=class{static isRect(rect){return!!rect&&[rect.x,rect.y,rect.width,rect.height].every(isValidNumber)}static assertIsValidBox(box,callee,allowNegativeDimensions=!1){if(!Box.isRect(box))throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);if(!allowNegativeDimensions&&(box.width<0||box.height<0))throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`)}constructor(_box,allowNegativeDimensions=!0){let box=_box||{},isBbox=[box.left,box.top,box.right,box.bottom].every(isValidNumber),isRect=[box.x,box.y,box.width,box.height].every(isValidNumber);if(!isRect&&!isBbox)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);let[x,y,width,height]=isRect?[box.x,box.y,box.width,box.height]:[box.left,box.top,box.right-box.left,box.bottom-box.top];Box.assertIsValidBox({x,y,width,height},"Box.constructor",allowNegativeDimensions),this._x=x,this._y=y,this._width=width,this._height=height}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new Point(this.left,this.top)}get topRight(){return new Point(this.right,this.top)}get bottomLeft(){return new Point(this.left,this.bottom)}get bottomRight(){return new Point(this.right,this.bottom)}round(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.round(val));return new Box({x,y,width,height})}floor(){let[x,y,width,height]=[this.x,this.y,this.width,this.height].map(val=>Math.floor(val));return new Box({x,y,width,height})}toSquare(){let{x,y,width,height}=this,diff=Math.abs(width-height);return widthimageWidth&&(edx=-ex+imageWidth+w,ex=imageWidth),ey>imageHeight&&(edy=-ey+imageHeight+h,ey=imageHeight),x<1&&(edy=2-x,x=1),y<1&&(edy=2-y,y=1),{dy,edy,dx,edx,y,ey,x,ex,w,h}}calibrate(region){return new Box({left:this.left+region.left*this.width,top:this.top+region.top*this.height,right:this.right+region.right*this.width,bottom:this.bottom+region.bottom*this.height}).toSquare().round()}},BoundingBox=class extends Box{constructor(left,top,right,bottom,allowNegativeDimensions=!1){super({left,top,right,bottom},allowNegativeDimensions)}};var ObjectDetection=class{constructor(score,classScore,className,relativeBox,imageDims){this._imageDims=new Dimensions(imageDims.width,imageDims.height),this._score=score,this._classScore=classScore,this._className=className,this._box=new Box(relativeBox).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new Box(this._box).rescale(this.imageDims.reverse())}forSize(width,height){return new ObjectDetection(this.score,this.classScore,this.className,this.relativeBox,{width,height})}},FaceDetection=class extends ObjectDetection{constructor(score,relativeBox,imageDims){super(score,score,"",relativeBox,imageDims)}forSize(width,height){let{score,relativeBox,imageDims}=super.forSize(width,height);return new FaceDetection(score,relativeBox,imageDims)}};function iou(box1,box2,isIOU=!0){let width=Math.max(0,Math.min(box1.right,box2.right)-Math.max(box1.left,box2.left)),height=Math.max(0,Math.min(box1.bottom,box2.bottom)-Math.max(box1.top,box2.top)),interSection=width*height;return isIOU?interSection/(box1.area+box2.area-interSection):interSection/Math.min(box1.area,box2.area)}function minBbox(pts){let xs=pts.map(pt=>pt.x),ys=pts.map(pt=>pt.y),minX=xs.reduce((min,x)=>xymaxmax({score,boxIndex})).sort((c1,c2)=>c1.score-c2.score).map(c=>c.boxIndex),pick=[];for(;indicesSortedByScore.length>0;){let curr=indicesSortedByScore.pop();pick.push(curr);let indices=indicesSortedByScore,outputs=[];for(let i=0;ioutputs[j]<=iouThreshold)}return pick}var tf2=__toModule(require_tfjs_esm());function normalize(x,meanRgb){return tf2.tidy(()=>{let[r,g,b]=meanRgb,avg_r=tf2.fill([...x.shape.slice(0,3),1],r,"float32"),avg_g=tf2.fill([...x.shape.slice(0,3),1],g,"float32"),avg_b=tf2.fill([...x.shape.slice(0,3),1],b,"float32"),avg_rgb=tf2.concat([avg_r,avg_g,avg_b],3);return tf2.sub(x,avg_rgb)})}var tf3=__toModule(require_tfjs_esm());function padToSquare(imgTensor,isCenterImage=!1){return tf3.tidy(()=>{let[height,width]=imgTensor.shape.slice(1);if(height===width)return imgTensor;let dimDiff=Math.abs(height-width),paddingAmount=Math.round(dimDiff*(isCenterImage?.5:1)),paddingAxis=height>width?2:1,createPaddingTensor=paddingAmount2=>{let paddingTensorShape=imgTensor.shape.slice();return paddingTensorShape[paddingAxis]=paddingAmount2,tf3.fill(paddingTensorShape,0,"float32")},paddingTensorAppend=createPaddingTensor(paddingAmount),remainingPaddingAmount=dimDiff-paddingTensorAppend.shape[paddingAxis],paddingTensorPrepend=isCenterImage&&remainingPaddingAmount?createPaddingTensor(remainingPaddingAmount):null,tensorsToStack=[paddingTensorPrepend,imgTensor,paddingTensorAppend].filter(t=>!!t).map(t=>tf3.cast(t,"float32"));return tf3.concat(tensorsToStack,paddingAxis)})}function shuffleArray(inputArray){let array=inputArray.slice();for(let i=array.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1)),x=array[i];array[i]=array[j],array[j]=x}return array}function sigmoid(x){return 1/(1+Math.exp(-x))}function inverseSigmoid(x){return Math.log(x/(1-x))}var Rect=class extends Box{constructor(x,y,width,height,allowNegativeDimensions=!1){super({x,y,width,height},allowNegativeDimensions)}},relX=.5,relY=.43,relScale=.45,FaceLandmarks=class{constructor(relativeFaceLandmarkPositions,imgDims,shift=new Point(0,0)){let{width,height}=imgDims;this._imgDims=new Dimensions(width,height),this._shift=shift,this._positions=relativeFaceLandmarkPositions.map(pt=>pt.mul(new Point(width,height)).add(shift))}get shift(){return new Point(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(pt=>pt.sub(this._shift).div(new Point(this.imageWidth,this.imageHeight)))}forSize(width,height){return new this.constructor(this.relativePositions,{width,height})}shiftBy(x,y){return new this.constructor(this.relativePositions,this._imgDims,new Point(x,y))}shiftByPoint(pt){return this.shiftBy(pt.x,pt.y)}align(detection,options={}){if(detection){let box=detection instanceof FaceDetection?detection.box.floor():new Box(detection);return this.shiftBy(box.x,box.y).align(null,options)}let{useDlibAlignment,minBoxPadding}=Object.assign({},{useDlibAlignment:!1,minBoxPadding:.2},options);return useDlibAlignment?this.alignDlib():this.alignMinBbox(minBoxPadding)}alignDlib(){let centers=this.getRefPointsForAlignment(),[leftEyeCenter,rightEyeCenter,mouthCenter]=centers,distToMouth=pt=>mouthCenter.sub(pt).magnitude(),eyeToMouthDist=(distToMouth(leftEyeCenter)+distToMouth(rightEyeCenter))/2,size=Math.floor(eyeToMouthDist/relScale),refPoint=getCenterPoint(centers),x=Math.floor(Math.max(0,refPoint.x-relX*size)),y=Math.floor(Math.max(0,refPoint.y-relY*size));return new Rect(x,y,Math.min(size,this.imageWidth+x),Math.min(size,this.imageHeight+y))}alignMinBbox(padding){let box=minBbox(this.positions);return box.pad(box.width*padding,box.height*padding)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var FaceLandmarks5=class extends FaceLandmarks{getRefPointsForAlignment(){let pts=this.positions;return[pts[0],pts[1],getCenterPoint([pts[3],pts[4]])]}};var FaceLandmarks68=class extends FaceLandmarks{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(getCenterPoint)}};var FaceMatch=class{constructor(label,distance){this._label=label,this._distance=distance}get label(){return this._label}get distance(){return this._distance}toString(withDistance=!0){return`${this.label}${withDistance?` (${round(this.distance)})`:""}`}};var LabeledBox=class extends Box{static assertIsValidLabeledBox(box,callee){if(Box.assertIsValidBox(box,callee),!isValidNumber(box.label))throw new Error(`${callee} - expected property label (${box.label}) to be a number`)}constructor(box,label){super(box);this._label=label}get label(){return this._label}};var LabeledFaceDescriptors=class{constructor(label,descriptors){if(!(typeof label=="string"))throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(descriptors)||descriptors.some(desc=>!(desc instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=label,this._descriptors=descriptors}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(d=>Array.from(d))}}static fromJSON(json){let descriptors=json.descriptors.map(d=>new Float32Array(d));return new LabeledFaceDescriptors(json.label,descriptors)}};var PredictedBox=class extends LabeledBox{static assertIsValidPredictedBox(box,callee){if(LabeledBox.assertIsValidLabeledBox(box,callee),!isValidProbablitiy(box.score)||!isValidProbablitiy(box.classScore))throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`)}constructor(box,label,score,classScore){super(box,label);this._score=score,this._classScore=classScore}get score(){return this._score}get classScore(){return this._classScore}};function isWithFaceDetection(obj){return obj.detection instanceof FaceDetection}function extendWithFaceDetection(sourceObj,detection){let extension={detection};return Object.assign({},sourceObj,extension)}function createBrowserEnv(){let fetch=window.fetch||function(){throw new Error("fetch - missing fetch implementation for browser environment")},readFile=function(){throw new Error("readFile - filesystem not available for browser environment")};return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch,readFile}}function createFileSystem(fs){let requireFsError="";if(!fs)try{fs=require("fs")}catch(err){requireFsError=err.toString()}let readFile=fs?function(filePath){return new Promise((res,rej)=>{fs.readFile(filePath,function(err,buffer){return err?rej(err):res(buffer)})})}:function(){throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)};return{readFile}}function createNodejsEnv(){let Canvas=global.Canvas||global.HTMLCanvasElement,Image=global.Image||global.HTMLImageElement,createCanvasElement=function(){if(Canvas)return new Canvas;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},createImageElement=function(){if(Image)return new Image;throw new Error("createImageElement - missing Image implementation for nodejs environment")},fetch=global.fetch||function(){throw new Error("fetch - missing fetch implementation for nodejs environment")},fileSystem=createFileSystem();return{Canvas:Canvas||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:Image||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement,createImageElement,fetch,...fileSystem}}function isBrowser(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var isNodejs=__toModule(require_isNodejs()),environment;function getEnv(){if(!environment)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return environment}function setEnv(env16){environment=env16}function initialize(){if(isBrowser())return setEnv(createBrowserEnv());if(isNodejs.isNodejs())return setEnv(createNodejsEnv())}function monkeyPatch(env16){if(environment||initialize(),!environment)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas=environment.Canvas,Image=environment.Image}=env16;environment.Canvas=Canvas,environment.Image=Image,environment.createCanvasElement=env16.createCanvasElement||(()=>new Canvas),environment.createImageElement=env16.createImageElement||(()=>new Image),environment.ImageData=env16.ImageData||environment.ImageData,environment.Video=env16.Video||environment.Video,environment.fetch=env16.fetch||environment.fetch,environment.readFile=env16.readFile||environment.readFile}var env={getEnv,setEnv,initialize,createBrowserEnv,createFileSystem,createNodejsEnv,monkeyPatch,isBrowser,isNodejs:isNodejs.isNodejs};initialize();function resolveInput(arg){return!env.isNodejs()&&typeof arg=="string"?document.getElementById(arg):arg}function getContext2dOrThrow(canvasArg){let{Canvas,CanvasRenderingContext2D:CanvasRenderingContext2D2}=env.getEnv();if(canvasArg instanceof CanvasRenderingContext2D2)return canvasArg;let canvas=resolveInput(canvasArg);if(!(canvas instanceof Canvas))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let ctx=canvas.getContext("2d");if(!ctx)throw new Error("resolveContext2d - canvas 2d context is null");return ctx}var AnchorPosition;(function(AnchorPosition2){AnchorPosition2.TOP_LEFT="TOP_LEFT",AnchorPosition2.TOP_RIGHT="TOP_RIGHT",AnchorPosition2.BOTTOM_LEFT="BOTTOM_LEFT",AnchorPosition2.BOTTOM_RIGHT="BOTTOM_RIGHT"})(AnchorPosition||(AnchorPosition={}));var DrawTextFieldOptions=class{constructor(options={}){let{anchorPosition,backgroundColor,fontColor,fontSize,fontStyle,padding}=options;this.anchorPosition=anchorPosition||AnchorPosition.TOP_LEFT,this.backgroundColor=backgroundColor||"rgba(0, 0, 0, 0.5)",this.fontColor=fontColor||"rgba(255, 255, 255, 1)",this.fontSize=fontSize||14,this.fontStyle=fontStyle||"Georgia",this.padding=padding||4}},DrawTextField=class{constructor(text,anchor,options={}){this.text=typeof text=="string"?[text]:text instanceof DrawTextField?text.text:text,this.anchor=anchor,this.options=new DrawTextFieldOptions(options)}measureWidth(ctx){let{padding}=this.options;return this.text.map(l=>ctx.measureText(l).width).reduce((w0,w1)=>w0{let x=padding+upperLeft.x,y=padding+upperLeft.y+(i+1)*fontSize;ctx.fillText(textLine,x,y)})}},DrawBoxOptions=class{constructor(options={}){let{boxColor,lineWidth,label,drawLabelOptions}=options;this.boxColor=boxColor||"rgba(0, 0, 255, 1)",this.lineWidth=lineWidth||2,this.label=label;let defaultDrawLabelOptions={anchorPosition:AnchorPosition.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new DrawTextFieldOptions(Object.assign({},defaultDrawLabelOptions,drawLabelOptions))}},DrawBox=class{constructor(box,options={}){this.box=new Box(box),this.options=new DrawBoxOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{boxColor,lineWidth}=this.options,{x,y,width,height}=this.box;ctx.strokeStyle=boxColor,ctx.lineWidth=lineWidth,ctx.strokeRect(x,y,width,height);let{label}=this.options;label&&new DrawTextField([label],{x:x-lineWidth/2,y},this.options.drawLabelOptions).draw(canvasArg)}};function drawDetections(canvasArg,detections){let detectionsArray=Array.isArray(detections)?detections:[detections];detectionsArray.forEach(det=>{let score=det instanceof FaceDetection?det.score:isWithFaceDetection(det)?det.detection.score:void 0,box=det instanceof FaceDetection?det.box:isWithFaceDetection(det)?det.detection.box:new Box(det),label=score?`${round(score)}`:void 0;new DrawBox(box,{label}).draw(canvasArg)})}var tf18=__toModule(require_tfjs_esm());function isMediaLoaded(media){let{Image,Video}=env.getEnv();return media instanceof Image&&media.complete||media instanceof Video&&media.readyState>=3}function awaitMediaLoaded(media){return new Promise((resolve,reject)=>{if(media instanceof env.getEnv().Canvas||isMediaLoaded(media))return resolve(null);function onLoad(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),resolve(e)}function onError(e){if(!e.currentTarget)return;e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),reject(e)}media.addEventListener("load",onLoad),media.addEventListener("error",onError)})}function bufferToImage(buf){return new Promise((resolve,reject)=>{if(!(buf instanceof Blob))return reject("bufferToImage - expected buf to be of type: Blob");let reader=new FileReader;reader.onload=()=>{if(typeof reader.result!="string")return reject("bufferToImage - expected reader.result to be a string, in onload");let img=env.getEnv().createImageElement();img.onload=()=>resolve(img),img.onerror=reject,img.src=reader.result},reader.onerror=reject,reader.readAsDataURL(buf)})}function getMediaDimensions(input){let{Image,Video}=env.getEnv();return input instanceof Image?new Dimensions(input.naturalWidth,input.naturalHeight):input instanceof Video?new Dimensions(input.videoWidth,input.videoHeight):new Dimensions(input.width,input.height)}function createCanvas({width,height}){let{createCanvasElement}=env.getEnv(),canvas=createCanvasElement();return canvas.width=width,canvas.height=height,canvas}function createCanvasFromMedia(media,dims){let{ImageData:ImageData2}=env.getEnv();if(!(media instanceof ImageData2)&&!isMediaLoaded(media))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width,height}=dims||getMediaDimensions(media),canvas=createCanvas({width,height});return media instanceof ImageData2?getContext2dOrThrow(canvas).putImageData(media,0,0):getContext2dOrThrow(canvas).drawImage(media,0,0,width,height),canvas}var tf4=__toModule(require_tfjs_esm());async function imageTensorToCanvas(imgTensor,canvas){let targetCanvas=canvas||env.getEnv().createCanvasElement(),[height,width,numChannels]=imgTensor.shape.slice(isTensor4D(imgTensor)?1:0),imgTensor3D=tf4.tidy(()=>imgTensor.as3D(height,width,numChannels).toInt());return await tf4.browser.toPixels(imgTensor3D,targetCanvas),imgTensor3D.dispose(),targetCanvas}function isMediaElement(input){let{Image,Canvas,Video}=env.getEnv();return input instanceof Image||input instanceof Canvas||input instanceof Video}var tf5=__toModule(require("@tensorflow/tfjs-core"));function imageToSquare(input,inputSize,centerImage=!1){let{Image,Canvas}=env.getEnv();if(!(input instanceof Image||input instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input),scale2=inputSize/Math.max(dims.height,dims.width),width=scale2*dims.width,height=scale2*dims.height,targetCanvas=createCanvas({width:inputSize,height:inputSize}),inputCanvas=input instanceof Canvas?input:createCanvasFromMedia(input),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input)){this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape;return}if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape.slice(1);return}let canvas=input instanceof env.getEnv().Canvas?input:createCanvasFromMedia(input);this._canvases[idx]=canvas,this._inputDimensions[idx]=[canvas.height,canvas.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return range(this.batchSize,0,1).map((_,batchIdx)=>this.getReshapedInputDimensions(batchIdx))}getInput(batchIdx){return this.canvases[batchIdx]||this.imageTensors[batchIdx]}getInputDimensions(batchIdx){return this._inputDimensions[batchIdx]}getInputHeight(batchIdx){return this._inputDimensions[batchIdx][0]}getInputWidth(batchIdx){return this._inputDimensions[batchIdx][1]}getReshapedInputDimensions(batchIdx){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tf5.tidy(()=>{let inputTensors=range(this.batchSize,0,1).map(batchIdx=>{let input=this.getInput(batchIdx);if(input instanceof tf5.Tensor){let imgTensor=isTensor4D(input)?input:input.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=tf5.image.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input instanceof env.getEnv().Canvas)return tf5.browser.fromPixels(imageToSquare(input,inputSize,isCenterInputs));throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`)}),batchTensor=tf5.stack(inputTensors.map(t=>tf5.cast(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3);return batchTensor})}};async function toNetInput(inputs){if(inputs instanceof NetInput)return inputs;let inputArgArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArgArray.length)throw new Error("toNetInput - empty array passed as input");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input,i)=>{if(!isMediaElement(input)&&!isTensor3D(input)&&!isTensor4D(input))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(isTensor4D(input)){let batchSize=input.shape[0];if(batchSize!==1)throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)}}),await Promise.all(inputArray.map(input=>isMediaElement(input)&&awaitMediaLoaded(input))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input,detections){let{Canvas}=env.getEnv(),canvas=input;if(!(input instanceof Canvas)){let netInput=await toNetInput(input);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height));return boxes.map(({x,y,width,height})=>{let faceImg=createCanvas({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}var tf6=__toModule(require_tfjs_esm());async function extractFaceTensors(imageTensor,detections){if(!isTensor3D(imageTensor)&&!isTensor4D(imageTensor))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(isTensor4D(imageTensor)&&imageTensor.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return tf6.tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0),boxes=detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)),faceTensors=boxes.map(({x,y,width,height})=>tf6.slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]));return faceTensors})}async function fetchOrThrow(url,init){let fetch=env.getEnv().fetch,res=await fetch(url,init);if(!(res.status<400))throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);return res}async function fetchImage(uri){let res=await fetchOrThrow(uri),blob=await res.blob();if(!blob.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);return bufferToImage(blob)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}var tf7=__toModule(require_tfjs_esm());function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return tf7.io.loadWeights(manifest,modelBaseUri)}function matchDimensions(input,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input.width=width,input.height=height,{width,height}}var tf15=__toModule(require_tfjs_esm()),tf8=__toModule(require_tfjs_esm()),NeuralNetwork=class{constructor(_name){this._name=_name;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor2){let{obj,objProp}=this.traversePropertyPath(paramPath);obj[objProp].dispose(),obj[objProp]=tensor2}getParamList(){return this._paramMappings.map(({paramPath})=>({path:paramPath,tensor:this.getParamFromPath(paramPath)}))}getTrainableParams(){return this.getParamList().filter(param=>param.tensor instanceof tf8.Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof tf8.Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor2})=>{this.reassignParamFromPath(path,tensor2.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable})=>{let tensor2=tf8.tensor(variable.dataSync());variable.dispose(),this.reassignParamFromPath(path,tensor2)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${param.path}`);param.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:tensor2})=>Array.from(tensor2.dataSync())).reduce((flat,arr)=>flat.concat(arr)))}async load(weightsOrUrl){if(weightsOrUrl instanceof Float32Array){this.extractWeights(weightsOrUrl);return}await this.loadFromUri(weightsOrUrl)}async loadFromUri(uri){if(uri&&typeof uri!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let weightMap=await loadWeightMap(uri,this.getDefaultModelName());this.loadFromWeightMap(weightMap)}async loadFromDisk(filePath){if(filePath&&typeof filePath!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile}=env.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(filePath2=>readFile(filePath2).then(buf=>buf.buffer))),loadWeights=tf8.io.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{paramMappings,params}=this.extractParams(weights);this._paramMappings=paramMappings,this._params=params}traversePropertyPath(paramPath){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let result=paramPath.split("/").reduce((res,objProp2)=>{if(!res.nextObj.hasOwnProperty(objProp2))throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`);return{obj:res.nextObj,objProp:objProp2,nextObj:res.nextObj[objProp2]}},{nextObj:this.params}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof tf8.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}},tf10=__toModule(require_tfjs_esm()),tf9=__toModule(require_tfjs_esm());function depthwiseSeparableConv(x,params,stride){return tf9.tidy(()=>{let out=tf9.separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=tf9.add(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=tf10.relu(tf10.add(out1,tf10.add(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,tf10.add(out3,out4))))})}var tf11=__toModule(require_tfjs_esm());function convLayer(x,params,padding="same",withRelu=!1){return tf11.tidy(()=>{let out=tf11.add(tf11.conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?tf11.relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}var tf12=__toModule(require_tfjs_esm());function extractConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,filterSize,mappedPrefix){let filters=tf12.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf12.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}var tf13=__toModule(require_tfjs_esm());function extractFCParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let fc_weights=tf13.tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tf13.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var tf14=__toModule(require_tfjs_esm()),SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return function(channelsIn,channelsOut,mappedPrefix){let depthwise_filter=tf14.tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tf14.tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tf14.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return function(prefix){let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return function(originalPath,paramRank,mappedPath){let tensor2=weightMap[originalPath];if(!isTensor(tensor2,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor2}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),dense3=extractDenseBlock4Params(128,256,"dense3");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2,dense3}}}function loadConvParamsFactory(extractWeightEntry){return function(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tf15.tidy(()=>{let batchTensor=tf15.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf15.scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=tf15.avgPool(out,[7,7],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap(weightMap)}extractParams(weights){return extractParams(weights)}},tf17=__toModule(require_tfjs_esm()),tf16=__toModule(require_tfjs_esm());function fullyConnectedLayer(x,params){return tf16.tidy(()=>tf16.add(tf16.matMul(x,params.weights),params.bias))}function extractParams3(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),fc=extractFCParams(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap3(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf17.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams3(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap3(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{constructor(probabilities){if(probabilities.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);FACE_EXPRESSION_LABELS.forEach((expression,idx)=>{this[expression]=probabilities[idx]})}asSortedArray(){return FACE_EXPRESSION_LABELS.map(expression=>({expression,probability:this[expression]})).sort((e0,e1)=>e1.probability-e0.probability)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input){return tf18.tidy(()=>tf18.softmax(this.runNet(input)))}async forward(input){return this.forwardInput(await toNetInput(input))}async predictExpressions(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(tf18.unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){let extension={expressions};return Object.assign({},sourceObj,extension)}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){let faceExpressionsArray=Array.isArray(faceExpressions)?faceExpressions:[faceExpressions];faceExpressionsArray.forEach(e=>{let expr=e instanceof FaceExpressions?e:isWithFaceExpressions(e)?e.expressions:void 0;if(!expr)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let sorted=expr.asSortedArray(),resultsToDisplay=sorted.filter(expr2=>expr2.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0),drawTextField=new DrawTextField(resultsToDisplay.map(expr2=>`${expr2.expression} (${round(expr2.probability)})`),anchor);drawTextField.draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims),extension={landmarks,unshiftedLandmarks,alignedRect};return Object.assign({},sourceObj,extension)}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,lineWidth,lineColor,pointSize,pointColor}=options;this.drawLines=drawLines,this.drawPoints=drawPoints,this.lineWidth=lineWidth||1,this.pointSize=pointSize||2,this.lineColor=lineColor||"rgba(0, 255, 255, 1)",this.pointColor=pointColor||"rgba(255, 0, 255, 1)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{drawLines,drawPoints,lineWidth,lineColor,pointSize,pointColor}=this.options;if(drawLines&&this.faceLandmarks instanceof FaceLandmarks68&&(ctx.strokeStyle=lineColor,ctx.lineWidth=lineWidth,drawContour(ctx,this.faceLandmarks.getJawOutline()),drawContour(ctx,this.faceLandmarks.getLeftEyeBrow()),drawContour(ctx,this.faceLandmarks.getRightEyeBrow()),drawContour(ctx,this.faceLandmarks.getNose()),drawContour(ctx,this.faceLandmarks.getLeftEye(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let drawPoint=pt=>{ctx.beginPath(),ctx.arc(pt.x,pt.y,pointSize,0,2*Math.PI),ctx.fill()};this.faceLandmarks.positions.forEach(drawPoint)}}};function drawFaceLandmarks(canvasArg,faceLandmarks){let faceLandmarksArray=Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks];faceLandmarksArray.forEach(f=>{let landmarks=f instanceof FaceLandmarks?f:isWithFaceLandmarks(f)?f.landmarks:void 0;if(!landmarks)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new DrawFaceLandmarks(landmarks).draw(canvasArg)})}var tf20=__toModule(require_tfjs_esm()),tf19=__toModule(require_tfjs_esm());function extractorsFactory3(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams5(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory3(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{entry_flow,middle_flow,exit_flow}}}function loadParamsFactory3(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap5(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory3(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return tf19.add(tf19.conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?tf19.relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=tf19.maxPool(out,[3,3],[2,2],"same"),out=tf19.add(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(tf19.relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv2,[1,1]),out=tf19.add(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tf19.tidy(()=>{let batchTensor=tf19.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf19.scalar(256)),out=tf19.relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),out=reductionBlock(out,params.entry_flow.reduction_block_1),range(this._numMainBlocks,0,1).forEach(idx=>{out=mainBlock(out,params.middle_flow[`main_block_${idx}`])}),out=reductionBlock(out,params.exit_flow.reduction_block),out=tf19.relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams5(weights,this._numMainBlocks)}};function extractParams7(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),gender=extractFCParams(512,2,"fc/gender");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc:{age,gender}}}}function extractParamsFromWeigthMap7(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf20.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input,pooled=tf20.avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input){return tf20.tidy(()=>{let{age,gender}=this.runNet(input);return{age,gender:tf20.softmax(gender)}})}async forward(input){return this.forwardInput(await toNetInput(input))}async predictAgeAndGender(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),ages=tf20.unstack(out.age),genders=tf20.unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams7(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap7(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var tf21=__toModule(require_tfjs_esm()),FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale2=inputSize/Math.max(height,width);return{width:width*scale2,height:height*scale2}}),batchSize=inputDimensions.length;return tf21.tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>tf21.stack([tf21.fill([68],fillX,"float32"),tf21.fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding(batchIdx,(w,h)=>wgetPadding(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))));return landmarkTensors})}forwardInput(input){return tf21.tidy(()=>{let out=this.runNet(input);return this.postProcess(out,input.inputSize,input.inputDimensions.map(([height,width])=>({height,width})))})}async forward(input){return this.forwardInput(await toNetInput(input))}async detectLandmarks(input){let netInput=await toNetInput(input),landmarkTensors=tf21.tidy(()=>tf21.unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven(i)),yCoords=landmarksArray.filter((_,i)=>!isEven(i));return new FaceLandmarks68(Array(68).fill(0).map((_,i)=>new Point(xCoords[i],yCoords[i])),{height:netInput.getInputHeight(batchIdx),width:netInput.getInputWidth(batchIdx)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var tf22=__toModule(require_tfjs_esm());function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tf22.tidy(()=>{let batchTensor=tf22.cast(input.toBatchTensor(112,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf22.scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=tf22.avgPool(out,[14,14],[2,2],"valid"),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMapTiny(weightMap)}extractParams(weights){return extractParamsTiny(weights)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};var tf27=__toModule(require_tfjs_esm()),tf24=__toModule(require_tfjs_esm()),tf23=__toModule(require_tfjs_esm());function scale(x,params){return tf23.add(tf23.mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=tf24.conv2d(x,filters,strides,padding);return out=tf24.add(out,bias),out=scale(out,params.scale),withRelu?tf24.relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}var tf25=__toModule(require_tfjs_esm());function extractorsFactory5(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),depth=weights.length/(numFilters*filterSize*filterSize);if(isFloat(depth))throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);return tf25.tidy(()=>tf25.transpose(tf25.tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tf25.tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tf25.tensor1d(extractWeights(numWeights)),biases=tf25.tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale2=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale2}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams9(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory5(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tf25.tidy(()=>tf25.transpose(tf25.tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return{params,paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),scale2=extractScaleLayerParams(prefix);return{conv:{filters,bias},scale:scale2}}function extractResidualLayerParams(prefix){return{conv1:extractConvLayerParams(`${prefix}/conv1`),conv2:extractConvLayerParams(`${prefix}/conv2`)}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParamsFromWeigthMap9(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory6(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),fc=weightMap.fc;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let params={conv32_down,conv32_1,conv32_2,conv32_3,conv64_down,conv64_1,conv64_2,conv64_3,conv128_down,conv128_1,conv128_2,conv256_down,conv256_1,conv256_2,conv256_down_out,fc};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf26=__toModule(require_tfjs_esm());function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=tf26.add(out,x),out=tf26.relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=tf26.avgPool(x,2,2,"valid"),zeros2=tf26.zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3],isAdjustShape=pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2];if(isAdjustShape){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=tf26.zeros(padShapeX);out=tf26.concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=tf26.zeros(padShapeY);out=tf26.concat([out,zerosH],2)}return pooled=isPad?tf26.concat([pooled,zeros2],3):pooled,out=tf26.add(pooled,out),out=tf26.relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tf27.tidy(()=>{let batchTensor=tf27.cast(input.toBatchTensor(150,!0),"float32"),meanRgb=[122.782,117.001,104.298],normalized=normalize(batchTensor,meanRgb).div(tf27.scalar(256)),out=convDown(normalized,params.conv32_down);out=tf27.maxPool(out,3,2,"valid"),out=residual(out,params.conv32_1),out=residual(out,params.conv32_2),out=residual(out,params.conv32_3),out=residualDown(out,params.conv64_down),out=residual(out,params.conv64_1),out=residual(out,params.conv64_2),out=residual(out,params.conv64_3),out=residualDown(out,params.conv128_down),out=residual(out,params.conv128_1),out=residual(out,params.conv128_2),out=residualDown(out,params.conv256_down),out=residual(out,params.conv256_1),out=residual(out,params.conv256_2),out=residualDown(out,params.conv256_down_out);let globalAvg=out.mean([1,2]),fullyConnected=tf27.matMul(globalAvg,params.fc);return fullyConnected})}async forward(input){return this.forwardInput(await toNetInput(input))}async computeFaceDescriptor(input){let netInput=await toNetInput(input),faceDescriptorTensors=tf27.tidy(()=>tf27.unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap9(weightMap)}extractParams(weights){return extractParams9(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){let extension={descriptor};return Object.assign({},sourceObj,extension)}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){let extension={age};return Object.assign({},sourceObj,extension)}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){let extension={gender,genderProbability};return Object.assign({},sourceObj,extension)}var tf34=__toModule(require_tfjs_esm()),tf28=__toModule(require_tfjs_esm());function extractorsFactory7(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tf28.tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tf28.tensor1d(extractWeights(numChannels)),batch_norm_offset=tf28.tensor1d(extractWeights(numChannels)),batch_norm_mean=tf28.tensor1d(extractWeights(numChannels)),batch_norm_variance=tf28.tensor1d(extractWeights(numChannels));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/batch_norm_scale`},{paramPath:`${mappedPrefix}/batch_norm_offset`},{paramPath:`${mappedPrefix}/batch_norm_mean`},{paramPath:`${mappedPrefix}/batch_norm_variance`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tf28.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf28.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),conv_13=extractConvPairParams(1024,1024,"mobilenetv1/conv_13");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,conv_8,conv_9,conv_10,conv_11,conv_12,conv_13}}function extractPredictionLayerParams(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),box_predictor_0={box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1={box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2={box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3={box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4={box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5={box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5};return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0,box_predictor_1,box_predictor_2,box_predictor_3,box_predictor_4,box_predictor_5}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams11(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory7(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),extra_dim=tf28.tensor3d(extractWeights(5118*4),[1,5118,4]),output_layer={extra_dim};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),batch_norm_variance=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`,1,`${mappedPrefixDepthwiseConv}/batch_norm_variance`);return{depthwise_conv:{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance},pointwise_conv:extractPointwiseConvParams("MobilenetV1",idx,mappedPrefixPointwiseConv)}}function extractMobilenetV1Params(){return{conv_0:extractPointwiseConvParams("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:extractConvPairParams(1),conv_2:extractConvPairParams(2),conv_3:extractConvPairParams(3),conv_4:extractConvPairParams(4),conv_5:extractConvPairParams(5),conv_6:extractConvPairParams(6),conv_7:extractConvPairParams(7),conv_8:extractConvPairParams(8),conv_9:extractConvPairParams(9),conv_10:extractConvPairParams(10),conv_11:extractConvPairParams(11),conv_12:extractConvPairParams(12),conv_13:extractConvPairParams(13)}}function extractConvParams(prefix,mappedPrefix){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),class_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`,`prediction_layer/box_predictor_${idx}/class_predictor`);return{box_encoding_predictor,class_predictor}}function extractPredictionLayerParams(){return{conv_0:extractPointwiseConvParams("Prediction",0,"prediction_layer/conv_0"),conv_1:extractPointwiseConvParams("Prediction",1,"prediction_layer/conv_1"),conv_2:extractPointwiseConvParams("Prediction",2,"prediction_layer/conv_2"),conv_3:extractPointwiseConvParams("Prediction",3,"prediction_layer/conv_3"),conv_4:extractPointwiseConvParams("Prediction",4,"prediction_layer/conv_4"),conv_5:extractPointwiseConvParams("Prediction",5,"prediction_layer/conv_5"),conv_6:extractPointwiseConvParams("Prediction",6,"prediction_layer/conv_6"),conv_7:extractPointwiseConvParams("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:extractBoxPredictorParams(0),box_predictor_1:extractBoxPredictorParams(1),box_predictor_2:extractBoxPredictorParams(2),box_predictor_3:extractBoxPredictorParams(3),box_predictor_4:extractBoxPredictorParams(4),box_predictor_5:extractBoxPredictorParams(5)}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParamsFromWeigthMap11(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory8(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf30=__toModule(require_tfjs_esm()),tf29=__toModule(require_tfjs_esm());function pointwiseConvLayer(x,params,strides){return tf29.tidy(()=>{let out=tf29.conv2d(x,params.filters,strides,"same");return out=tf29.add(out,params.batch_norm_offset),tf29.clipByValue(out,0,6)})}var epsilon=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tf30.tidy(()=>{let out=tf30.depthwiseConv2d(x,params.filters,strides,"same");return out=tf30.batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon),tf30.clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tf30.tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]),convPairParams=[params.conv_1,params.conv_2,params.conv_3,params.conv_4,params.conv_5,params.conv_6,params.conv_7,params.conv_8,params.conv_9,params.conv_10,params.conv_11,params.conv_12,params.conv_13];if(convPairParams.forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function nonMaxSuppression2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou3=IOU(boxes,c.boxIndex,selected[j]);if(iou3===0)continue;if(c.score*=suppressFunc(iou3),c.score<=scoreThreshold)break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}var tf31=__toModule(require_tfjs_esm());function getCenterCoordinatesAndSizesLayer(x){let vec=tf31.unstack(tf31.transpose(x,[1,0])),sizes=[tf31.sub(vec[2],vec[0]),tf31.sub(vec[3],vec[1])],centers=[tf31.add(vec[0],tf31.div(sizes[0],tf31.scalar(2))),tf31.add(vec[1],tf31.div(sizes[1],tf31.scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=tf31.unstack(tf31.transpose(x1,[1,0])),div0_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2],tf31.scalar(5))),sizes[0]),tf31.scalar(2)),add0_out=tf31.add(tf31.mul(tf31.div(vec[0],tf31.scalar(10)),sizes[0]),centers[0]),div1_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3],tf31.scalar(5))),sizes[1]),tf31.scalar(2)),add1_out=tf31.add(tf31.mul(tf31.div(vec[1],tf31.scalar(10)),sizes[1]),centers[1]);return tf31.transpose(tf31.stack([tf31.sub(add0_out,div0_out),tf31.sub(add1_out,div1_out),tf31.add(add0_out,div0_out),tf31.add(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tf31.tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim,[batchSize,1,1]),[-1,4]),tf31.reshape(boxPredictions,[-1,4]));boxes=tf31.reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=tf31.sigmoid(tf31.slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=tf31.slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=tf31.reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=tf31.unstack(boxes),scoresByBatch=tf31.unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}var tf33=__toModule(require_tfjs_esm()),tf32=__toModule(require_tfjs_esm());function boxPredictionLayer(x,params){return tf32.tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=tf32.reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=tf32.reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tf33.tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=tf33.concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=tf33.concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tf34.tidy(()=>{let batchTensor=tf34.cast(input.toBatchTensor(512,!1),"float32"),x=tf34.sub(tf34.mul(batchTensor,tf34.scalar(.007843137718737125)),tf34.scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{boxPredictions,classPredictions}=predictionLayer(features.out,features.conv11,params.prediction_layer);return outputLayer(boxPredictions,classPredictions,params.output_layer)})}async forward(input){return this.forwardInput(await toNetInput(input))}async locateFaces(input,options={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),iouThreshold=.5,indices=nonMaxSuppression2(boxes,scoresData,maxResults,iouThreshold,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[left,right]=[Math.max(0,boxesData[idx][1]),Math.min(1,boxesData[idx][3])].map(val=>val*padX);return new FaceDetection(scoresData[idx],new Rect(left,top,right-left,bottom-top),{height:netInput.getInputHeight(0),width:netInput.getInputWidth(0)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap11(weightMap)}extractParams(weights){return extractParams11(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.874946),new Point(2.42204,2.65704),new Point(4.30971,7.04493),new Point(10.246,4.59428),new Point(12.6868,11.8741)],BOX_ANCHORS_SEPARABLE=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",tf39=__toModule(require_tfjs_esm()),isNumber=arg=>typeof arg=="number";function validateConfig(config2){if(!config2)throw new Error(`invalid config: ${config2}`);if(typeof config2.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`);if(!isNumber(config2.iouThreshold)||config2.iouThreshold<0||config2.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`);if(!Array.isArray(config2.classes)||!config2.classes.length||!config2.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`);if(!Array.isArray(config2.anchors)||!config2.anchors.length||!config2.anchors.map(a=>a||{}).every(a=>isNumber(a.x)&&isNumber(a.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`);if(config2.meanRgb&&(!Array.isArray(config2.meanRgb)||config2.meanRgb.length!==3||!config2.meanRgb.every(isNumber)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`)}var tf36=__toModule(require_tfjs_esm()),tf35=__toModule(require_tfjs_esm());function leaky(x){return tf35.tidy(()=>{let min=tf35.mul(x,tf35.scalar(.10000000149011612));return tf35.add(tf35.relu(tf35.sub(x,min)),min)})}function convWithBatchNorm(x,params){return tf36.tidy(()=>{let out=tf36.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf36.conv2d(out,params.conv.filters,[1,1],"valid"),out=tf36.sub(out,params.bn.sub),out=tf36.mul(out,params.bn.truediv),out=tf36.add(out,params.conv.bias),leaky(out)})}var tf37=__toModule(require_tfjs_esm());function depthwiseSeparableConv3(x,params){return tf37.tidy(()=>{let out=tf37.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf37.separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=tf37.add(out,params.bias),leaky(out)})}var tf38=__toModule(require_tfjs_esm());function extractorsFactory9(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub6=tf38.tensor1d(extractWeights(size)),truediv=tf38.tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub6,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams13(weights,config2,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory9(extractWeights,paramMappings),params;if(config2.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config2.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),conv8=extractConvParams(s8,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params,paramMappings}}function extractorsFactory10(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub6=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub6,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap13(weightMap,config2){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory10(weightMap,paramMappings),params;if(config2.withSeparableConvs){let numFilters=config2.filterSizes&&config2.filterSizes.length||9;params={conv0:config2.isFirstLayerConv2d?extractConvParams("conv0"):extractSeparableConvParams("conv0"),conv1:extractSeparableConvParams("conv1"),conv2:extractSeparableConvParams("conv2"),conv3:extractSeparableConvParams("conv3"),conv4:extractSeparableConvParams("conv4"),conv5:extractSeparableConvParams("conv5"),conv6:numFilters>7?extractSeparableConvParams("conv6"):void 0,conv7:numFilters>8?extractSeparableConvParams("conv7"):void 0,conv8:extractConvParams("conv8")}}else params={conv0:extractConvWithBatchNormParams("conv0"),conv1:extractConvWithBatchNormParams("conv1"),conv2:extractConvWithBatchNormParams("conv2"),conv3:extractConvWithBatchNormParams("conv3"),conv4:extractConvWithBatchNormParams("conv4"),conv5:extractConvWithBatchNormParams("conv5"),conv6:extractConvWithBatchNormParams("conv6"),conv7:extractConvWithBatchNormParams("conv7"),conv8:extractConvParams("conv8")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2SizeType;(function(TinyYolov2SizeType2){TinyYolov2SizeType2[TinyYolov2SizeType2.XS=224]="XS",TinyYolov2SizeType2[TinyYolov2SizeType2.SM=320]="SM",TinyYolov2SizeType2[TinyYolov2SizeType2.MD=416]="MD",TinyYolov2SizeType2[TinyYolov2SizeType2.LG=608]="LG"})(TinyYolov2SizeType||(TinyYolov2SizeType={}));var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!==0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config2){super("TinyYolov2");validateConfig(config2),this._config=config2}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(x,params){let out=convWithBatchNorm(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv3(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv3(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv3(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv3(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tf39.tidy(()=>{let batchTensor=tf39.cast(input.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(tf39.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input,inputSize){return await this.forwardInput(await toNetInput(input),inputSize)}async detect(input,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input),out=await this.forwardInput(netInput,inputSize),out0=tf39.tidy(()=>tf39.unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]),indices=nonMaxSuppression(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0),detections=indices.map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions));return detections}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap13(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,numFilters=filterSizes?filterSizes.length:void 0;if(numFilters!==7&&numFilters!==8&&numFilters!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);return extractParams13(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tf39.tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?tf39.softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):tf39.scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,width2=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,height2=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-width2/2,y=ctY-height2/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+width2,y+height2),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,classesData=await classesTensor.array();return Array(this.config.classes.length).fill(0).map((_,i)=>classesData[row][col][anchor][i]).map((classScore,label)=>({classScore,label})).reduce((max,curr)=>max.classScore>curr.classScore?max:curr)}},TinyYolov2Base=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config2=Object.assign({},{withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"]},withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0});super(config2)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?DEFAULT_MODEL_NAME_SEPARABLE_CONV:DEFAULT_MODEL_NAME}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}},tf41=__toModule(require_tfjs_esm()),tf40=__toModule(require_tfjs_esm());async function extractAllFacesAndComputeResults(parentResults,input,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input instanceof tf40.Tensor?await extractFaceTensors(input,faceBoxes):await extractFaces(input,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof tf40.Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,BOX_ANCHORS2=[new Point(1.603231,2.094468),new Point(6.041143,7.080126),new Point(2.882459,3.518061),new Point(4.266906,5.178857),new Point(9.041765,10.66308)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config2={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config2)}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){let objectDetections=await this.detect(input,forwardParams);return objectDetections.map(det=>new FaceDetection(det.score,det.relativeBox,{width:det.imageWidth,height:det.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(weightMap){return super.extractParamsFromWeigthMap(weightMap)}},nets={ssdMobilenetv1:new SsdMobilenetv1,tinyFaceDetector:new TinyFaceDetector,tinyYolov2:new TinyYolov2,faceLandmark68Net:new FaceLandmark68Net,faceLandmark68TinyNet:new FaceLandmark68TinyNet,faceRecognitionNet:new FaceRecognitionNet,faceExpressionNet:new FaceExpressionNet,ageGenderNet:new AgeGenderNet},ssdMobilenetv1=(input,options)=>nets.ssdMobilenetv1.locateFaces(input,options),tinyFaceDetector=(input,options)=>nets.tinyFaceDetector.locateFaces(input,options),tinyYolov23=(input,options)=>nets.tinyYolov2.locateFaces(input,options),detectFaceLandmarks=input=>nets.faceLandmark68Net.detectLandmarks(input),detectFaceLandmarksTiny=input=>nets.faceLandmark68TinyNet.detectLandmarks(input),computeFaceDescriptor=input=>nets.faceRecognitionNet.computeFaceDescriptor(input),recognizeFaceExpressions=input=>nets.faceExpressionNet.predictExpressions(input),predictAgeAndGender=input=>nets.ageGenderNet.predictAgeAndGender(input),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.faceExpressionNet.predictExpressions(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>extendWithFaceExpressions(parentResult,faceExpressionsByFace[i]))}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this,this.input)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>await Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{age,gender,genderProbability}=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.ageGenderNet.predictAgeAndGender(face),this.extractedFaces);return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this,this.input)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input){super();this.parentTask=parentTask;this.input=input}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask,descriptors=await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}));return descriptors.map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class extends ComposableTask{constructor(parentTask,input,useTinyLandmarkNet){super();this.parentTask=parentTask;this.input=input;this.useTinyLandmarkNet=useTinyLandmarkNet}get landmarkNet(){return this.useTinyLandmarkNet?nets.faceLandmark68TinyNet:nets.faceLandmark68Net}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),parentResults.map((parentResult,i)=>extendWithFaceLandmarks(parentResult,faceLandmarksByFace[i]))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input,options=new SsdMobilenetv1Options){super();this.input=input;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input,options}=this,faceDetectionFunction=options instanceof TinyFaceDetectorOptions?input2=>nets.tinyFaceDetector.locateFaces(input2,options):options instanceof SsdMobilenetv1Options?input2=>nets.ssdMobilenetv1.locateFaces(input2,options):options instanceof TinyYolov2Options?input2=>nets.tinyYolov2.locateFaces(input2,options):null;if(!faceDetectionFunction)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return faceDetectionFunction(input)}runAndExtendWithFaceDetections(){return new Promise(async res=>{let detections=await this.run();return res(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async res=>{let detection=await this.run();return res(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input,options)}function detectAllFaces(input,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input,options)}async function allFacesSsdMobilenetv1(input,minConfidence){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input,forwardParams={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await detectAllFaces(input,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+Math.pow(diff,2),0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count=1,createUniqueLabel=()=>`person ${count++}`;this._labeledDescriptors=inputArray.map(desc=>{if(desc instanceof LabeledFaceDescriptors)return desc;if(desc instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc]);if(desc.descriptor&&desc.descriptor instanceof Float32Array)return new LabeledFaceDescriptors(createUniqueLabel(),[desc.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(queryDescriptor,descriptors){return descriptors.map(d=>euclideanDistance(d,queryDescriptor)).reduce((d1,d2)=>d1+d2,0)/(descriptors.length||1)}matchDescriptor(queryDescriptor){return this.labeledDescriptors.map(({descriptors,label})=>new FaceMatch(label,this.computeMeanDistance(queryDescriptor,descriptors))).reduce((best,curr)=>best.distanceld.toJSON())}}static fromJSON(json){let labeledDescriptors=json.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{width,height}=new Dimensions(dimensions.width,dimensions.height);if(width<=0||height<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width,height})}`);if(Array.isArray(results))return results.map(obj=>resizeResults(obj,{width,height}));if(isWithFaceLandmarks(results)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var version="0.9.1",node=typeof process!="undefined",browser3=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",version2={faceapi:version,node,browser:browser3}; //# sourceMappingURL=face-api.node.js.map diff --git a/dist/face-api.node.json b/dist/face-api.node.json index ece8f39..5bdba81 100644 --- a/dist/face-api.node.json +++ b/dist/face-api.node.json @@ -2060,7 +2060,7 @@ ] }, "package.json": { - "bytes": 1409, + "bytes": 1352, "imports": [] }, "src/index.ts": { diff --git a/example/node-multiprocess-worker.js b/example/node-multiprocess-worker.js new file mode 100644 index 0000000..3f1d211 --- /dev/null +++ b/example/node-multiprocess-worker.js @@ -0,0 +1,67 @@ +const fs = require('fs'); +const path = require('path'); +const log = require('@vladmandic/pilogger'); + +// workers actual import tfjs and faceapi modules +const tf = require('@tensorflow/tfjs-node'); +const faceapi = require('../dist/face-api.node.js'); // this is equivalent to '@vladmandic/faceapi' + +// options used by faceapi +const modelPathRoot = '../model'; +const minScore = 0.1; +const maxResults = 5; +let optionsSSDMobileNet; + +// read image from a file and create tensor to be used by faceapi +// this way we don't need any monkey patches +// you can add any pre-proocessing here such as resizing, etc. +async function image(img) { + const buffer = fs.readFileSync(img); + const tensor = tf.tidy(() => tf.node.decodeImage(buffer).toFloat().expandDims()); + return tensor; +} + +// actual faceapi detection +async function detect(img) { + const tensor = await image(img); + const result = await faceapi + .detectAllFaces(tensor, optionsSSDMobileNet) + .withFaceLandmarks() + .withFaceExpressions() + .withFaceDescriptors() + .withAgeAndGender(); + process.send({ image: img, detected: result }); // send results back to main + process.send({ ready: true }); // send signal back to main that this worker is now idle and ready for next image + tensor.dispose(); +} + +async function main() { + // on worker start first initialize message handler so we don't miss any messages + process.on('message', (msg) => { + if (msg.exit) process.exit(); // if main told worker to exit + if (msg.test) process.send({ test: true }); + if (msg.image) detect(msg.image); // if main told worker to process image + log.data('Worker received message:', process.pid, msg); // generic log + }); + + // then initialize tfjs + await faceapi.tf.setBackend('tensorflow'); + await faceapi.tf.enableProdMode(); + await faceapi.tf.ENV.set('DEBUG', false); + await faceapi.tf.ready(); + log.state('Worker: PID:', process.pid, `TensorFlow/JS ${faceapi.tf.version_core} FaceAPI ${faceapi.version.faceapi} Backend: ${faceapi.tf.getBackend()}`); + + // and load and initialize facepi models + const modelPath = path.join(__dirname, modelPathRoot); + await faceapi.nets.ssdMobilenetv1.loadFromDisk(modelPath); + await faceapi.nets.ageGenderNet.loadFromDisk(modelPath); + await faceapi.nets.faceLandmark68Net.loadFromDisk(modelPath); + await faceapi.nets.faceRecognitionNet.loadFromDisk(modelPath); + await faceapi.nets.faceExpressionNet.loadFromDisk(modelPath); + optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options({ minConfidence: minScore, maxResults }); + + // now we're ready, so send message back to main that it knows it can use this worker + process.send({ ready: true }); +} + +main(); diff --git a/example/node-multiprocess.js b/example/node-multiprocess.js new file mode 100644 index 0000000..02dd509 --- /dev/null +++ b/example/node-multiprocess.js @@ -0,0 +1,79 @@ +const fs = require('fs'); +const path = require('path'); +const log = require('@vladmandic/pilogger'); // this is my simple logger with few extra features +const child_process = require('child_process'); +// note that main process import faceapi or tfjs at all + +const imgPathRoot = './example'; // modify to include your sample images +const numWorkers = 2; // how many workers will be started +const workers = []; // this holds worker processes +const images = []; // this holds queue of enumerated images +const t = []; // timers +let dir; + +// trigered by main when worker sends ready message +// if image pool is empty, signal worker to exit otherwise dispatch image to worker and remove image from queue +async function detect(worker) { + if (!t[2]) t[2] = process.hrtime.bigint(); // first time do a timestamp so we can measure initial latency + if (images.length === dir.length) worker.send({ test: true }); // for first image in queue just measure latency + if (images.length === 0) worker.send({ exit: true }); // nothing left in queue + else { + log.state('Main: dispatching to worker:', worker.pid); + worker.send({ image: images[0] }); + images.shift(); + } +} + +// loop that waits for all workers to complete +function waitCompletion() { + const activeWorkers = workers.reduce((any, worker) => (any += worker.connected ? 1 : 0), 0); + if (activeWorkers > 0) setImmediate(() => waitCompletion()); + else { + t[1] = process.hrtime.bigint(); + log.info('Processed', dir.length, 'images in', Math.trunc(parseInt(t[1] - t[0]) / 1000 / 1000), 'ms'); + } +} + +function measureLatency() { + t[3] = process.hrtime.bigint(); + const latencyInitialization = Math.trunc(parseInt(t[2] - t[0]) / 1000 / 1000); + const latencyRoundTrip = Math.trunc(parseInt(t[3] - t[2]) / 1000 / 1000); + log.info('Latency: worker initializtion: ', latencyInitialization, 'message round trip:', latencyRoundTrip); +} + +async function main() { + log.header(); + log.info('FaceAPI multi-process test'); + + // enumerate all images into queue + dir = fs.readdirSync(imgPathRoot); + for (const imgFile of dir) { + if (imgFile.toLocaleLowerCase().endsWith('.jpg')) images.push(path.join(imgPathRoot, imgFile)); + } + + t[0] = process.hrtime.bigint(); + // manage worker processes + for (let i = 0; i < numWorkers; i++) { + // create worker process + workers[i] = await child_process.fork('example/node-multiprocess-worker.js', ['special']); + // parse message that worker process sends back to main + // if message is ready, dispatch next image in queue + // if message is processing result, just print how many faces were detected + // otherwise it's an unknown message + workers[i].on('message', (msg) => { + if (msg.ready) detect(workers[i]); + else if (msg.image) log.data('Main: worker finished:', workers[i].pid, 'detected faces:', msg.detected.length); + else if (msg.test) measureLatency(); + else log.data('Main: worker message:', workers[i].pid, msg); + }); + // just log when worker exits + workers[i].on('exit', (msg) => log.state('Main: worker exit:', workers[i].pid, msg)); + // just log which worker was started + log.state('Main: started worker:', workers[i].pid); + } + + // wait for all workers to complete + waitCompletion(); +} + +main(); diff --git a/example/node-singleprocess.js b/example/node-singleprocess.js new file mode 100644 index 0000000..aa0c8e1 --- /dev/null +++ b/example/node-singleprocess.js @@ -0,0 +1,60 @@ +const fs = require('fs'); +const path = require('path'); +const log = require('@vladmandic/pilogger'); +const tf = require('@tensorflow/tfjs-node'); +const faceapi = require('../dist/face-api.node.js'); // this is equivalent to '@vladmandic/faceapi' + +const modelPathRoot = '../model'; +const imgPathRoot = './example'; // modify to include your sample images +const minScore = 0.1; +const maxResults = 5; + +async function image(img) { + const buffer = fs.readFileSync(img); + const decoded = tf.node.decodeImage(buffer); + const casted = decoded.toFloat(); + const result = casted.expandDims(0); + decoded.dispose(); + casted.dispose(); + return result; +} + +async function main() { + log.header(); + log.info('FaceAPI single-process test'); + const t0 = process.hrtime.bigint(); + + await faceapi.tf.setBackend('tensorflow'); + await faceapi.tf.enableProdMode(); + await faceapi.tf.ENV.set('DEBUG', false); + await faceapi.tf.ready(); + + log.state(`Version: TensorFlow/JS ${faceapi.tf?.version_core} FaceAPI ${faceapi.version.faceapi} Backend: ${faceapi.tf?.getBackend()}`); + + log.info('Loading FaceAPI models'); + const modelPath = path.join(__dirname, modelPathRoot); + await faceapi.nets.ssdMobilenetv1.loadFromDisk(modelPath); + await faceapi.nets.ageGenderNet.loadFromDisk(modelPath); + await faceapi.nets.faceLandmark68Net.loadFromDisk(modelPath); + await faceapi.nets.faceRecognitionNet.loadFromDisk(modelPath); + await faceapi.nets.faceExpressionNet.loadFromDisk(modelPath); + const optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options({ minConfidence: minScore, maxResults }); + + const dir = fs.readdirSync(imgPathRoot); + for (const img of dir) { + if (!img.toLocaleLowerCase().endsWith('.jpg')) continue; + const tensor = await image(path.join(imgPathRoot, img)); + const result = await faceapi + .detectAllFaces(tensor, optionsSSDMobileNet) + .withFaceLandmarks() + .withFaceExpressions() + .withFaceDescriptors() + .withAgeAndGender(); + log.data('Image:', img, 'Detected faces:', result.length); + tensor.dispose(); + } + const t1 = process.hrtime.bigint(); + log.info('Processed', dir.length, 'images in', Math.trunc(parseInt(t1 - t0) / 1000 / 1000), 'ms'); +} + +main(); diff --git a/example/node.js b/example/node.js deleted file mode 100644 index 4efc266..0000000 --- a/example/node.js +++ /dev/null @@ -1,84 +0,0 @@ -process.stderr.write = null; // silly hack to stock tfjs logging too much to stderr - -const fs = require('fs'); -const path = require('path'); -const tf = require('@tensorflow/tfjs-node'); -const faceapi = require('../dist/face-api.node.js'); -// if you have module installed, this would be -// const faceapi = require('@vladmandic/face-api'); - -// configuration options -const modelPathRoot = '../model/'; // path to model folder that will be loaded using http -const imgSize = 512; // maximum image size in pixels -const minScore = 0.1; // minimum score -const maxResults = 5; // maximum number of results to return -const samples = ['sample (1).jpg', 'sample (2).jpg', 'sample (3).jpg', 'sample (4).jpg', 'sample (5).jpg', 'sample (6).jpg']; // sample images to be loaded using http - -// helper function to pretty-print json object to string -function str(json) { - const text = json ? JSON.stringify(json).replace(/{|}|"|\[|\]/g, '').replace(/,/g, ', ') : ''; - return text; -} - -// helper function to print strings to html document as a log -function log(...txt) { - // eslint-disable-next-line no-console - console.log(...txt); -} - -async function image(img) { - const buffer = fs.readFileSync(img); - const decoded = tf.node.decodeImage(buffer); - const casted = decoded.toFloat(); - const result = casted.expandDims(0); - decoded.dispose(); - casted.dispose(); - return result; -} - -async function main() { - // initialize tfjs - log('FaceAPI Test'); - await faceapi.tf.setBackend('tensorflow'); //Sets the backend (cpu, webgl, wasm, tensorflow, etc) responsible for creating tensors and executing operations on those tensors. - await faceapi.tf.enableProdMode(); - await faceapi.tf.ENV.set('DEBUG', false); - await faceapi.tf.ready(); //Returns a promise that resolves when the currently selected backend (or the highest priority one) has initialized. - - // check version - log(`Version: TensorFlow/JS ${str(faceapi.tf?.version_core || '(not loaded)')} FaceAPI ${str(faceapi?.version || '(not loaded)')} Backend: ${str(faceapi.tf?.getBackend() || '(not loaded)')}`); - log(`Flags: ${JSON.stringify(faceapi.tf.ENV.flags)}`); - - // load face-api models - log('Loading FaceAPI models'); - const modelPath = path.join(__dirname, modelPathRoot); - await faceapi.nets.ssdMobilenetv1.loadFromDisk(modelPath); - await faceapi.nets.ageGenderNet.loadFromDisk(modelPath); - await faceapi.nets.faceLandmark68Net.loadFromDisk(modelPath); - await faceapi.nets.faceRecognitionNet.loadFromDisk(modelPath); - await faceapi.nets.faceExpressionNet.loadFromDisk(modelPath); - const optionsSSDMobileNet = new faceapi.SsdMobilenetv1Options({ minConfidence: minScore, maxResults }); - - // check tf engine state - const engine = await faceapi.tf.engine(); - log(`TF Engine State: ${str(engine.state)}`); - - const dir = fs.readdirSync(__dirname); - for (const img of dir) { - if (!img.toLocaleLowerCase().endsWith('.jpg')) continue; - // load image - const tensor = await image(path.join(__dirname, img)); - // actual model execution - const result = await faceapi - .detectAllFaces(tensor, optionsSSDMobileNet) - .withFaceLandmarks() - .withFaceExpressions() - .withFaceDescriptors() - .withAgeAndGender(); - log('Image:', img, 'Detected faces:', result.length); - // you can access entire result object - // console.log(result); - tensor.dispose(); - } -} - -main(); diff --git a/package-lock.json b/package-lock.json index c9e2ee2..e0b33c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -196,8 +196,7 @@ "@vladmandic/pilogger": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@vladmandic/pilogger/-/pilogger-0.2.9.tgz", - "integrity": "sha512-UaDAFoEJwPw8248u9WQjVexP24wMiglHMWWd4X0gwukZuDw+CkoLddVF8335OYa+pXbP+t/rwx+E50f5rd5IhQ==", - "dev": true + "integrity": "sha512-UaDAFoEJwPw8248u9WQjVexP24wMiglHMWWd4X0gwukZuDw+CkoLddVF8335OYa+pXbP+t/rwx+E50f5rd5IhQ==" }, "abbrev": { "version": "1.1.1", diff --git a/package.json b/package.json index d5d20ba..39f7ad2 100644 --- a/package.json +++ b/package.json @@ -34,19 +34,19 @@ "url": "https://github.com/vladmandic/face-api/issues" }, "homepage": "https://github.com/vladmandic/face-api#readme", - "Dependencies": {}, + "dependencies": { + "@vladmandic/pilogger": "^0.2.9" + }, "devDependencies": { "@tensorflow/tfjs": "^2.7.0", - "@tensorflow/tfjs-backend-wasm": "^2.7.0", "@tensorflow/tfjs-node": "^2.7.0", "@tensorflow/tfjs-node-gpu": "^2.7.0", + "@tensorflow/tfjs-backend-wasm": "^2.7.0", "@types/node": "^14.14.10", - "@vladmandic/pilogger": "^0.2.9", "esbuild": "^0.8.17", "rimraf": "^3.0.2", "ts-node": "^9.0.0", "tslib": "^2.0.3", "typescript": "^4.1.2" - }, - "dependencies": {} + } }