@resolveio/server-lib 20.4.72 → 20.4.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","MongoManager","serverConfig","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","initServerCollections","setupChangeStream","prototype","_heapLimit","ResolveIOServer","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","_this","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","Promise","resolve","setTimeout","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","finish","addToCache","findOne","executeFindOne","aggregate","pipeline","__spreadArray","__read","flatMap","stage","$lookup","from","executeAggregate","countDocuments","executeCountDocuments","functionName","args","keyString","createHash","update","digest","cachedData","parse","dateReviver","error","del","data","getBinarySize","includes","endsWith","startsWith","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","invalidateQueryCache","collectionCacheMap","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","_c","entries","_d","_e","changeStream","watch","$match","$and","ns.coll","$nin","$not","fullDocument","on","change","__awaiter","coll","err","close","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","setInterval","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassCheckSchema","BATCH_SIZE","opIndex","batchOps","slice","logs","versionOps","e_4","batchOps_1","batchOps_1_1","op","opType","Object","doc","validationContext","newContext","isValid","validate","document","replacement","modifier","Error","concat","validationErrors","createdAt","updatedAt","insertOne","objectIdHexString","id_document","payload","method","id_user","user","messageId","route","versionDoc","__assign","__v","$set","$inc","versionFilters","map","v","$or","affectedDocs","versionInserts","affectedDocIds","$in","$sort","$group","versions","$push","$project","versionsToDelete","$slice","$size","$unwind","$replaceRoot","newRoot","oldVersions","deleteMany","error_1","setImmediate","ok","estimatedDocumentCount","_b","monitor_2","err_1","create","f_docs","Array","isArray","insertMany","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_2","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_3","bypassLogs","docs","i","replaceOne","upsert","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","validation","date","getMethodManager","callMethodInternal","call","findOneAndUpdate","$setOnInsert","indexExists","bypassMonitor","validationResults","forEach","validDocs","idx","hasOwnProperty","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","bypassVersions","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","monitor_16","watchCollection","queue","task","callback","dbCollection","apply","code","err_4","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"2gGAAAA,gB,yMAAAC,QAAA,cAAA,GACAC,UAAAD,QAAA,SAAA,EAEAE,QAAAF,QAAA,UAAA,EACAG,kBAAAH,QAAA,gCAAA,EACAI,SAAAJ,QAAA,gBAAA,EAEAK,UAAAL,QAAA,YAAA,EACMM,OAASN,QAAQ,QAAQ,EACzBO,KAAOP,QAAQ,MAAM,EAC3BQ,kBAAAR,QAAA,mBAAA,EAEAS,KAAAT,QAAA,IAAA,EACMU,SAAU,EAAAD,KAAAE,MAAI,EAAGC,OACjBC,GAAKb,QAAQ,IAAI,EACvBc,QAAAd,QAAA,OAAA,EAqGAe,aAAA,WAYC,SAAAA,aAAYC,GAXJC,KAAAC,aAA6D,GAE7DD,KAAAE,UAAsD,GACtDF,KAAAG,qBAA2H,IAAIC,IAC/HJ,KAAAK,UAAYT,GAAGU,kBAAiB,EAAKb,QAErCO,KAAAO,mBAAiF,GACjFP,KAAAQ,cAAgB,KAChBR,KAAAS,kBAAoB,CAAA,EACpBT,KAAAU,kBAAoB,CAAA,EAG3BV,KAAKQ,cAAgBT,EACrBC,KAAKW,WAAa,IAAIvB,UAAU,CAAEwB,OAAQ,EAAGC,YAAa,CAAC,CAAE,EAE7Db,KAAKS,kBAAuD,SAAnCK,QAAQC,IAAIC,mBACrChB,KAAKU,kBAAuD,SAAnCI,QAAQC,IAAIE,mBACrCjB,KAAKkB,cAAa,EAElBlB,KAAKmB,sBAAqB,EAEtBnB,KAAKS,mBAAqBT,KAAKU,mBAClCV,KAAKoB,kBAAiB,CAExB,CAgdD,OA9cStB,aAAAuB,UAAAH,cAAR,WACKlB,KAAKS,kBACRT,KAAKsB,WAAatB,KAAKU,kBAAqC,GAAjBV,KAAKK,UAAmC,GAAjBL,KAAKK,UAGvEL,KAAKsB,WAA8B,GAAjBtB,KAAKK,SAEzB,EAEMP,aAAAuB,UAAAF,sBAAN,W,gHACmB,MAAA,CAAA,EAAMlC,QAAAsC,gBAAgBC,UAAS,EAAGC,gBAAe,EAAGC,QAAO,G,cAAzEC,EAAcC,EAAAC,KAAA,EAClB7B,KAAKO,mBAAqBoB,E,UAG3B7B,aAAAuB,UAAAS,qBAAA,WACC,OAAO9B,KAAKO,kBACb,EAEAT,aAAAuB,UAAAU,mBAAA,SAAmBC,GAAnB,IAAAC,EAAAjC,KAEEgC,EAAWE,mBACXF,EAAWE,kBAAkBC,YAC7BH,EAAWE,kBAAkBC,WAAWC,WACxCpC,KAAKO,mBAAmB8B,KAAK,SAAAC,GAAK,OAAAA,EAAEC,OAASP,EAAWQ,gBAA6B,eAAXF,EAAEG,IAA1C,CAA+D,GAEjGxD,QAAAsC,gBAAgBC,UAAS,EACvBkB,eAAeV,EAAWQ,cAAc,EACxCG,KAAK,WACLV,EAAKW,iBAAiBZ,CAAU,CACjC,CAAC,EAGHhC,KAAKC,aAAa4C,KAAKb,CAAU,CAClC,EAEAlC,aAAAuB,UAAAuB,iBAAA,SAAiBZ,GAChB/C,QAAAsC,gBAAgBC,UAAS,EAAGoB,iBAAqCZ,EAAWQ,eAAgBR,EAAWE,iBAAiB,CACzH,EAEApC,aAAAuB,UAAAM,YAAA,WACC,OAAO3B,KAAKC,YACb,EAEAH,aAAAuB,UAAAW,WAAA,SAAWQ,GACV,OAAOxC,KAAKC,aAAa6C,KAAK,SAAAR,GAAK,OAAAA,EAAEE,iBAAmBA,CAArB,CAAmC,CACvE,EAEc1C,aAAAuB,UAAA0B,MAAd,SAAoBC,G,mFACnB,MAAA,CAAA,EAAO,IAAIC,QAAQ,SAAAC,GAAW,OAAAC,WAAWD,EAASF,CAAE,CAAtB,CAAuB,E,MAGzClD,aAAAuB,UAAAyB,KAAb,SACCN,EACAY,EACAC,G,OADA,KAAA,IAAAD,IAAAA,EAAA,I,2FAKA,OAFME,EAAWtD,KAAKuD,iBAAiB,CAACf,GAAiB,OAAQ,CAACY,EAAQC,EAAQ,EAEnEG,KAAAA,KADXC,EAASzD,KAAK0D,aAAaJ,CAAQ,IAElCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,qBAAsBxB,CAAc,EAE7D,CAAA,EAAOiB,IAGJzD,KAAKG,qBAAqB8D,IAAIX,CAAQ,GACrCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,+BAAgCxB,CAAc,EAEvE,CAAA,EAAOxC,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEa,WAG5ClF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,uBAAwBxB,CAAc,EAGzD4B,EAAYpE,KAAKqE,YAAe7B,EAAgBY,EAAQC,EAASC,CAAQ,EAC/EtD,KAAKG,qBAAqBmE,IAAIhB,EAAU,CACvCa,QAASC,EACTG,2BAA4B,CAAA,EAC5B5C,YAAa,CAACa,E,CACd,EAED4B,EAAUI,QAAQ,WACbvF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,oBAAqBxB,CAAc,EAG5DP,EAAK9B,qBAAqBsE,OAAOnB,CAAQ,CAC1C,CAAC,EAED,CAAA,EAAOc,G,MAGMtE,aAAAuB,UAAAgD,YAAd,SACC7B,EACAY,EACAC,EACAC,G,kHAMS,OAHHtB,EAAa/C,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcQ,CAAc,EAErEkC,EAAU,IAAInF,kBAAAoF,aAAa,OAAQnC,EAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACjF,CAAA,EAAMrB,EAAWc,KAAUM,EAAQC,CAAO,EAAE3B,QAAO,G,OAO5D,OAPA+B,EAAS7B,EAAAC,KAAA,EACT6C,EAAQI,OAAM,EAET9E,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEiB,4BAC5CvE,KAAK+E,WAAW,CAACvC,GAAiBc,EAAUG,CAAM,EAGnD,CAAA,EAAOA,E,OAIK3D,aAAAuB,UAAA2D,QAAb,SACCxC,EACAY,EACAC,G,OADA,KAAA,IAAAD,IAAAA,EAAA,I,2FAKA,OAFME,EAAWtD,KAAKuD,iBAAiB,CAACf,GAAiB,UAAW,CAACY,EAAQC,EAAQ,EAEtEG,KAAAA,KADXC,EAASzD,KAAK0D,aAAaJ,CAAQ,IAElCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,wBAAyBxB,CAAc,EAGhE,CAAA,EAAOiB,IAGJzD,KAAKG,qBAAqB8D,IAAIX,CAAQ,GACrCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,kCAAmCxB,CAAc,EAG1E,CAAA,EAAOxC,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEa,WAG5ClF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,0BAA2BxB,CAAc,EAG5D4B,EAAYpE,KAAKiF,eAAkBzC,EAAgBY,EAAQC,EAASC,CAAQ,EAClFtD,KAAKG,qBAAqBmE,IAAIhB,EAAU,CACvCa,QAASC,EACTG,2BAA4B,CAAA,EAC5B5C,YAAa,CAACa,E,CACd,EAED4B,EAAUI,QAAQ,WACbvF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,uBAAwBxB,CAAc,EAG/DP,EAAK9B,qBAAqBsE,OAAOnB,CAAQ,CAC1C,CAAC,EAED,CAAA,EAAOc,G,MAGMtE,aAAAuB,UAAA4D,eAAd,SACCzC,EACAY,EACAC,EACAC,G,kHAMS,OAHHtB,EAAa/C,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcQ,CAAc,EAErEkC,EAAU,IAAInF,kBAAAoF,aAAa,UAAWnC,EAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACpF,CAAA,EAAMrB,EAAWgD,QAAa5B,EAAQC,CAAO,G,OAOtD,OAPAI,EAAS7B,EAAAC,KAAA,EACT6C,EAAQI,OAAM,EAET9E,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEiB,4BAC5CvE,KAAK+E,WAAW,CAACvC,GAAiBc,EAAUG,CAAM,EAGnD,CAAA,EAAOA,E,OAIK3D,aAAAuB,UAAA6D,UAAb,SACC1C,EACA2C,EACA9B,G,oGAKA,OAHM1B,EAAWyD,cAAA,CAAI5C,GAAc6C,OAAKF,EAASG,QAAQ,SAAAC,GAAK,IAAA3D,EAAI,OAAA,OAAAA,EAAA2D,EAAMC,UAAO5D,EAAE6D,KAAO,CAACF,EAAMC,QAAQC,MAAQ,EAAE,CAAA,CAAC,EAAA,CAAA,CAAA,EAC5GnC,EAAWtD,KAAKuD,iBAAiB5B,EAAa,YAAa,CAACwD,EAAU9B,EAAQ,EAErEG,KAAAA,KADXC,EAASzD,KAAK0D,aAAaJ,CAAQ,IAElCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,oBAAqBrC,CAAW,EAEzD,CAAA,EAAO8B,IAGJzD,KAAKG,qBAAqB8D,IAAIX,CAAQ,GACrCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,8BAA+BrC,CAAW,EAGnE,CAAA,EAAO3B,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEa,WAG5ClF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,sBAAuBrC,CAAW,EAGrDyC,EAAYpE,KAAK0F,iBAAoBlD,EAAgB2C,EAAU9B,EAASC,EAAU3B,CAAW,EACnG3B,KAAKG,qBAAqBmE,IAAIhB,EAAU,CACvCa,QAASC,EACTG,2BAA4B,CAAA,EAC5B5C,YAAaA,C,CACb,EAEDyC,EAAUI,QAAQ,WACbvF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,mBAAoBrC,CAAW,EAGxDM,EAAK9B,qBAAqBsE,OAAOnB,CAAQ,CAC1C,CAAC,EAED,CAAA,EAAOc,G,MAGMtE,aAAAuB,UAAAqE,iBAAd,SACClD,EACA2C,EACA9B,EACAC,EACA3B,G,kHAMS,OAHHK,EAAa/C,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcQ,CAAc,EAErEkC,EAAU,IAAInF,kBAAAoF,aAAa,YAAanC,EAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAQ,CAAC,EACxF,CAAA,EAAMrB,EAAWkD,UAAUC,EAAU9B,CAAO,EAAE3B,QAAO,G,OAO9D,OAPA+B,EAAS7B,EAAAC,KAAA,EACT6C,EAAQI,OAAM,EAET9E,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEiB,4BAC5CvE,KAAK+E,WAAWpD,EAAa2B,EAAUG,CAAM,EAG9C,CAAA,EAAOA,E,OAGK3D,aAAAuB,UAAAsE,eAAb,SACCnD,EACAY,EACAC,G,OADA,KAAA,IAAAD,IAAAA,EAAA,I,2FAKA,OAFME,EAAWtD,KAAKuD,iBAAiB,CAACf,GAAiB,iBAAkB,CAACY,EAAQC,EAAQ,EAE7EG,KAAAA,KADXC,EAASzD,KAAK0D,aAAaJ,CAAQ,GAEtC,CAAA,EAAOG,GAGJzD,KAAKG,qBAAqB8D,IAAIX,CAAQ,EACzC,CAAA,EAAOtD,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEa,UAG1CC,EAAYpE,KAAK4F,sBAAyBpD,EAAgBY,EAAQC,EAASC,CAAQ,EACzFtD,KAAKG,qBAAqBmE,IAAIhB,EAAU,CACvCa,QAASC,EACTG,2BAA4B,CAAA,EAC5B5C,YAAa,CAACa,E,CACd,EAED4B,EAAUI,QAAQ,WAAM,OAAAvC,EAAK9B,qBAAqBsE,OAAOnB,CAAQ,CAAzC,CAA0C,EAElE,CAAA,EAAOc,G,MAGMtE,aAAAuB,UAAAuE,sBAAd,SACCpD,EACAY,EACAC,EACAC,G,kHAMS,OAHHtB,EAAa/C,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcQ,CAAc,EAErEkC,EAAU,IAAInF,kBAAAoF,aAAa,iBAAkBnC,EAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAC3F,CAAA,EAAMrB,EAAW2D,eAAoBvC,EAAQC,CAAO,G,OAO7D,OAPAI,EAAS7B,EAAAC,KAAA,EACT6C,EAAQI,OAAM,EAET9E,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEiB,4BAC5CvE,KAAK+E,WAAW,CAACvC,GAAiBc,EAAUG,CAAM,EAGnD,CAAA,EAAOA,E,OAIA3D,aAAAuB,UAAAkC,iBAAR,SAAyB5B,EAAuBkE,EAAsBC,GAC/DC,EAAYnB,KAAKC,UAAU,CAAElD,YAAWA,EAAEkE,aAAYA,EAAEC,KAAIA,CAAA,CAAE,EACpE,OAAOzG,OAAO2G,WAAW,QAAQ,EAAEC,OAAOF,CAAS,EAAEG,OAAO,KAAK,CAClE,EAEQpG,aAAAuB,UAAAqC,aAAR,SAAqBJ,GACpB,IACC,IAAM6C,EAAanG,KAAKW,WAAWuD,IAAIZ,CAAQ,EAC/C,GAAI6C,EACH,OAAOvB,KAAKwB,MAAMD,EAAYhH,SAAAkH,WAAW,C,CAEzC,MAAOC,GACRtG,KAAKW,WAAW4F,IAAIjD,CAAQ,C,CAG9B,EAEQxD,aAAAuB,UAAA0D,WAAR,SAAmBpD,EAAuB2B,EAAkBkD,G,QAC3D,IAAI,EAAArH,SAAAsH,eAAc7B,KAAKC,UAAU2B,CAAI,CAAC,EAAI,KACzC,CAAC7E,EAAY+E,SAAS,MAAM,GAC5B,CAAC/E,EAAY+E,SAAS,sBAAsB,GAC5C,CAAC/E,EAAY+E,SAAS,mBAAmB,GACzC,CAAC/E,EAAYmB,KAAK,SAAAR,GAAK,OAAAA,EAAEqE,SAAS,WAAW,CAAtB,CAAuB,GAC9C,CAAChF,EAAYmB,KAAK,SAAAR,GAAK,OAAAA,EAAEsE,WAAW,UAAU,CAAvB,CAAwB,EAC9C,CACD,IAAIC,EAAgB7G,KAAKW,WAAWmG,SAAQ,EAAGC,MAE/C,GAAIF,EAAgB7G,KAAKsB,WAAY,CACpC,IAAI0F,EAAc,EACZC,EAAOjH,KAAKW,WAAWsG,KAAI,E,IAEjC,IAAkB,IAAAC,EAAAC,SAAAF,CAAI,EAAAG,EAAAF,EAAAG,KAAA,EAAA,CAAAD,EAAAE,KAAAF,EAAAF,EAAAG,KAAA,EAAE,CAAnB,IAAME,EAAGH,EAAAI,MAMb,GALAxH,KAAKW,WAAW4F,IAAIgB,CAAG,EACvBP,GAAe,GAEfH,EAAgB7G,KAAKW,WAAWmG,SAAQ,EAAGC,OAEL,IAAlB/G,KAAKsB,WACxB,K,mGAIFwC,QAAQC,IAAI,oCAA2CiD,EAAc,MAAQH,CAAa,C,CAG3F7G,KAAKW,WAAW2D,IAAIhB,EAAUsB,KAAKC,UAAU2B,CAAI,CAAC,EAClDxG,KAAKE,UAAU2C,KAAK,CAAElB,YAAWA,EAAE4F,IAAKjE,CAAQ,CAAE,C,CAEpD,EAEOxD,aAAAuB,UAAAoG,qBAAP,SAA4BzF,G,YACrB0F,EAAqB1H,KAAKE,UAAUkD,OAAO,SAAAd,GAAK,OAAAA,EAAEX,YAAY+E,SAAS1E,CAAU,CAAjC,CAAkC,EAEpF/C,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,yBAA0BhC,CAAU,E,IAG7D,IAAuB,IAAA2F,EAAAR,SAAAO,CAAkB,EAAAE,EAAAD,EAAAN,KAAA,EAAA,CAAAO,EAAAN,KAAAM,EAAAD,EAAAN,KAAA,EAAE,CAAtC,IAAMQ,EAAQD,EAAAJ,MAClBxH,KAAKW,WAAW4F,IAAIsB,EAASN,GAAG,EAE5BvH,KAAKG,qBAAqB8D,IAAI4D,EAASN,GAAG,IAC7CvH,KAAKG,qBAAqB+D,IAAI2D,EAASN,GAAG,EAAEhD,2BAA6B,CAAA,EAErEtF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,IAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,qCAAsC6D,EAASlG,WAAW,C,uGAKrF,IAA+B,IAAAmG,EAAAX,SAAAnH,KAAKG,qBAAqB4H,QAAO,CAAE,EAAAC,EAAAF,EAAAT,KAAA,EAAA,CAAAW,EAAAV,KAAAU,EAAAF,EAAAT,KAAA,EAAE,CAAzD,IAAAY,EAAA5C,OAAA2C,EAAAR,MAAA,CAAA,EAAMpD,GAAF6D,EAAA,GAAWA,EAAA,IACrB7D,EAAUzC,YAAY+E,SAAS1E,CAAU,IAC5CoC,EAAUG,2BAA6B,CAAA,EAEnCtF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,IAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,gDAAiDI,EAAUzC,WAAW,C,mGAKjG3B,KAAKE,UAAYF,KAAKE,UAAUkD,OAAO,SAAAd,GAAK,MAAA,CAACA,EAAEX,YAAY+E,SAAS1E,CAAU,CAAlC,CAAmC,CAChF,EAEQlC,aAAAuB,UAAAD,kBAAR,WAAA,IAAAa,EAAAjC,KAcOkI,EAbKjJ,QAAAsC,gBAAgBC,UAAS,EAaZ2G,MAXP,CAChB,CACCC,OAAQ,CACPC,KAAM,CACL,CAACC,UAAW,CAAEC,KAAM,CAAC,OAAQ,uBAAwB,oBAAoB,CAAE,EAC3E,CAACD,UAAW,CAAEE,KAAM,eAAe,CAAE,EACrC,CAACF,UAAW,CAAEE,KAAM,WAAW,CAAE,E,IAKG,CAAEC,aAAc,cAAc,CAAE,EAExEP,EAAaQ,GAAG,SAAU,SAAOC,GAAW,OAAAC,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACvC0G,EAAW,IAAKA,EAAW,GAAEE,OAC1BrG,EAAiBmG,EAAW,GAAEE,KACjB7I,KAAKgC,WAAWQ,CAAc,IAGhDxC,KAAKyH,qBAAqBjF,CAAc,E,QAkD1C,EAED0F,EAAaQ,GAAG,QAAS,SAAAI,GACxBhF,QAAQC,IAAI,IAAIC,KAAQ,uCAAuC,EAC/DkE,EAAaa,MAAK,EAClB5F,WAAW,WAAM,OAAAlB,EAAKb,kBAAiB,CAAtB,EAA0B,GAAI,CAChD,CAAC,EAED8G,EAAaQ,GAAG,QAAS,WACxB5E,QAAQC,IAAI,IAAIC,KAAQ,2CAA2C,EACnEb,WAAW,WAAM,OAAAlB,EAAKb,kBAAiB,CAAtB,EAA0B,GAAI,CAChD,CAAC,CACF,EACDtB,YAAA,EAAC,EAEDkJ,mBA3eaC,QAAAnJ,aAAAA,aA+eZ,SAAYuD,GAQX,IAOK6F,EAlBNlJ,KAAAmJ,gBAA6E,KAC7EnJ,KAAAoJ,mBAAgF,KAGhD,UAA3B/F,EAAQb,eACXxC,KAAKmJ,gBAAkB,IAAIE,2BAA8BhG,CAAO,EAGhErD,KAAKmJ,gBAAkB,IAAIG,uBAA0BjG,CAAO,EAGzDA,EAAQkG,uBACXvJ,KAAKmJ,gBAAgBK,YAAc,CAAA,GAE/BC,GAAgB,EAAAtK,SAAAuK,UAASrG,EAAQsG,MAAM,GAC7BC,IAAInH,KAAO,SACzBgH,EAAcG,IAAIC,SAAW,CAAA,EAEzBX,EAAgD,CACnD1G,eAAgBa,EAAQb,eAAiB,YACzCmH,OAAQF,EACRF,qBAAsB,CAAA,EACtBO,iBAAkB,CAAA,EAClBC,0BAA2B,GAC3BC,WAAY,CAAA,EACZC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbhI,kBAAmB,I,EAGW,UAA3BmB,EAAQb,eACXxC,KAAKoJ,mBAAqB,IAAIC,2BAA8BH,CAAc,EAG1ElJ,KAAKoJ,mBAAqB,IAAIE,uBAA0BJ,CAAc,EAGvElJ,KAAKoJ,mBAAmBe,YAAY,CAACC,UAAW,EAAGC,UAAW,CAAC,CAAC,EAChErK,KAAKmJ,gBAAgBmB,kBAAoBjH,EAAQb,eAAiB,YAEpE,GAeD8G,wBAxDaL,QAAAD,kBAAAA,kBAwDb,WAYC,SAAAM,uBAAYjG,GAAZ,IAUMkH,EAVNtI,EAAAjC,KAeKwK,GA1BLxK,KAAAwC,eAAiB,GACjBxC,KAAAkK,YAAc,CAAA,EACdlK,KAAAyK,YAAc,KACdzK,KAAA0K,SAAW,KACX1K,KAAAgK,WAAa,CAAA,EACbhK,KAAAwJ,YAAc,CAAA,EACdxJ,KAAAsK,kBAAoB,GACpBtK,KAAAiK,WAAa,CAAA,EACbjK,KAAA2K,MAAQ,CAAA,EAIP3K,KAAKwC,eAAiBa,EAAQb,eAC9BxC,KAAKyK,YAAc,IAAI3L,eAAA8L,QAAavH,EAAQsG,MAAM,EAClD3J,KAAKgK,WAAa3G,EAAQ2G,WAC1BhK,KAAKiK,WAAa5G,EAAQ4G,WAC1BjK,KAAKkK,YAAc7G,EAAQ6G,YAC3BlK,KAAKkC,kBAAoBmB,EAAQnB,kBAE7BmB,EAAQyG,mBACX9J,KAAK2K,MAAQ,CAAA,EACTJ,GAAa,EAAApL,SAAAuK,UAASrG,EAAQsG,MAAM,EACpCe,GAAW,EAAAvL,SAAA0L,gBAAexH,EAAQ0G,0BAA2BQ,EAAY,EAAE,EAC/EvK,KAAK0K,UAAW,EAAAvL,SAAA2L,eAAcJ,CAAQ,GAGxBK,YAAY,WACtB9L,QAAAsC,iBAAmBtC,QAAAsC,gBAAgBoC,cAAa,GAAM1E,QAAAsC,gBAAgByJ,gBAAe,GAAM/L,QAAAsC,gBAAgByJ,gBAAe,EAAGlJ,qBAAoB,EAAGnC,SACvJV,QAAAsC,gBAAgByJ,gBAAe,EAAGjJ,mBAAmBE,CAAI,EACzDgJ,cAAcT,CAAQ,EAExB,EAAG,CAAC,EACL,C,MAy0DD,OAlyDClB,uBAAAjI,UAAA6J,0BAAA,SAA0BC,GACzB,IACIC,EAAUD,EAAaE,MADR,mDAC0B,EAQ7C,OAHCD,EAHG,CAACA,GAAWA,EAAQzL,QAAU,EAGvBwL,EAAaE,MADR,kCAC0B,EAGnCD,IAA4B,EAAjBA,EAAQzL,OAAayL,EAAQ,GAAK,IACrD,EAEA9B,uBAAAjI,UAAA6D,UAAA,SAAUC,EAAoB9B,EAA4BiI,GAA1D,IAAArJ,EAAAjC,KACC,OADyD,KAAA,IAAAsL,IAAAA,EAAA,CAAA,GAClD,IAAIrI,QAAQ,SAACC,EAASqI,GAC5B,IAQKC,EARAF,GAQAE,EAAU,IAAIjM,kBAAAoF,aAAa,YAAa1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAQ,CAAC,EACpGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEgD,UAAUC,EAAU9B,CAAO,EAAE3B,QAAO,EAAGiB,KAAK,SAAA8I,GAClID,EAAQ1G,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACF0C,EAAQ1G,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,kBAAmB/B,EAAKO,eAAgB2C,EAAU9B,EAASyF,CAAG,EACtFyC,EAAOzC,CAAG,CACX,CAAC,GAfD7J,QAAAsC,gBAAgByJ,gBAAe,EAAG9F,UAAUjD,EAAKO,eAAgB2C,EAAU9B,CAAO,EAAEV,KAAK,SAAA8I,GACxFvI,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFyC,EAAOzC,CAAG,CACX,CAAC,CAaH,CAAC,CACF,EAEMQ,uBAAAjI,UAAAqK,eAAN,SAAqBvG,EAAoB9B,G,8FACxC,MAAA,CAAA,EAAO,IAAIJ,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,iBAAkB1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAQ,CAAC,EACzGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEgD,UAAUC,EAAU9B,CAAO,EAAE3B,QAAO,EAAGiB,KAAK,SAAA8I,GAClI/G,EAAQI,OAAM,EACd5B,EAAQuI,EAAI9L,MAAM,CACnB,EAAG,SAAAmJ,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,kBAAmB/B,EAAKO,eAAgB2C,EAAU9B,EAASyF,CAAG,EACtFyC,EAAO,CAAC,CACT,CAAC,CACF,CAAC,E,MAGFjC,uBAAAjI,UAAAsK,gBAAA,SAAgBxG,EAAoB9B,GACnC,IAAIqB,EAAU,IAAInF,kBAAAoF,aAAa,kBAAmB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAQ,CAAC,EACtGuI,EAAS3M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEgD,UAAUC,EAAU9B,CAAO,EAM/H,OALAuI,EAAOlD,GAAG,QAAS,SAAAmD,GAElB,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EAEMD,CACR,EAEAtC,uBAAAjI,UAAAyK,gBAAA,SAAgB3G,EAAoB9B,EAA4B0I,GAC/D,IAAIrH,EAAU,IAAInF,kBAAAoF,aAAa,kBAAmB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAS0I,EAAc,CAAC,EACrHC,EAAS/M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEgD,UAAUC,EAAU9B,CAAO,EAAE2I,OAAOD,CAAa,EAcrJ,OAbAC,EAAOtD,GAAG,MAAO,SAAAmD,GAEhB,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EACAnD,GAAG,QAAS,SAAAmD,GAEZ,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EACAnD,GAAG,QAAS,SAAAmD,GAEZ,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EAEMG,CACR,EAEM1C,uBAAAjI,UAAA4K,UAAN,SACCC,EACA7I,EACA8I,G,OAAA,KAAA,IAAAA,IAAAA,EAAA,CAAA,G,+IAEA,GAAI,CAACD,EAAWvM,OACf,MAAA,CAAA,EAAO,MAGFyM,EAAa,IACfC,EAAU,E,sBAEPA,EAAUH,EAAWvM,QAAM,MAAA,CAAA,EAAA,IAC3B2M,EAAWJ,EAAWK,MAAMF,EAASA,EAAUD,CAAU,EAGzDI,EAAO,GACPC,EAAa,G,IAEnB,IAAiBC,EAAA,KAAA,EAAAC,EAAAxF,SAAAmF,CAAQ,EAAAM,EAAAD,EAAAtF,KAAA,EAAA,CAAAuF,EAAAtF,KAAAsF,EAAAD,EAAAtF,KAAA,EAAE,CAK1B,GALUwF,EAAED,EAAApF,MACNsF,EAASC,OAAO9F,KAAK4F,CAAE,EAAE,GACzBG,EAAMH,EAAGC,GAGX9M,KAAKkK,aAAe,CAACiC,EAAmB,CAI3C,GAHMc,EAAoBjN,KAAKyK,YAAYyC,WAAU,EACjDC,EAAO,KAAA,EAEI,cAAXL,EACHK,EAAUF,EAAkBG,SAASJ,EAAIK,QAAQ,OAE7C,GAAe,eAAXP,EACRK,EAAUF,EAAkBG,SAASJ,EAAIM,WAAW,OAEhD,GAAe,cAAXR,GAAqC,eAAXA,EAElCK,EAAUF,EAAkBG,SAASJ,EAAI/G,OAAQ,CAAEsH,SAAU,CAAA,CAAI,CAAE,MAE/D,CAAA,GAAe,cAAXT,GAAqC,eAAXA,EAKlC,MAAM,IAAIU,MAAM,+BAAAC,OAA+BX,CAAM,CAAE,EAHvDK,EAAU,CAAA,C,CAMX,GAAI,CAACA,EACJ,MAAM,IAAIK,MACT,gCAAAC,OAAgCX,EAAM,IAAA,EAAAW,OAAK7I,KAAKC,UAAUoI,EAAkBS,iBAAgB,CAAE,CAAC,CAAE,C,CAOpG,GAAe,cAAXZ,EAEC9M,KAAKgK,aACRgD,EAAIK,SAASM,UAAY,IAAI3J,KAC7BgJ,EAAIK,SAASO,UAAY,IAAI5J,MAI1BhE,KAAKiK,YACRuC,EAAK3J,KAAK,CACTgL,UAAW,CACVR,SAAU,CACTzD,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIK,SAASzD,KAAOkE,kBAAiB,EAClDE,SACC,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAUmI,EAAIK,QAAQ,CAAC,EAAI,IAC3CzI,KAAKC,UAAUmI,EAAIK,SAAU,KAAM,CAAC,EACpC,UACJY,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,GAGjB,EAIEhE,KAAKwJ,cACF8E,EAAUC,SAAAA,SAAA,GACZvB,EAAIK,QAAQ,EAAA,CACfmB,IAAK,EACL5E,IAAK,CAAEA,IAAKoD,EAAIK,SAASzD,KAAOkE,kBAAiB,EAAIU,IAAK,CAAC,CAAE,CAAA,EAE9D/B,EAAW5J,KAAK,CACfgL,UAAW,CACVR,SAAUiB,C,EAEX,GAIFzB,EAAGC,GAAQO,SAAWL,EAAIK,cAEtB,GAAe,cAAXP,GAAqC,eAAXA,EAE9B9M,KAAKgK,aACHgD,EAAI/G,OAAOwI,OACfzB,EAAI/G,OAAOwI,KAAO,IAEnBzB,EAAI/G,OAAOwI,KAAKb,UAAY,IAAI5J,MAI7BhE,KAAKwJ,cACHwD,EAAI/G,OAAOyI,OACf1B,EAAI/G,OAAOyI,KAAO,IAEnB1B,EAAI/G,OAAOyI,KAAKF,IAAM,GAInBxO,KAAKiK,YACRuC,EAAK3J,KAAK,CACTgL,UAAW,CACVR,SAAU,CACTzD,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAI5J,OAAOwG,KAAO,KAC/BoE,SACC,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAUmI,EAAI/G,MAAM,CAAC,EAAI,IACzCrB,KAAKC,UAAUmI,EAAI/G,OAAQ,KAAM,CAAC,EAClC,UACJgI,OAAQnB,EACRoB,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,GAGjB,EAIEhE,KAAKwJ,aACRiD,EAAW5J,KAAK,CACfO,OAAQ4J,EAAI5J,M,CACZ,OAKE,GAAe,eAAX0J,EAEJ9M,KAAKgK,aACRgD,EAAIM,YAAYM,UAAY,IAAI5J,MAI7BhE,KAAKwJ,cACRwD,EAAIM,YAAYkB,KAAOxB,EAAIM,YAAYkB,KAAO,GAAK,GAIhDxO,KAAKiK,YACRuC,EAAK3J,KAAK,CACTgL,UAAW,CACVR,SAAU,CACTzD,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAI5J,OAAOwG,KAAO,KAC/BoE,SACC,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAUmI,EAAIM,WAAW,CAAC,EAAI,IAC9C1I,KAAKC,UAAUmI,EAAIM,YAAa,KAAM,CAAC,EACvC,UACJW,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,GAGjB,EAIEhE,KAAKwJ,aACRiD,EAAW5J,KAAK,CACfO,OAAQ4J,EAAI5J,M,CACZ,EAIFyJ,EAAGC,GAAQQ,YAAcN,EAAIM,gBAEzB,CAAA,GAAe,cAAXR,GAAqC,eAAXA,EAmClC,MAAM,IAAIU,MAAM,+BAAAC,OAA+BX,CAAM,CAAE,EAjCnD9M,KAAKiK,YACRuC,EAAK3J,KAAK,CACTgL,UAAW,CACVR,SAAU,CACTzD,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAI5J,OAAOwG,KAAO,KAC/BoE,SACC,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAUmI,EAAI5J,MAAM,CAAC,EAAI,IACzCwB,KAAKC,UAAUmI,EAAI5J,OAAQ,KAAM,CAAC,EAClC,UACJ6K,OAAQnB,EACRoB,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,GAGjB,EAIEhE,KAAKwJ,aACRiD,EAAW5J,KAAK,CACfO,OAAQ4J,EAAI5J,M,CACZ,C,oGAYJ,OADMsB,EAAU,IAAInF,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACyH,EAAUjJ,EAAQ,CAAC,EACtG,CAAA,EAAMpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,cAAc,EAAEyJ,UAAUK,EAAUjJ,CAAO,G,cAA7FyE,EAAAjG,KAAA,EACA6C,EAAQI,OAAM,EAGV9E,KAAKiK,YAA4B,EAAduC,EAAK7M,QAC3B,CAAA,EAAMV,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAEiK,UAAUO,CAAI,GADhE,CAAA,EAAA,G,OACH1E,EAAAjG,KAAA,E,wBAIG7B,KAAKwJ,aAAmC,EAApBiD,EAAW9M,QAE5BgP,EAAiBlC,EAAWmC,IAAI,SAACC,GAAM,OAAAA,EAAEzL,MAAF,CAAQ,EAChC,CAAA,EAAMnE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,cAAc,EAAEM,KAAK,CAAEgM,IAAKH,CAAc,CAAE,EAAEjN,QAAO,IAHzH,CAAA,EAAA,I,cAGGqN,EAAejH,EAAAjG,KAAA,EAaO,GAVtBmN,EAAiBD,EAAaH,IAAI,SAAC5B,GAAQ,MAAA,CAChDa,UAAW,CACVR,SAAQkB,SAAAA,SAAA,GACJvB,CAAG,EAAA,CACNpD,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAE,CAAA,C,CAGrC,CAPgD,CAO/C,GAGiB7O,QAClB,CAAA,EAAMV,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKsK,iBAAiB,EAAE2B,UAAe+C,CAAc,GAD/F,CAAA,EAAA,G,OACHlH,EAAAjG,KAAA,E,iBA+BoB,O,wBA1BdoN,EAAiBF,EAAaH,IAAI,SAAC5B,GAAQ,OAAAA,EAAIpD,GAAJ,CAAO,EAElDzE,EAAW,CAChB,CACCiD,OAAQ,CAAEgC,UAAW,CAAE8E,IAAKD,CAAc,CAAE,C,EAE7C,CACCE,MAAO,CAAE/E,UAAW,EAAGC,UAAW,CAAC,CAAC,C,EAErC,CACC+E,OAAQ,CACPxF,IAAK,WACLyF,SAAU,CAAEC,MAAO,MAAM,C,GAG3B,CACCC,SAAU,CACTC,iBAAkB,CAAEC,OAAQ,CAAC,YAAa,EAAG,CAAEC,MAAO,WAAW,EAAG,C,GAGtE,CAAEC,QAAS,mBAAmB,EAC9B,CACCC,aAAc,CAAEC,QAAS,CAAEjG,IAAK,mBAAmB,CAAE,C,GAInC,CAAA,EAAM3K,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKsK,iBAAiB,EAAEpF,UAAUC,CAAQ,EAAEzD,QAAO,G,cAE3F,GAFnBoO,EAAchI,EAAAjG,KAAA,GAEJlC,OACf,CAAA,EAAMV,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKsK,iBAAiB,EAAEyF,WAAW,CAAEnG,IAAK,CAAEsF,IAAKY,EAAYlB,IAAI,SAACC,GAAM,OAAAA,EAAEjF,GAAF,CAAK,CAAC,CAAE,CAAE,GAD5H,CAAA,EAAA,I,OACH9B,EAAAjG,KAAA,E,0DAIDiC,QAAQwC,MAAM,gCAAiC0J,CAAK,E,eAQtD,OAHA3D,GAAWD,EAGX,CAAA,EAAM,IAAInJ,QAAQ,SAACC,GAAY,OAAA+M,aAAa/M,CAAO,CAApB,CAAqB,G,eAApD4E,EAAAjG,KAAA,EAGA5C,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBzH,KAAKwC,cAAc,E,cAG3E,MAAA,CAAA,EAAO,CAAE0N,GAAI,CAAC,E,OAGf5G,uBAAAjI,UAAAsE,eAAA,SACCvC,EACAC,EACAiI,GAHD,IAAArJ,EAAAjC,KAKC,OAJA,KAAA,IAAAoD,IAAAA,EAAA,IAEA,KAAA,IAAAkI,IAAAA,EAAA,CAAA,GAEO,IAAIrI,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,uGAGa,IAA/B8K,OAAO9F,KAAK7D,CAAM,EAAEzD,QAI5B,CAAA,EAAMV,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEiO,uBAAuB9M,CAAO,GAFpI,CAAA,EAAA,G,cAEGoI,EAAM2E,EAAAvO,KAAA,EACZqB,EAAQuI,CAAG,E,aAEFH,GASL+E,EAAU,IAAI9Q,kBAAAoF,aAAa,iBAAkB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACvGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEyD,eAAoBvC,EAAQC,CAAO,EAAEV,KAC3H,SAAA8I,GACC4E,EAAQvL,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EACA,SAAA3C,GACCuH,EAAQvL,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,wBAAyB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC1FyC,EAAOzC,CAAG,CACX,CAAC,GAjBF7J,QAAAsC,gBAAgByJ,gBAAe,EAAGrF,eAAe3F,KAAKwC,eAAgBY,EAAQC,CAAO,EAAEV,KACtF,SAAA8I,GAAO,OAAAvI,EAAQuI,CAAG,CAAX,EACP,SAAA3C,GAAO,OAAAyC,EAAOzC,CAAG,CAAV,CAAW,E,sDAmBpBhF,QAAQC,IAAI,IAAIC,KAAQ,gCAAiChE,KAAKwC,eAAgBY,EAAQC,EAASiN,CAAG,EAClG/E,EAAO+E,CAAG,E,4BAEX,CACF,EAGAhH,uBAAAjI,UAAAkP,OAAA,SAAOC,EAAiBnN,GACvB,OAAKoN,MAAMC,QAAQF,CAAM,EAGE,IAAlBA,EAAO7Q,OACRK,KAAK6N,UAAU2C,EAAO,GAAsBnN,CAAO,EAGpDrD,KAAK2Q,WAAWH,EAA0BnN,CAAO,EANhDrD,KAAK6N,UAAU2C,EAA0BnN,CAAO,CAOzD,EAEAiG,uBAAAjI,UAAA8I,YAAA,SAAYyG,EAAkBvN,GAA9B,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,iEAIf,O,sBAAA,CAAA,EADHhD,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAC5D2O,QAAO,G,OAOlD,OAPMC,EAAkBV,EAAAvO,KAAA,EAGJiP,EAAgBzO,KAAK,SAAA0O,GACxC,OAAAnM,KAAKC,UAAUkM,EAAMxJ,GAAG,IAAM3C,KAAKC,UAAU+L,CAAW,CAAxD,CAAyD,GAIzD,CAAA,EAAO1N,EAAQ,sBAAsB,IAItCoG,uBAAuB0H,WAAWnO,KAAK,CACtCoO,OAAQ,cACRjP,WAAYhC,KACZkR,MAAO,CAACN,GACRvN,QAASA,C,EACP,SAACyF,EAAKrF,GACJqF,EAAKyC,EAAOzC,CAAG,EACd5F,EAAQO,CAAM,CACpB,CAAC,E,gCAED8H,EAAO4F,CAAG,E,4BAEX,CACF,EAEA7H,uBAAAjI,UAAA+P,cAAA,SAAcC,EAAgChO,GAA9C,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,mEAGf,O,sBAAA,CAAA,EADHhD,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAC5D2O,QAAO,G,OAUlD,OAVMS,EAAkBlB,EAAAvO,KAAA,EAUO,KAPzB0P,EAAkBF,EAAWjO,OAAO,SAAAoO,GACzC,MAAA,CAACF,EAAgBjP,KAAK,SAAAoP,GACrB,OAAA7M,KAAKC,UAAU4M,EAAclK,GAAG,IAAM3C,KAAKC,UAAU2M,EAAUjK,GAAG,CAAlE,CAAmE,CADpE,CAEC,GAIkB5H,QACnB,CAAA,EAAOuD,EAAQ,CAAC,4BAA4B,IAI7CoG,uBAAuB0H,WAAWnO,KAAK,CACtCoO,OAAQ,gBACRjP,WAAYhC,KACZkR,MAAO,CAACK,GACRlO,QAASA,C,EACP,SAACyF,EAAKrF,GACJqF,EAAKyC,EAAOzC,CAAG,EACd5F,EAAQO,CAAM,CACpB,CAAC,E,gCAED8H,EAAOmG,CAAG,E,4BAEX,CACF,EAEApI,uBAAAjI,UAAA0O,WAAA,SAAW3M,EAAqEC,EAAyBsO,GAAzG,IAAA1P,EAAAjC,KACC,OADU,KAAA,IAAAoD,IAAAA,EAAA,IAA8F,KAAA,IAAAuO,IAAAA,EAAA,CAAA,GACjG,IAAI1O,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,sFACpCjC,CAAAA,KAAKiK,YAAe0H,EAApB,CAAA,EAAA,GACQ,CAAA,EAAM3R,KAAK8C,KAAKM,CAAM,G,OAEjC,IAFIwO,EAAOxB,EAAAvO,KAAA,EAEFgQ,EAAI,EAAGA,EAAID,EAAKjS,OAAQkS,CAAC,GAC7B7E,EAAM4E,EAAKC,GAEf5S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,GAAU,KAAM,CAAC,EAAI,UAC5H4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAEGrO,KAAKwJ,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEwH,WAAgB,CAAClI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAACyD,OAAQ,CAAA,CAAI,CAAC,EACrJ9S,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyF,WAAgB,CAAC1H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC2H,IAAKhF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,G,wBAKnJ9J,EAAU,IAAInF,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACnGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE6N,WAAgB3M,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAC5H/G,EAAQI,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIyG,YAAY,GAGxB3G,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACtFyC,EAAOzC,CAAG,CACX,CAAC,E,SACD,CACF,EAEAQ,uBAAAjI,UAAA8Q,UAAA,SAAU/O,EAAqEC,EAAmCsO,GAAlH,IAAA1P,EAAAjC,KACC,OADS,KAAA,IAAAoD,IAAAA,EAAA,IAAwG,KAAA,IAAAuO,IAAAA,EAAA,CAAA,GAC1G,IAAI1O,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,0DACpCjC,KAAKiK,YAAc,CAAC0H,GACnBS,EAAU,IAAI7S,kBAAAoF,aAAa,mBAAoB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACzGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEmQ,iBAAsBjP,EAAQC,CAAO,EAAEV,KAAK,SAAM2P,GAAS,OAAA1J,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,mDACjJmQ,EAAQtN,OAAM,GACVkI,EAAMsF,EAAU9K,QAGfxH,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,GAAU,KAAM,CAAC,EAAI,UAC5H4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGErO,KAAKwJ,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEwH,WAAgB,CAAClI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAACyD,OAAQ,CAAA,CAAI,CAAC,EACrJ9S,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyF,WAAgB,CAAC1H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC2H,IAAKhF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,GAGrJvP,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBzH,KAAKwC,cAAc,EAE1EU,EAAQ,CAAC,GAGTA,EAAQ,CAAC,E,SAER,SAAA4F,GACFsJ,EAAQtN,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC9FyC,EAAOzC,CAAG,CACX,CAAC,IAGGyJ,EAAU,IAAIhT,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAClGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEiQ,UAAe/O,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAC3H8G,EAAQzN,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIyG,YAAY,GAGxB3G,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACFyJ,EAAQzN,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACrFyC,EAAOzC,CAAG,CACX,CAAC,G,QAEF,CACF,EAEAQ,uBAAAjI,UAAAmR,SAAA,SAASjL,EAAanE,EAAiEC,GAAvF,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,WAAY1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAAC0C,EAAKnE,EAAQC,EAAQ,CAAC,EACtGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEsQ,SAASjL,EAAUnE,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAC/H/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACnFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAoR,KAAA,SAAKpP,GAAL,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,OAAQ1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACxB,EAAQ,CAAC,EACrFpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEuQ,KAAKpP,CAAO,EAAEV,KAAK,SAAA8I,GACzG/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,wBAAyB/B,EAAKO,eAAgBa,EAASyF,CAAG,EAClFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAqR,UAAA,SAAUC,EAAmBtP,GAA7B,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,YAAa1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAAC8N,EAAWtP,EAAQ,CAAC,EACrGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEwQ,UAAUC,EAAWtP,CAAO,EAAEV,KAAK,SAAA8I,GACzH/G,EAAQI,OAAM,EACd5B,EAAkBuI,CAAG,CACtB,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBmQ,EAAWtP,EAASyF,CAAG,EACxFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAuR,YAAA,SAAYvP,GAAZ,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,cAAe1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACxB,EAAQ,CAAC,EAC5FpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE0Q,YAAYvP,CAAO,EAAEV,KAAK,SAAA8I,GAChH/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,qBAAsB/B,EAAKO,eAAgBa,EAASyF,CAAG,EAC/EyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAyB,KAAA,SAAKM,EAAqEC,EAA0BiI,GAApG,IAAArJ,EAAAjC,KACC,OADI,KAAA,IAAAoD,IAAAA,EAAA,IAA+F,KAAA,IAAAkI,IAAAA,EAAA,CAAA,GAC5F,IAAIrI,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,wDACnCqJ,GAQAuH,EAAU,IAAItT,kBAAAoF,aAAa,OAAQ3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAC7FpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEY,KAAaM,EAAQC,CAAO,EAAE3B,QAAO,EAAGiB,KAAK,SAAA8I,GACnIoH,EAAQ/N,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACF+J,EAAQ/N,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,aAAc/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC/EyC,EAAOzC,CAAG,CACX,CAAC,GAfD7J,QAAAsC,gBAAgByJ,gBAAe,EAAGlI,KAAK9C,KAAKwC,eAAgBY,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GACjFvI,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFyC,EAAOzC,CAAG,CACX,CAAC,E,QAaF,CACF,EAEAQ,uBAAAjI,UAAAyR,SAAA,SAASC,EAAY1P,GAArB,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,WAAY1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAAC,CAAC+E,IAAKmJ,CAAE,EAAG1P,EAAQ,CAAC,EACpGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE8C,QAAgB,CAAC4E,IAAKmJ,CAAE,EAAG1P,CAAO,EAAEV,KAAK,SAAA8I,GAC/H/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgB,CAACoH,IAAKmJ,CAAE,EAAG1P,EAASyF,CAAG,EACxFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAA2R,UAAA,SAAU5P,EAAqEC,GAA/E,IAAApB,EAAAjC,KACC,OADS,KAAA,IAAAoD,IAAAA,EAAA,IACF,IAAIH,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,YAAa1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAClGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEY,KAAUM,EAAQC,CAAO,EAAE4P,MAAK,EAAGtQ,KAAK,SAAA8I,GAC9H/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACrFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAA6R,WAAA,SAAW9P,EAAqEC,GAArE,KAAA,IAAAD,IAAAA,EAAA,IACV,IAAIsB,EAAU,IAAInF,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAC/FuI,EAAS3M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEY,KAAUM,EAAQC,CAAO,EAO7H,OANAuI,EAAOlD,GAAG,QAAS,SAAAmD,GAGlB,OAFAnH,EAAQI,OAAM,EACd8G,EAAOuH,mBAAkB,EAClBtH,CACR,CAAC,EAEMD,CACR,EAEAtC,uBAAAjI,UAAA+R,WAAA,SAAWhQ,EAAqEC,EAA0B0I,GAA/F,KAAA,IAAA3I,IAAAA,EAAA,IACV,IAAIsB,EAAU,IAAInF,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAS0I,EAAc,CAAC,EAC9GC,EAAS/M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEY,KAAUM,EAAQC,CAAO,EAAE2I,OAAOD,CAAa,EAcnJ,OAbAC,EAAOtD,GAAG,MAAO,SAAAmD,GAEhB,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EACAnD,GAAG,QAAS,SAAAmD,GAEZ,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EACAnD,GAAG,QAAS,SAAAmD,GAEZ,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EAEMG,CACR,EAEA1C,uBAAAjI,UAAA2D,QAAA,SAAQ5B,EAAqEC,EAA0BiI,GAAvG,IAAArJ,EAAAjC,KACC,OADO,KAAA,IAAAoD,IAAAA,EAAA,IAA+F,KAAA,IAAAkI,IAAAA,EAAA,CAAA,GAC/F,IAAIrI,QAAQ,SAACC,EAASqI,GAC5B,IAQK8H,EARA/H,GAQA+H,EAAU,IAAI9T,kBAAAoF,aAAa,UAAW1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAChGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE8C,QAAgB5B,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAC5H4H,EAAQvO,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFuK,EAAQvO,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACnFyC,EAAOzC,CAAG,CACX,CAAC,GAfD7J,QAAAsC,gBAAgByJ,gBAAe,EAAGhG,QAAQ/C,EAAKO,eAAgBY,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GACpFvI,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFyC,EAAOzC,CAAG,CACX,CAAC,CAaH,CAAC,CACF,EAEAQ,uBAAAjI,UAAAgR,iBAAA,SAAiBjP,EAAqEC,EAAmCsO,GAAzH,IAAA1P,EAAAjC,KACC,OADgB,KAAA,IAAAoD,IAAAA,EAAA,IAAwG,KAAA,IAAAuO,IAAAA,EAAA,CAAA,GACjH,IAAI1O,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,wDACpCyC,EAAU,IAAInF,kBAAAoF,aAAa,mBAAoB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACzGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEmQ,iBAAsBjP,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAClI/G,EAAQI,OAAM,EACd,IAmBMwJ,EAnBFtB,EAAMvB,EAAIjE,MAEVwF,GACC/K,EAAKgI,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,GAAU,KAAM,CAAC,EAAI,UAC5H4K,OAAQ,mBACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGEpM,EAAKuH,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWC,EAAKqI,iBAAiB,EAAEwH,WAAgB,CAAClI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAACyD,OAAQ,CAAA,CAAI,CAAC,GAGtJ9S,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAE1EU,EAAW8J,CAAG,GAGd9J,EAAQ,IAAI,CAEd,EAAG,SAAA4F,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC9FyC,EAAOzC,CAAG,CACX,CAAC,E,QACD,CACF,EAEAQ,uBAAAjI,UAAAiS,kBAAA,SAAkBlQ,EAAqEkK,EAAgBjK,EAAoCsO,EAAoBxF,GAA/J,IAAAlK,EAAAjC,KACC,OADiB,KAAA,IAAAoD,IAAAA,EAAA,IAAyH,KAAA,IAAAuO,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAxF,IAAAA,EAAA,CAAA,GACvJ,IAAIlJ,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACpCjC,CAAAA,KAAKkK,aAAgBiC,IAClBoH,EAAavT,KAAKyK,YAAYyC,WAAU,EAC9BqG,EAAWnG,SAASE,CAAW,IAW5CkG,EAAO,IAAIxP,KAEXhE,KAAKgK,aACRsD,EAAYM,UAAY4F,GAGrBnQ,GAAWA,EAAQ0O,SACjBzE,EAAY1D,MAChB0D,EAAY1D,IAAMkE,kBAAiB,GAGhC9N,KAAKwJ,cACR8D,EAAYkB,IAAM,GAGfxO,KAAKgK,aAAc,CAACsD,EAAYK,YACnCL,EAAYK,UAAY6F,GAItB9O,EAAU,IAAInF,kBAAAoF,aAAa,oBAAqB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EACvHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEoR,kBAAuBlQ,EAAQkK,EAAajK,CAAO,EAAEV,KAAK,SAAA8I,GAChJ/G,EAAQI,OAAM,EACd,IAmBMwJ,EAnBFtB,EAAMvB,EAAIjE,MAEVwF,GACC/K,EAAKgI,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,oBACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGEpM,EAAKuH,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWC,EAAKqI,iBAAiB,EAAEwH,WAAgB,CAAClI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAACyD,OAAQ,CAAA,CAAI,CAAC,GAGtJ9S,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAE1EU,EAAW8J,CAAG,GAGd9J,EAAQ,IAAI,CAEd,EAAG,SAAA4F,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,6BAA8B/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC/FyC,EAAOzC,CAAG,CACX,CAAC,IAnEChF,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,oCAAqC+Q,EAAW7F,iBAAgB,CAAE,EAC/GzO,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAGC,mBAAmBC,KAAK1U,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAI,iBAAkB,wCAA0CzT,KAAKwC,eAAgB,CAAC+Q,EAAW7F,iBAAgB,EAAIJ,EAAY,EAE5P/B,EAAOgI,EAAW7F,iBAAgB,CAAE,G,QAiEtC,CACF,EAEApE,uBAAAjI,UAAAuS,iBAAA,SAAiBxQ,EAAqE6C,EAAqC5C,EAAmCsO,EAAoBxF,GAAlL,IAAAlK,EAAAjC,KACC,OADgB,KAAA,IAAAoD,IAAAA,EAAA,IAA6I,KAAA,IAAAuO,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAxF,IAAAA,EAAA,CAAA,GAC1K,IAAIlJ,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACpCjC,CAAAA,KAAKkK,aAAgBiC,IAClBoH,EAAavT,KAAKyK,YAAYyC,WAAU,EAC9BqG,EAAWnG,SAASnH,EAAQ,CAACsH,SAAU,CAAA,CAAI,CAAC,IAUzDvN,KAAKgK,aACJwJ,EAAO,IAAIxP,KAEViC,EAAOwI,KAIXxI,EAAOwI,KAAKb,UAAY4F,EAHxBvN,EAAOwI,KAAY,CAACb,UAAW4F,CAAI,GAOjCnQ,GAAWA,EAAQ0O,SACjB9L,EAAO4N,cAcN5N,EAAO4N,aAAajK,MACxB3D,EAAO4N,aAAajK,IAAMkE,kBAAiB,GAGxC9N,KAAKgK,YAAc,CAAC/D,EAAO4N,aAAalG,YAC3C1H,EAAO4N,aAAalG,UAAY,IAAI3J,OAlBjChE,KAAKgK,WACR/D,EAAO4N,aAAoB,CAC1BjK,IAAKkE,kBAAiB,EACtBH,UAAW,IAAI3J,I,EAIhBiC,EAAO4N,aAAoB,CAC1BjK,IAAKkE,kBAAiB,C,GAetBpJ,EAAU,IAAInF,kBAAAoF,aAAa,mBAAoB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EACjHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE0R,iBAAsBxQ,EAAa6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GAC/I/G,EAAQI,OAAM,EACd,IAmBMwJ,EAnBFtB,EAAMvB,EAAIjE,MAEVwF,GACC/K,EAAKgI,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAqBf,EAAIpD,IACzBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UAC5I4K,OAAQ,mBACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGEpM,EAAKuH,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWC,EAAKqI,iBAAiB,EAAEwH,WAAgB,CAAClI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAACyD,OAAQ,CAAA,CAAI,CAAC,GAGtJ9S,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAE1EU,EAAW8J,CAAG,GAGd9J,EAAQ,IAAI,CAEd,EAAG,SAAA4F,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC9FyC,EAAOzC,CAAG,CACX,CAAC,IAlFChF,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,mCAAoC+Q,EAAW7F,iBAAgB,CAAE,EAC9GzO,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAGC,mBAAmBC,KAAK1U,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAI,iBAAkB,uCAAyCzT,KAAKwC,eAAgB,CAAC+Q,EAAW7F,iBAAgB,EAAIzH,EAAO,EACtPsF,EAAOgI,EAAW7F,iBAAgB,CAAE,G,QAiFtC,CACF,EAEApE,uBAAAjI,UAAAwP,QAAA,SAAQxN,GAAR,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,UAAW1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACxB,EAAQ,CAAC,EACxFpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE2O,QAAQxN,CAAO,EAAEV,KAAK,SAAA8I,GAC5G/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,gBAAiB/B,EAAKO,eAAgBa,EAASyF,CAAG,EAC1EyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAyS,YAAA,SAAYjD,EAA4BxN,GAAxC,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,cAAe1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACgM,EAASxN,EAAQ,CAAC,EACrGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE4R,YAAYjD,EAASxN,CAAO,EAAEV,KAAK,SAAA8I,GACzH/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,qBAAsB/B,EAAKO,eAAgBqO,EAASxN,EAASyF,CAAG,EACxFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAsP,WAAA,SAAWiB,EAAWvO,EAA4BsO,EAAoBxF,EAA2B4H,GAAjG,IAAA9R,EAAAjC,KACC,OADiD,KAAA,IAAA2R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAxF,IAAAA,EAAA,CAAA,GAA2B,KAAA,IAAA4H,IAAAA,EAAA,CAAA,GACzF,IAAI9Q,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACxC,GAAK2P,EAAKjS,OAAV,CAyBA,IApBIqU,EAAoB,GAEpBhU,KAAKkK,aAAe,CAACiC,GACxByF,EAAKqC,QAAQ,SAAAjH,GACZ,IAAMuG,EAAatR,EAAKwI,YAAYyC,WAAU,EAC9BqG,EAAWnG,SAASJ,CAAG,EAQtCgH,EAAkBnR,KAAK,CAAA,CAAI,GAL3BiB,QAAQC,IAAI,IAAIC,KAAQ/B,EAAKO,eAAgB,6BAA8B+Q,EAAW7F,iBAAgB,CAAE,EACxGzO,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAGC,mBAAmBC,KAAK1U,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAI,iBAAkB,iCAAmCxR,EAAKO,eAAgB,CAAC+Q,EAAW7F,iBAAgB,EAAIV,EAAI,EAC7OgH,EAAkBnR,KAAK,CAAA,CAAK,EAK9B,CAAC,EAGEqR,EAAYlU,KAAKkK,YAAc0H,EAAKxO,OAAO,SAACd,EAAG6R,GAAQ,OAAAH,EAAkBG,EAAlB,CAAsB,EAAIvC,EAE5EC,EAAI,EAAGA,EAAIqC,EAAUvU,OAAQkS,CAAC,IAClC7E,EAAMkH,EAAUrC,IAEXjI,MACRoD,EAAIpD,IAAMkE,kBAAiB,GAGxB9N,KAAKgK,aACJwJ,EAAO,IAAIxP,KAEVgJ,EAAIW,YACRX,EAAIW,UAAY6F,GAGZxG,EAAIY,YACRZ,EAAIY,UAAY4F,IAIdxT,KAAKwJ,aAAe,CAACwD,EAAIoH,eAAe,KAAK,IAChDpH,EAAIwB,IAAM,GAGPxO,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK3J,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK3J,GAAU,KAAM,CAAC,EAAI,UAC5G4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAIC6F,EAAUvU,SACT0U,EAAU,KAETN,IACJM,EAAU,IAAI9U,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACqP,EAAW7Q,EAAQ,CAAC,GAGnGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEyO,WAA0CuD,EAAW7Q,CAAO,EAAEV,KAAK,SAAA8I,GACrJ4I,GACHA,EAAQvP,OAAM,EAEX2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQgR,CAAS,GAGjB3I,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACEuL,GACHA,EAAQvP,OAAM,EAEfhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgB0R,EAAW7Q,EAASyF,CAAG,EACzFyC,EAAOzC,CAAG,CACX,CAAC,E,MAvFD5F,EAAQ,EAAE,E,cAyFX,CACF,EAEAoG,uBAAAjI,UAAAwM,UAAA,SAAUb,EAAQ3J,EAA4BsO,EAAoBxF,GAAlE,IAAAlK,EAAAjC,KACC,OAD6C,KAAA,IAAA2R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAxF,IAAAA,EAAA,CAAA,GAC1D,IAAIlJ,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,4DACnC+K,EAAIpD,MACRoD,EAAIpD,IAAMkE,kBAAiB,GAGxB9N,CAAAA,KAAKkK,aAAgBiC,IAClBoH,EAAavT,KAAKyK,YAAYyC,WAAU,EAC9BqG,EAAWnG,SAASJ,CAAG,IAUpChN,KAAKgK,aACJwJ,EAAO,IAAIxP,KAEVgJ,EAAIW,YACRX,EAAIW,UAAY6F,GAGZxG,EAAIY,YACRZ,EAAIY,UAAY4F,IAIdxT,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK3J,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK3J,GAAU,KAAM,CAAC,EAAI,UAC5G4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGErO,KAAKwJ,aAAe,CAACwD,EAAIoH,eAAe,KAAK,IAChDpH,EAAIwB,IAAM,GAGP9J,EAAU,IAAInF,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACmI,EAAK3J,EAAQ,CAAC,EAC/FpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE2L,UAAuCb,EAAK3J,CAAO,EAAEV,KAAK,SAAA8I,GAChJ/G,EAAQI,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQ8J,CAAG,GAGXzB,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBwK,EAAK3J,EAASyF,CAAG,EAClFyC,EAAOzC,CAAG,CACX,CAAC,IApDChF,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,4BAA6B+Q,EAAW7F,iBAAgB,CAAE,EACvGzO,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAGC,mBAAmBC,KAAK1U,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAI,iBAAkB,gCAAkCzT,KAAKwC,eAAgB,CAAC+Q,EAAW7F,iBAAgB,EAAIV,EAAI,EAC5OzB,EAAOgI,EAAW7F,iBAAgB,CAAE,G,QAmDtC,CACF,EAEApE,uBAAAjI,UAAAiT,YAAA,SAAYjR,GACX,IAAIqB,EAAU,IAAInF,kBAAAoF,aAAa,cAAe3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACxB,EAAQ,CAAC,EACxFuI,EAAS3M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEoS,YAAYjR,CAAO,EAMvH,OALAuI,EAAOlD,GAAG,QAAS,SAAAmD,GAElB,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EAEMD,CACR,EAEAtC,uBAAAjI,UAAAkT,OAAA,SAAOC,EAAiBnR,GAAxB,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,SAAU1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAAC2P,EAASnR,EAAQ,CAAC,EAChGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEqS,OAAOC,EAASnR,CAAO,EAAEV,KAAK,SAAA8I,GACpH/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,eAAgB/B,EAAKO,eAAgBgS,EAASnR,EAASyF,CAAG,EAClFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAyQ,WAAA,SAAW1O,EAAgEkK,EAAgBjK,EAA0BsO,EAAoBxF,EAA2Ba,GAApK,IAAA/K,EAAAjC,KACC,OADoH,KAAA,IAAA2R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAxF,IAAAA,EAAA,CAAA,GAA2B,KAAA,IAAAa,IAAAA,EAAA,MAC5J,IAAI/J,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,4FACxC,MAAIjC,CAAAA,KAAKkK,aAAgBiC,IAClBoH,EAAavT,KAAKyK,YAAYyC,WAAU,EAC9BqG,EAAWnG,SAASE,CAAW,IAU5CkG,EAAO,IAAIxP,KAEXhE,KAAKgK,aACRsD,EAAYM,UAAY4F,GAGrBxT,KAAKwJ,YACHwD,EAAD,CAAA,EAAA,GACG,CAAA,EAAMhN,KAAKgF,QAAa5B,EAAQ,KAAM,CAAA,CAAI,GAF9C,CAAA,EAAA,KAbFU,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,6BAA8B+Q,EAAW7F,iBAAgB,CAAE,EACxGzO,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAGC,mBAAmBC,KAAK1U,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAI,iBAAkB,iCAAmCzT,KAAKwC,eAAgB,CAAC+Q,EAAW7F,iBAAgB,EAAIJ,EAAY,EACrP/B,EAAOgI,EAAW7F,iBAAgB,CAAE,EACpC,CAAA,I,OAYAV,EAAMoD,EAAAvO,KAAA,E,wBAGHmL,GACChN,KAAKgK,YAAc,CAACsD,EAAYK,WAAaX,EAAIW,YACpDL,EAAYK,UAAYX,EAAIW,WAGzBX,EAAIwB,MAAQlB,EAAYkB,IAAxB,CAAA,EAAA,IACHlB,EAAYkB,KAAO,GAEfF,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEwH,WAAgB,CAAClI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAACyD,OAAQ,CAAA,CAAI,CAAC,EAEtI,GAAX/E,EAAIwB,KACPvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyF,WAAgB,CAAC1H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC2H,IAAKhF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,EAGjJxO,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGEoG,EAAU,IAAIlV,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EAChHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE4P,WAAgB1O,EAAQkK,EAAajK,CAAO,EAAEV,KAAK,SAAA8I,GACzIgJ,EAAQ3P,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIiJ,aAAa,GAGzBnJ,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACF2L,EAAQ3P,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQkK,EAAajK,EAASyF,CAAG,EACnGyC,EAAOzC,CAAG,CACX,CAAC,E,QA9CC,CAAA,EAAA,G,OAmDY,OAFdhF,QAAQC,IAAI,qBAAuB/D,KAAKwC,eAAgBwK,EAAIwB,IAAKlB,EAAYkB,GAAG,EAElE,CAAA,EAAMvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEtF,QAAQ,CAChG4E,IAAU,CACTA,IAAKoD,EAAIpD,IACT4E,IAAKlB,EAAYkB,G,GAEhB,KAAM,CAAA,CAAI,G,QALTmG,EAAUvE,EAAAvO,KAAA,IAQT+S,EAAQ5H,EAAIpD,IACZiL,EAAa7H,EAAIwB,KACjBsG,GAAgB,EAAA3V,SAAA4V,yBAAwBzH,EAAaN,EAAK2H,CAAO,GAC1D/K,IAAMgL,EACjBE,EAAWtG,IAAMqG,EAAa,EAE1B7U,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAa6G,EACb5G,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,yBAA0BmI,EAAK5J,EAAQ0R,EAAYzR,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,yBAA0BmI,EAAK5J,EAAQ0R,EAAYzR,GAAU,KAAM,CAAC,EAAI,UACxM4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGE2G,EAAU,IAAIzV,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ0R,EAAYzR,EAAQ,CAAC,EAC/GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE4P,WAAgB1O,EAAQ0R,EAAYzR,CAAO,EAAEV,KAAK,SAAA8I,GACxIuJ,EAAQlQ,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIiJ,aAAa,GAGzBnJ,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACFkM,EAAQlQ,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQ0R,EAAYzR,EAASyF,CAAG,EAClGyC,EAAOzC,CAAG,CACX,CAAC,GAGDyC,EAAO,oDAAsDyB,EAAIwB,IAAM,4BAA8BlB,EAAYkB,GAAG,E,oCAI9GnL,GAAWA,EAAQ0O,QACvB/R,KAAKgK,aACRsD,EAAYK,UAAY6F,GAGpBlG,EAAY1D,MAChB0D,EAAY1D,IAAMkE,kBAAiB,GAGpCR,EAAYkB,IAAM,EAEdxO,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaT,EAAY1D,IACzBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,SAAUzB,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,SAAUzB,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UAChK4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGE4G,EAAU,IAAI1V,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EAChHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE4P,WAAgB1O,EAAQkK,EAAajK,CAAO,EAAEV,KAAK,SAAA8I,GACzIwJ,EAAQnQ,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIiJ,aAAa,GAGzBnJ,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACFmM,EAAQnQ,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQkK,EAAajK,EAASyF,CAAG,EACnGyC,EAAOzC,CAAG,CACX,CAAC,GAGDyC,EAAO,aAAa,E,oCAIjBlI,GAAWA,EAAQ0O,SAClB/R,KAAKgK,YAAc,CAACsD,EAAYK,YACnCL,EAAYK,UAAY6F,GAGpBlG,EAAY1D,MAChB0D,EAAY1D,IAAMkE,kBAAiB,GAGpCR,EAAYkB,IAAM,GAGfxO,KAAKiK,YAAc,CAAC0H,GAClBtO,EAIuBA,EAAS6R,eAAiB,SAHrD7R,EAAoC,CAAC6R,eAAgB,QAAQ,EAM1DC,EAAU,IAAI5V,kBAAAoF,aAAa,oBAAqB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EACvHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEoR,kBAAuBlQ,EAAQkK,EAAuCjK,CAAO,EAAEV,KAAK,SAAA8I,GAC1K0J,EAAQrQ,OAAM,EACVkI,EAAMvB,EAAIjE,MAEVwF,EACH/N,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAqBf,EAAIpD,IACzBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGDpP,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAaT,EAAY1D,IACzBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,SAAUzB,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,SAAUzB,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UAChK4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGFpP,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQ,CAAC,CACV,EAAG,SAAA4F,GACFqM,EAAQrQ,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,6BAA8B/B,EAAKO,eAAgBY,EAAQkK,EAAajK,EAASyF,CAAG,EAC5GyC,EAAOzC,CAAG,CACX,CAAC,IAGGsM,EAAU,IAAI7V,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EAChHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE4P,WAAgB1O,EAAQkK,EAAajK,CAAO,EAAEV,KAAK,SAAA8I,GACzI2J,EAAQtQ,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIiJ,aAAa,GAGzBnJ,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACFsM,EAAQtQ,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQkK,EAAajK,EAASyF,CAAG,EACnGyC,EAAOzC,CAAG,CACX,CAAC,G,gCAGH,CACF,EAEAQ,uBAAAjI,UAAAgU,WAAA,SAAWjS,EAAgE6C,EAAqC5C,EAAyBsO,EAAoBxF,EAA2BmJ,GAAxL,IAAArT,EAAAjC,KACC,OADwI,KAAA,IAAA2R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAxF,IAAAA,EAAA,CAAA,GAA2B,KAAA,IAAAmJ,IAAAA,EAAA,CAAA,GAChL,IAAIrS,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,kFACxC,OAAMgE,EAAOyI,MAAwC,OAAhC9J,KAAKC,UAAUoB,EAAOyI,IAAI,GAAiBzI,EAAOwI,MAAwC,OAAhC7J,KAAKC,UAAUoB,EAAOwI,IAAI,GAAiBxI,EAAO4N,cAAwD,OAAxCjP,KAAKC,UAAUoB,EAAO4N,YAAY,GAAiB5N,EAAOsP,QAA4C,OAAlC3Q,KAAKC,UAAUoB,EAAOsP,MAAM,GAK7OvV,KAAKgK,aACJwJ,EAAO,IAAIxP,KAEViC,EAAOwI,KAIXxI,EAAOwI,KAAKb,UAAY4F,EAHxBvN,EAAOwI,KAAY,CAACb,UAAW4F,CAAI,GAOjCxT,CAAAA,KAAKkK,aAAgBiC,IAClBoH,EAAavT,KAAKyK,YAAYyC,WAAU,EAC9BqG,EAAWnG,SAASnH,EAAQ,CAACsH,SAAU,CAAA,CAAI,CAAC,GAUxDvN,KAAKwJ,aAAe,CAAC8L,GAAoBtV,KAAKiK,YAAc,CAAC0H,EACtD,CAAA,EAAM3R,KAAK8C,KAAKM,CAAM,GAD9B,CAAA,EAAA,IAPFU,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,6BAA8B+Q,EAAW7F,iBAAgB,CAAE,EACxGzO,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAGC,mBAAmBC,KAAK1U,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAI,iBAAkB,iCAAmCzT,KAAKwC,eAAgB,CAAC+Q,EAAW7F,iBAAgB,EAAIzH,EAAO,EAChPsF,EAAOgI,EAAW7F,iBAAgB,CAAE,EACpC,CAAA,MAvBDxK,EAAQ,CAAC,EACT,CAAA,I,OA6BA,IAFI0O,EAAOxB,EAAAvO,KAAA,EAEFgQ,EAAI,EAAGA,EAAID,EAAKjS,OAAQkS,CAAC,GAC7B7E,EAAM4E,EAAKC,GAEX7R,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UAC5I4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGErO,KAAKwJ,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEwH,WAAgB,CAAClI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAACyD,OAAQ,CAAA,CAAI,CAAC,EAEtI,GAAX/E,EAAIwB,KACPvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyF,WAAgB,CAAC1H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC2H,IAAKhF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,EAGhJgH,2BAA2BvP,EAAQ,KAAK,IACvCA,EAAOyI,KAGFzI,EAAOyI,KAAKF,MACrBvI,EAAOyI,KAAKF,IAAM,GAHlBvI,EAAOyI,KAAO,CAACF,IAAK,CAAC,I,wBAUtB9J,EAAU,IAAInF,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAC3GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEmT,WAAgBjS,EAAQ6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GACjI/G,EAAQI,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIiJ,aAAa,GAGzBnJ,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EAC9FyC,EAAOzC,CAAG,CACX,CAAC,E,SACD,CACF,EAEAQ,uBAAAjI,UAAAoU,UAAA,SAAUrS,EAAgE6C,EAAqC5C,EAAyBsO,EAAoBxF,GAA5J,IAAAlK,EAAAjC,KACC,OADuI,KAAA,IAAA2R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAxF,IAAAA,EAAA,CAAA,GACpJ,IAAIlJ,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,kFACxC,MAAIjC,CAAAA,KAAKkK,aAAgBiC,IAClBoH,EAAavT,KAAKyK,YAAYyC,WAAU,EAC9BqG,EAAWnG,SAASnH,EAAQ,CAACsH,SAAU,CAAA,CAAI,CAAC,GAUvDtH,EAAOyI,MAAwC,OAAhC9J,KAAKC,UAAUoB,EAAOyI,IAAI,GAAiBzI,EAAOwI,MAAwC,OAAhC7J,KAAKC,UAAUoB,EAAOwI,IAAI,GAAiBxI,EAAO4N,cAAwD,OAAxCjP,KAAKC,UAAUoB,EAAO4N,YAAY,GAAiB5N,EAAOsP,QAA4C,OAAlC3Q,KAAKC,UAAUoB,EAAOsP,MAAM,GAK7O/B,EAAO,IAAIxP,KAEXhE,KAAKgK,aACH/D,EAAOwI,KAIXxI,EAAOwI,KAAKb,UAAY4F,EAHxBvN,EAAOwI,KAAY,CAACb,UAAW4F,CAAI,GAOjCxT,KAAKwJ,YACE,CAAA,EAAMxJ,KAAKgF,QAAQ5B,EAAQ,KAAM,CAAA,CAAI,GAD5C,CAAA,EAAA,KAfHF,EAAQ,CAAC,EACT,CAAA,KATCY,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,4BAA6B+Q,EAAW7F,iBAAgB,CAAE,EACvGzO,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAGC,mBAAmBC,KAAK1U,QAAAsC,gBAAgBoC,cAAa,EAAG8P,iBAAgB,EAAI,iBAAkB,gCAAkCzT,KAAKwC,eAAgB,CAAC+Q,EAAW7F,iBAAgB,EAAIzH,EAAO,EAC/OsF,EAAOgI,EAAW7F,iBAAgB,CAAE,EACpC,CAAA,I,cAqBGV,EAAMoD,EAAAvO,KAAA,IAGL7B,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UAC5I4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,GAGEC,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEwH,WAAgB,CAAClI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAACyD,OAAQ,CAAA,CAAI,CAAC,EAEtI,GAAX/E,EAAIwB,KACPvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyF,WAAgB,CAAC1H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC2H,IAAKhF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,EAGhJgH,2BAA2BvP,EAAQ,KAAK,IACvCA,EAAOyI,KAGFzI,EAAOyI,KAAKF,MACrBvI,EAAOyI,KAAKF,IAAM,GAHlBvI,EAAOyI,KAAO,CAACF,IAAK,CAAC,GAOnBkH,EAAU,IAAInW,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAC1GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEuT,UAAerS,EAAQ6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GAChIiK,EAAQ5Q,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIiJ,aAAa,GAGzBnJ,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACF4M,EAAQ5Q,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EAC7FyC,EAAOzC,CAAG,CACX,CAAC,GAEOzF,GAAWA,EAAQ0O,QACtB9L,EAAO4N,cAgBN5N,EAAO4N,aAAajK,MACxB3D,EAAO4N,aAAajK,IAAMkE,kBAAiB,GAGxC9N,KAAKgK,YAAc,CAAC/D,EAAO4N,aAAalG,YAC3C1H,EAAO4N,aAAalG,UAAY,IAAI3J,OApBjChE,KAAKgK,WACR/D,EAAO4N,aAAoB,CAC1BjK,IAAKkE,kBAAiB,EACtBU,IAAK,EACLb,UAAW,IAAI3J,I,EAIhBiC,EAAO4N,aAAoB,CAC1BjK,IAAKkE,kBAAiB,EACtBU,IAAK,C,EAcJxO,KAAKiK,YAAc,CAAC0H,GACvB1S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAa9H,EAAO4N,aAAajK,IACjCoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,SAAUzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,SAAUzB,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAGEsH,EAAU,IAAIpW,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAC1GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEuT,UAAerS,EAAQ6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GAChIkK,EAAQ7Q,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIiJ,aAAa,GAGzBnJ,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACF6M,EAAQ7Q,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EAC7FyC,EAAOzC,CAAG,CACX,CAAC,GAGDyC,EAAO,aAAa,E,aAIjBlI,GAAWA,EAAQ0O,SACjB9L,EAAO4N,cAcN5N,EAAO4N,aAAajK,MACxB3D,EAAO4N,aAAajK,IAAMkE,kBAAiB,GAGxC9N,KAAKgK,YAAc,CAAC/D,EAAO4N,aAAalG,YAC3C1H,EAAO4N,aAAalG,UAAY,IAAI3J,OAlBjChE,KAAKgK,WACR/D,EAAO4N,aAAoB,CAC1BjK,IAAKkE,kBAAiB,EACtBH,UAAW,IAAI3J,I,EAIhBiC,EAAO4N,aAAoB,CAC1BjK,IAAKkE,kBAAiB,C,GAetB9N,KAAKiK,YAAc,CAAC0H,GAClBtO,EAIsBA,EAAS6R,eAAiB,SAHpD7R,EAAmC,CAAC6R,eAAgB,QAAQ,EAMzDU,EAAU,IAAIrW,kBAAAoF,aAAa,mBAAoB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EACjHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE0R,iBAAsBxQ,EAAQ6C,EAAiC5C,CAAO,EAAEV,KAAK,SAAA8I,GAChKmK,EAAQ9Q,OAAM,EACd,IAAIkI,EAAMvB,EAAIjE,MAEVwF,GACH/N,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAkBf,EAAIpD,IACtBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UAC5I4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAEDnL,EAAQuI,EAAIyE,EAAE,GAENjK,EAAO4N,cACf5U,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAa9H,EAAO4N,aAAajK,IACjCoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,SAAUzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,SAAUzB,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,E,CACP,EAEDpP,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAE1EU,EAAQuI,EAAIyE,EAAE,GAGdhN,EAAQ,CAAC,CAEX,EAAG,SAAA4F,GACF8M,EAAQ9Q,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EACtGyC,EAAOzC,CAAG,CACX,CAAC,IAGG+M,EAAU,IAAItW,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAC1GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEuT,UAAerS,EAAQ6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GAChIoK,EAAQ/Q,OAAM,EACV2G,EAAIwG,cACPhT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIiJ,aAAa,GAGzBnJ,EAAOE,EAAIwG,YAAY,CAEzB,EAAG,SAAAnJ,GACF+M,EAAQ/Q,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EAC7FyC,EAAOzC,CAAG,CACX,CAAC,G,gCAGH,CACF,EAEAQ,uBAAAjI,UAAAyU,gBAAA,SAAgB3Q,EAAe9B,GAE9B,OAFe,KAAA,IAAA8B,IAAAA,EAAA,IACFlG,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEiG,MAAMhD,EAAU9B,CAAO,CAE5H,G,0BAt0De2N,WAAanR,QAAA+K,QAAMmL,MAAM,SAAOC,EAAMC,GAAQ,OAAArN,UAAA,KAAA,EAAA,KAAA,EAAA,KAAA,EAAA,W,8EAI5D,GAHQqI,EAAuC+E,EAAI/E,OAAnCjP,EAA+BgU,EAAIhU,WAAvBkP,EAAmB8E,EAAI9E,MAAhB7N,EAAY2S,EAAI3S,QAG/C,EAFE6S,EAAejX,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWA,EAAWQ,eAAgBR,EAAWE,iBAAiB,GAGlH,MAAA,CAAA,EAAO+T,EAAS,IAAIzI,MAAM,cAAAC,OAAczL,EAAWQ,eAAc,YAAA,CAAY,CAAC,GAG3EkC,EAAU,IAAInF,kBAAAoF,aAAasM,EAAQjP,EAAWQ,eAAgBoC,KAAKC,UAAU,CAACqM,EAAO7N,EAAQ,CAAC,E,iBAIlF,O,uBAAA,CAAA,EAAM6S,EAAajF,GAAOkF,MAApBD,EAAY9Q,cAAAA,cAAA,GAAAC,OAAY6L,CAAK,EAAA,CAAA,CAAA,EAAA,CAAE7N,GAAO,CAAA,CAAA,CAAA,G,cAArDI,EAAS2M,EAAAvO,KAAA,EACf6C,EAAQI,OAAM,EACdmR,EAAS,KAAMxS,CAAM,E,iBAGJ,M,YAAT2S,MAAeC,CAAAA,EAAIC,QAAQ5P,SAAS,sBAAsB,EAA9D,MAAA,CAAA,EAAA,G,8CAEI6P,EAAoBvU,EAAWkJ,0BAA0BmL,EAAIC,OAAO,GAEzE,CAAA,EAAMJ,EAAaxD,UAAU6D,CAAiB,GAD3C,CAAA,EAAA,G,OAEY,OADfnG,EAAAvO,KAAA,EACe,CAAA,EAAMqU,EAAajF,GAAOkF,MAApBD,EAAY9Q,cAAAA,cAAA,GAAAC,OAAY6L,CAAK,EAAA,CAAA,CAAA,EAAA,CAAE7N,GAAO,CAAA,CAAA,CAAA,G,OAG3D,OAHMI,EAAS2M,EAAAvO,KAAA,EACf6C,EAAQI,OAAM,EACdmR,EAAS,KAAMxS,CAAM,EACrB,CAAA,G,4CAGDwS,EAASO,CAAU,E,oBAGrB9R,EAAQI,OAAM,EACdmR,EAASI,CAAG,E,+BAEX,CAAC,EAqyDL/M,sB,EAAC,GAEDD,2BAAA,SAAAoN,GAAA,SAAApN,6B,8CAyKA,CAAA,OAzK8EqN,UAAArN,2BAAAoN,CAAA,EAC7EpN,2BAAAhI,UAAAsV,aAAA,SAAaxI,EAAiByI,GAA9B,IAAA3U,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,+EAClC4U,EAAmBC,KAAKC,IAAI,IAAKD,KAAK/S,IAAIoK,EAAK6I,SAAW,CAAC,CAAC,EAC5DC,EAAqBJ,EAAmB,IAASA,EAAmB,IAEtE1I,EAAK+I,MACJlT,KAAKmT,IAAG,EAAKhJ,EAAK+I,KAAKE,QAAO,EAAKH,GACtC9I,EAAK+I,KAAO,IAAIlT,KAChB,CAAA,EAAM9E,kBAAAmY,MAAM5B,UAAU,CAAC7L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAACyI,KAAM/I,EAAK+I,IAAI,CAAC,CAAC,IAF7D,CAAA,EAAA,GADD,CAAA,EAAA,G,OASF,OANA9G,EAAAvO,KAAA,EACAqB,EAAQ,CACPsD,KAAM,KACNF,MAAO,kB,CACP,EAED,CAAA,G,0BAID6H,EAAK+I,KAAO,IAAIlT,K,wBAGI,GAAjBmK,EAAK6I,SACR9T,EAAQ,CACPsD,KAAM,KACNF,MAAO,mB,CACP,EAKG6H,EAAKmJ,KASVC,OAAOX,EAAUzI,EAAKmJ,KAAM,CAC3BE,WAAY,KACZC,OAAQ,IACRC,gBAAiB,Q,EACf,SAAO5O,EAAK6O,GAAU,OAAA/O,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACxB,OAAI6G,EACH,CAAA,EAAOyC,EAAOzC,CAAG,GAGdxJ,KAAKqY,EAAYC,OAAOnS,KAAK0I,EAAK0J,KAAM,KAAK,CAAC,GACjD1J,EAAK+I,KAAO,IAAIlT,KAChBmK,EAAK6I,SAAW,EAChB,CAAA,EAAM9X,kBAAAmY,MAAM5B,UAAU,CAAC7L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAACyI,KAAM/I,EAAK+I,KAAMF,SAAU7I,EAAK6I,QAAQ,CAAC,CAAC,IAHtF,CAAA,EAAA,G,cAGH5G,EAAAvO,KAAA,EAEAqB,EAAQ,CACPsD,KAAM2H,EACN7H,MAAO,E,CACP,E,aAKD,OAFA6H,EAAK+I,KAAO,IAAIlT,KAChBmK,EAAK6I,SAAW7I,EAAK6I,SAAW,EAChC,CAAA,EAAM9X,kBAAAmY,MAAM5B,UAAU,CAAC7L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAACyI,KAAM/I,EAAK+I,KAAMF,SAAU7I,EAAK6I,QAAQ,CAAC,CAAC,G,OAAzF5G,EAAAvO,KAAA,EAEqB,GAAjBsM,EAAK6I,SACR9T,EAAQ,CACPsD,KAAM,KACNF,MAAO,mB,CACP,EAGDpD,EAAQ,CACPsD,KAAM,KACNF,MAAO,+B,CACP,E,gCAGH,EA7CApD,EAAQ,CACPsD,KAAM,KACNF,MAAO,sB,CACP,E,SA2CF,CACF,EAEA+C,2BAAAhI,UAAAyW,cAAA,WACC,OAAO,SAAC3J,EAAM4J,GACbA,EAAG,KAAM5J,EAAK6J,QAAQ,CACvB,CACD,EAEA3O,2BAAAhI,UAAA4W,gBAAA,WACC,OAAO,SAACD,EAAUD,GACjB7Y,kBAAAmY,MAAMrS,QAAQ,CAACgT,SAAUA,CAAQ,CAAC,EAAErV,KAAK,SAAA8I,GACxCsM,EAAG,KAAMtM,CAAG,CACb,EAAG,SAAA3C,GACFiP,EAAGjP,EAAK,IAAI,CACb,CAAC,CACF,CACD,EAEAO,2BAAAhI,UAAA6W,YAAA,SAAY/J,EAAiByI,GAA7B,IAAA3U,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,0EACnCkM,EAAD,CAAA,EAAA,IACH5C,EAAO,SAAS,E,qBAEPqL,EAAD,CAAA,EAAA,IACRrL,EAAO,aAAa,E,cAGH,MAAA,CAAA,EAAM4M,YAAY,EAAE,G,OAEvB,OAFVC,EAAahI,EAAAvO,KAAA,EACbyV,EAAOc,EAAWC,SAAS,KAAK,EACtB,CAAA,EAAMC,kBAAkB1B,EAAUU,EAAM,CACrDE,WAAY,KACZC,OAAQ,IACRC,gBAAiB,Q,CACjB,G,OAJGa,EAAUnI,EAAAvO,KAAA,EAKVgW,EAAOD,OAAOnS,KAAK8S,EAAS,QAAQ,EAAEF,SAAS,KAAK,EACxDnZ,kBAAAmY,MAAM5B,UAAU,CAAC7L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAACoJ,KAAMA,EAAMP,KAAMA,EAAMkB,SAAU,GAAIxB,SAAU,CAAC,CAAC,CAAC,EAAErU,KAAK,SAAA8I,GAAO,OAAAvI,EAAQuI,CAAG,CAAX,EAAc,SAAAgN,GAAO,OAAAlN,EAAOkN,CAAG,CAAV,CAAW,E,gCAE3I,CACF,EAEApP,2BAAAhI,UAAAqX,eAAA,SAAevK,EAAMwK,EAAaC,GAAlC,IAAA3W,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,wEACnCkM,EAAD,CAAA,EAAA,IACH5C,EAAO,cAAc,E,qBAEZoN,GAAgBC,EAAjB,CAAA,EAAA,IACRrN,EAAO,kBAAkB,E,cAGV,MAAA,CAAA,EAAMvL,KAAK2W,aAAaxI,EAAMwK,CAAW,G,QAApDE,EAAWzI,EAAAvO,KAAA,GAEK,KAInB7B,KAAKkY,YAAY/J,EAAMyK,CAAW,EAAEjW,KAAK,SAAA8I,GAAO,OAAAvI,EAAQuI,CAAG,CAAX,EAAc,SAAAgN,GAAO,OAAAlN,EAAOkN,CAAG,CAAV,CAAW,EAHhFlN,EAAOsN,EAAgB,KAAC,E,gCAM1B,CACF,EAEAxP,2BAAAhI,UAAAyX,SAAA,SAAS3K,EAAMyI,GAAf,IAAA3U,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,kEACnCkM,EAAK6J,SAAN,CAAA,EAAA,IACHzM,EAAO,kBAAkB,E,cAGZ,MAAA,CAAA,EAAMrM,kBAAAmY,MAAMrS,QAAQ,CAACgT,SAAU7J,EAAK6J,QAAQ,CAAC,G,cAA7C5H,EAAAvO,KAAA,GAGZ0J,EAAO,iBAAiB,E,OADrB,CAAA,EAAA,G,OAIM,MAAA,CAAA,EAAMrM,kBAAAmY,MAAMrS,QAAQ,CAAC+T,MAAO5K,EAAK4K,KAAK,CAAC,G,OAAvC3I,EAAAvO,KAAA,EAGR0J,EAAO,cAAc,GAGrB4C,EAAK+J,YAAYtB,CAAQ,EACzB1T,EAAQiL,CAAI,G,gCAIf,CACF,EAEA9E,2BAAAhI,UAAA2X,cAAA,SAAc7K,GACb,OAAOjP,kBAAAmY,MAAM5B,UAAU,CAAC7L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAACuI,SAAU,CAAC,CAAC,CAAC,CAC9D,EACD3N,0BAAA,EArhEaJ,QAAAK,uBAAAA,sBA42DuF,EA2KpG,SAAgBwE,oBAEf,OADe,IAAI9O,UAAAia,UACHC,YAAW,CAC5B,CAEA,SAAS3B,OAAOX,EAAUU,EAAMjU,EAAS4S,GACxC5W,OAAOkY,OAAOX,EAAUU,EAAMjU,EAAQmU,WAAYnU,EAAQoU,OAAQpU,EAAQqU,gBAAiBzB,CAAQ,CACpG,CAEA,SAASqC,kBAAkB1B,EAAUU,EAAMjU,GAC1C,OAAO,IAAIJ,QAAQ,SAACC,EAASqI,GAAW,OAAAgM,OAAOX,EAAUU,EAAMjU,EAAS,SAACyF,EAAKyP,GAAY,OAACzP,EAAMyC,EAAOzC,CAAG,EAAI5F,EAAQqV,CAAO,CAApC,CAAsC,CAAxF,CAAyF,CAClI,CAEA,SAASJ,YAAYgB,GACpB,OAAO,IAAIlW,QAAQ,SAACC,EAASqI,GAAW,OAAAlM,OAAO8Y,YAAYgB,EAAS,SAACrQ,EAAKsP,GAAe,OAACtP,EAAMyC,EAAOzC,CAAG,EAAI5F,EAAQkV,CAAU,CAAvC,CAAyC,CAA1F,CAA2F,CACpI,CAEA,SAAS5C,2BAA2B4D,EAAaC,GAChD,IAAIpS,EAAO8F,OAAO9F,KAAKmS,CAAG,EAE1B,GAAInS,EAAK5E,KAAK,SAAAC,GAAK,OAAAA,IAAM+W,CAAN,CAAU,EAC5B,MAAO,CAAA,EAGR,IAAK,IAAIxH,EAAI,EAAGA,EAAI5K,EAAKtH,OAAQkS,CAAC,GAAI,CACrC,IAAItK,EAAMN,EAAK4K,GACf,GAAIuH,EAAI7R,IAA4B,UAApB,OAAO6R,EAAI7R,IAAqBiO,2BAA2B4D,EAAI7R,GAAM8R,CAAI,EACxF,MAAO,CAAA,C,CAIT,MAAO,CAAA,CACR,CA3MapQ,QAAAI,2BAAAA,2BA2KbJ,QAAA6E,kBAAAA","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions, ChangeStreamDocument } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n\t$gt?: P;\n\t$gte?: P;\n\t$in?: P extends Array<any> ? P : P[];\n\t$lt?: P;\n\t$lte?: P;\n\t$ne?: P;\n\t$nin?: P extends Array<any> ? P : P[];\n\t$not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n\t$exists?: boolean;\n\t$expr?: any[]\n\t$regex?: P extends string ? RegExpConstructor | string : never;\n\t$options?: P extends string ? string : never;\n\t$geoIntersects?: {\n\t\t$geometry: Document;\n\t};\n\t$geoWithin?: Document;\n\t$near?: Document;\n\t$nearSphere?: Document;\n\t$maxDistance?: number;\n\t$all?: any[];\n\t$elemMatch?: Document;\n\t$size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n\t$and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$text?: {\n\t\t$search: string;\n\t\t$language?: string;\n\t\t$caseSensitive?: boolean;\n\t\t$diacriticSensitive?: boolean;\n\t};\n\t$where?: string | ((this: T) => boolean);\n\t$comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n\t$inc?: MongoManagerIncFilter<T> | Document;\n\t$set?: MongoManagerFilter<T> | Document;\n\t$setOnInsert?: MongoManagerFilter<T> | Document;\n\t$unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap: { collections: string[], key: string }[] = [];\n\tprivate _operationInProgress: Map<string, { promise: Promise<any>, invalidatedDuringExecution: boolean, collections: string[] }> = new Map();\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\t\tthis.setCacheLimit();\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tthis._heapLimit = this._isWorkerInstance ? this._heapSize * 0.8 : this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Cache', collectionName);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Already running', collectionName);\n\t\t\t}\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Find - Running', collectionName);\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Done', collectionName);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFind<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// FindOne Operation\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Cache', collectionName);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Already running', collectionName);\n\t\t\t}\n\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo FindOne - Running', collectionName);\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Done', collectionName);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFindOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.findOne(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Aggregate Operation\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\tconst collections = [collectionName, ...pipeline.flatMap(stage => stage.$lookup?.from ? [stage.$lookup.from] : [])];\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Cache', collections);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Already running', collections);\n\t\t\t}\n\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Agg - Running', collections);\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: collections\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Done', collections);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeAggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions: AggregateOptions | undefined,\n\t\tcacheKey: string,\n\t\tcollections: string[]\n\t): Promise<any[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\tmonitor.finish();\n\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\tpublic async countDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions\n\t): Promise<number> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeCountDocuments<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeCountDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: CountDocumentsOptions,\n\t\tcacheKey: string\n\t): Promise<number> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.countDocuments(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Cache and Invalidation Setup\n\tprivate generateCacheKey(collections: string[], functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collections, functionName, args });\n\t\treturn crypto.createHash('sha256').update(keyString).digest('hex');\n\t}\n\n\tprivate getFromCache(cacheKey: string): any | undefined {\n\t\ttry {\n\t\t\tconst cachedData = this._nodeCache.get(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\treturn JSON.parse(cachedData, dateReviver);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: string[], cacheKey: string, data: any) {\n\t\tif (getBinarySize(JSON.stringify(data)) < 1000000 && \n\t\t\t!collections.includes('logs') &&\n\t\t\t!collections.includes('log-method-latencies') &&\n\t\t\t!collections.includes('log-subscriptions') &&\n\t\t\t!collections.find(a => a.endsWith('.versions')) &&\n\t\t\t!collections.find(a => a.startsWith('monitor-'))\n\t\t) {\n\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\tlet deleteCount = 0;\n\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t}\n\t\t\t\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t\tthis._cacheMap.push({ collections, key: cacheKey });\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst collectionCacheMap = this._cacheMap.filter(a => a.collections.includes(collection));\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Invalidate Cache', collection);\n\t\t}\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t\t\n\t\t\tif (this._operationInProgress.has(cacheMap.key)) {\n\t\t\t\tthis._operationInProgress.get(cacheMap.key).invalidatedDuringExecution = true;\n\n\t\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Mongo Invalidated During Execution', cacheMap.collections);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [key, operation] of this._operationInProgress.entries()) {\n\t\t\tif (operation.collections.includes(collection)) {\n\t\t\t\toperation.invalidatedDuringExecution = true;\n\t\t\n\t\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Mongo Invalidated During Execution (No cache)', operation.collections);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMainDB();\n\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$and: [\n\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst changeStream = db.watch(pipeline, { fullDocument: 'updateLookup' });\n\n\t\tchangeStream.on('change', async (change: any) => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\t\t\t\tconst collection = this.collection(collectionName);\n\n\t\t\t\tif (collection) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\n\t\t\t\t\t// if ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && process.env.WORKER_INDEX === '0') {\n\t\t\t\t\t// \tconst { operationType, fullDocument, documentKey, updateDescription } = change;\n\t\t\t\t\t// \tconst docId = documentKey._id;\n\n\t\t\t\t\t// \tlet oldDocument = null;\n\n\t\t\t\t\t// \t// For updates and deletes, you might need to fetch the old document if not provided\n\t\t\t\t\t// \tif (operationType === 'update' || operationType === 'replace' || operationType === 'delete') {\n\t\t\t\t\t// \t\t// Assuming the old document can be obtained via changeStream\n\t\t\t\t\t// \t\toldDocument = change.fullDocumentBeforeChange || await collection.findOne({ _id: docId });\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \t// Handle Versioning\n\t\t\t\t\t// \tif (collection.useVersions && oldDocument) {\n\t\t\t\t\t// \t\tawait db.collection('yourCollection_versions').insertOne({\n\t\t\t\t\t// \t\t\t...oldDocument,\n\t\t\t\t\t// \t\t\t_id: { _id: oldDocument._id, __v: oldDocument.__v },\n\t\t\t\t\t// \t\t});\n\n\t\t\t\t\t// \t\t// Optionally, delete old versions (keep only the latest N versions)\n\t\t\t\t\t// \t\tconst versionsToKeep = 5;\n\t\t\t\t\t// \t\tawait db.collection('yourCollection_versions').deleteMany({\n\t\t\t\t\t// \t\t\t'_id._id': oldDocument._id,\n\t\t\t\t\t// \t\t\t'_id.__v': { $lt: oldDocument.__v - versionsToKeep + 1 },\n\t\t\t\t\t// \t\t});\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \t// Handle Logging\n\t\t\t\t\t// \tif (this.createLogs) {\n\t\t\t\t\t// \tawait db.collection('logs').insertOne({\n\t\t\t\t\t// \t\t_id: objectIdHexString(),\n\t\t\t\t\t// \t\ttype: 'document',\n\t\t\t\t\t// \t\tcollection: 'yourCollection',\n\t\t\t\t\t// \t\tid_document: docId,\n\t\t\t\t\t// \t\toldDocument,\n\t\t\t\t\t// \t\tnewDocument: fullDocument,\n\t\t\t\t\t// \t\tmethod: operationType,\n\t\t\t\t\t// \t\tcreatedAt: new Date(),\n\t\t\t\t\t// \t\t// Include any additional information like user, messageId, route, etc.\n\t\t\t\t\t// \t});\n\n\t\t\t\t\t// \tchangeStream.on('error', (error) => {\n\t\t\t\t\t// \t\tconsole.error('Error in Change Stream:', error);\n\t\t\t\t\t// \t\t// Handle error, possibly restarting the stream\n\t\t\t\t\t// \t});\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n\t\tconst { action, collection, specs, options } = task;\n\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n\t\n\t\tif (!dbCollection) {\n\t\t\treturn callback(new Error(`Collection ${collection.collectionName} not found`));\n\t\t}\n\t\n\t\tlet monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\t\n\t\ttry {\n\t\t\t// Try creating the index, will auto-skip if already checked in createIndex/createIndexes\n\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\tmonitor.finish();\n\t\t\tcallback(null, result);\n\t\t} catch (err) {\n\t\t\t// Handle any specific errors related to index creation\n\t\t\tif (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingIndexName = collection.extractIndexNameFromError(err.message);\n\t\t\t\t\tif (existingIndexName) {\n\t\t\t\t\t\tawait dbCollection.dropIndex(existingIndexName);\n\t\t\t\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (innerError) {\n\t\t\t\t\tcallback(innerError);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonitor.finish();\n\t\t\tcallback(err);\n\t\t}\n\t}, 1);\n\n\t// Method to extract index name from error message\n\textractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\n\t\tbypassCheckSchema = false\n\t): Promise<BulkWriteResult> {\n\t\tif (!operations.length) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tconst BATCH_SIZE = 1000;\n\t\tlet opIndex = 0;\n\t\n\t\twhile (opIndex < operations.length) {\n\t\t\tconst batchOps = operations.slice(opIndex, opIndex + BATCH_SIZE);\n\t\n\t\t\t// Initialize arrays for logs and version operations\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = [];\n\t\n\t\t\tfor (const op of batchOps) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tconst doc = op[opType];\n\t\n\t\t\t\t// Skip validation if bypassCheckSchema is true\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validationContext = this.simplschema.newContext();\n\t\t\t\t\tlet isValid: boolean;\n\t\n\t\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t\tisValid = validationContext.validate(doc.document);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t\tisValid = validationContext.validate(doc.replacement);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t\t// For updates, validate the update modifier\n\t\t\t\t\t\tisValid = validationContext.validate(doc.update, { modifier: true });\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t\t// No validation needed for deletes\n\t\t\t\t\t\tisValid = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for ${opType}: ${JSON.stringify(validationContext.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Now proceed to process the operations\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// If this.timestamps is true, set createdAt and updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.document.createdAt = new Date();\n\t\t\t\t\t\tdoc.document.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id || objectIdHexString(),\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.document)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.document, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare version document\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tconst versionDoc = {\n\t\t\t\t\t\t\t...doc.document,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t_id: { _id: doc.document._id || objectIdHexString(), __v: 0 },\n\t\t\t\t\t\t};\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: versionDoc,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Since we might have modified doc.document, update the operation\n\t\t\t\t\top[opType].document = doc.document;\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t// If this.timestamps is true, add updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (!doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If this.useVersions is true, increment __v\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\tdoc.update.$inc = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.update)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.update, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// No need to modify the operation further\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t// If this.timestamps is true, set updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If this.useVersions is true, increment __v\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tdoc.replacement.__v = (doc.replacement.__v || 0) + 1;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.replacement)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.replacement, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Since we might have modified doc.replacement, update the operation\n\t\t\t\t\top[opType].replacement = doc.replacement;\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.filter)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.filter, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// No need to modify the operation\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Execute bulkWrite\n\t\t\tconst monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([batchOps, options]));\n\t\t\tawait ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(batchOps, options);\n\t\t\tmonitor.finish();\n\t\n\t\t\t// Insert logs in bulk\n\t\t\tif (this.createLogs && logs.length > 0) {\n\t\t\t\tawait ResolveIOServer.getMainDB().collection('logs').bulkWrite(logs);\n\t\t\t}\n\t\n\t\t\t// Handle versioning\n\t\t\tif (this.useVersions && versionOps.length > 0) {\n\t\t\t\t// Fetch the affected documents\n\t\t\t\tconst versionFilters = versionOps.map((v) => v.filter);\n\t\t\t\tconst affectedDocs = await ResolveIOServer.getMainDB().collection(this.collectionName).find({ $or: versionFilters }).toArray();\n\t\n\t\t\t\t// Prepare version documents\n\t\t\t\tconst versionInserts = affectedDocs.map((doc) => ({\n\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t...doc,\n\t\t\t\t\t\t\t_id: { _id: doc._id, __v: doc.__v },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}));\n\t\n\t\t\t\t// Insert versions in bulk\n\t\t\t\tif (versionInserts.length > 0) {\n\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(<any>versionInserts);\n\t\t\t\t}\n\t\n\t\t\t\t// Delete old versions beyond the latest 5\n\t\t\t\ttry {\n\t\t\t\t\tconst affectedDocIds = affectedDocs.map((doc) => doc._id);\n\t\n\t\t\t\t\tconst pipeline = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: { '_id._id': { $in: affectedDocIds } },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$sort: { '_id._id': 1, '_id.__v': -1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t_id: '$_id._id',\n\t\t\t\t\t\t\t\tversions: { $push: '$_id' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$project: {\n\t\t\t\t\t\t\t\tversionsToDelete: { $slice: ['$versions', 5, { $size: '$versions' }] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $unwind: '$versionsToDelete' },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$replaceRoot: { newRoot: { _id: '$versionsToDelete' } },\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\n\t\t\t\t\tconst oldVersions = await ResolveIOServer.getMainDB().collection(this.versionCollection).aggregate(pipeline).toArray();\n\t\n\t\t\t\t\tif (oldVersions.length > 0) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).deleteMany({ _id: { $in: oldVersions.map((v) => v._id) } });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (error) {\n\t\t\t\t\tconsole.error('Error during version cleanup:', error);\n\t\t\t\t\t// Handle the error as needed\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\topIndex += BATCH_SIZE;\n\t\n\t\t\t// Yield to the event loop\n\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\n\t\t\t// Invalidate cache\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t}\n\t\n\t\treturn { ok: 1 } as BulkWriteResult; // Adjust return value as per your requirements\n\t}\n\n\tcountDocuments(\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions,\n\t\tskipCache = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if the filter is empty\n\t\t\t\tconst isUnfiltered = Object.keys(filter).length === 0;\n\t\n\t\t\t\tif (isUnfiltered) {\n\t\t\t\t\t// Use collection stats for an unfiltered count\n\t\t\t\t\tconst res = await ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).estimatedDocumentCount(options);\n\t\t\t\t\tresolve(res);\n\t\t\t\t}\n\t\t\t\telse if (!skipCache) {\n\t\t\t\t\t// Use cached count if skipCache is false\n\t\t\t\t\tResolveIOServer.getMongoManager().countDocuments(this.collectionName, filter, options).then(\n\t\t\t\t\t\tres => resolve(res),\n\t\t\t\t\t\terr => reject(err)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Fallback to direct countDocuments call with monitoring if skipCache is true\n\t\t\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(\n\t\t\t\t\t\tres => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if index already exists based on the key\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Check if an index with the same key already exists\n\t\t\t\tconst indexExists = existingIndexes.some(index => \n\t\t\t\t\tJSON.stringify(index.key) === JSON.stringify(fieldOrSpec)\n\t\t\t\t);\n\t\n\t\t\t\tif (indexExists) {\n\t\t\t\t\treturn resolve('Index already exists'); // Skip creation if index exists\n\t\t\t\t}\n\t\n\t\t\t\t// If index doesn't exist, push it to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndex',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Filter out indexes that already exist based on the key\n\t\t\t\tconst indexesToCreate = indexSpecs.filter(indexSpec => \n\t\t\t\t\t!existingIndexes.some(existingIndex => \n\t\t\t\t\t\tJSON.stringify(existingIndex.key) === JSON.stringify(indexSpec.key)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\n\t\t\t\t// If no new indexes to create, resolve early\n\t\t\t\tif (indexesToCreate.length === 0) {\n\t\t\t\t\treturn resolve(['All indexes already exist']);\n\t\t\t\t}\n\t\n\t\t\t\t// Push only new indexes to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndexes',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [indexesToCreate],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal.value;\n \n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res.value;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res.value;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res.value;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","MongoManager","serverConfig","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","initServerCollections","setupChangeStream","prototype","_heapLimit","ResolveIOServer","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","_this","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","Promise","resolve","setTimeout","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","finish","addToCache","findOne","executeFindOne","aggregate","pipeline","__spreadArray","__read","flatMap","stage","$lookup","from","executeAggregate","countDocuments","executeCountDocuments","functionName","args","keyString","createHash","update","digest","cachedData","parse","dateReviver","error","del","data","getBinarySize","includes","endsWith","startsWith","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","invalidateQueryCache","collectionCacheMap","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","_c","entries","_d","_e","changeStream","watch","$match","$and","ns.coll","$nin","$not","fullDocument","on","change","__awaiter","coll","err","close","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","setInterval","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassCheckSchema","BATCH_SIZE","opIndex","batchOps","slice","logs","versionOps","e_4","batchOps_1","batchOps_1_1","op","opType","Object","doc","validationContext","newContext","isValid","validate","document","replacement","modifier","Error","concat","validationErrors","createdAt","updatedAt","insertOne","objectIdHexString","id_document","payload","method","id_user","user","messageId","route","versionDoc","__assign","__v","$set","$inc","affectedDocs","versionFilters","map","v","$or","versionInserts","ordered","affectedDocIds","$in","$sort","$group","versions","$push","$project","versionsToDelete","$slice","$size","$unwind","$replaceRoot","newRoot","oldVersions","deleteMany","error_1","setImmediate","ok","estimatedDocumentCount","_b","monitor_2","err_1","create","f_docs","Array","isArray","insertMany","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_2","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_3","bypassLogs","docs","i","replaceOne","upsert","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","validation","date","getMethodManager","callMethodInternal","call","findOneAndUpdate","$setOnInsert","indexExists","bypassMonitor","validationResults","forEach","validDocs","idx","hasOwnProperty","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","bypassVersions","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","monitor_16","watchCollection","queue","task","callback","dbCollection","apply","code","err_4","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"2gGAAAA,gB,yMAAAC,QAAA,cAAA,GACAC,UAAAD,QAAA,SAAA,EAEAE,QAAAF,QAAA,UAAA,EACAG,kBAAAH,QAAA,gCAAA,EACAI,SAAAJ,QAAA,gBAAA,EAEAK,UAAAL,QAAA,YAAA,EACMM,OAASN,QAAQ,QAAQ,EACzBO,KAAOP,QAAQ,MAAM,EAC3BQ,kBAAAR,QAAA,mBAAA,EAEAS,KAAAT,QAAA,IAAA,EACMU,SAAU,EAAAD,KAAAE,MAAI,EAAGC,OACjBC,GAAKb,QAAQ,IAAI,EACvBc,QAAAd,QAAA,OAAA,EAqGAe,aAAA,WAYC,SAAAA,aAAYC,GAXJC,KAAAC,aAA6D,GAE7DD,KAAAE,UAAsD,GACtDF,KAAAG,qBAA2H,IAAIC,IAC/HJ,KAAAK,UAAYT,GAAGU,kBAAiB,EAAKb,QAErCO,KAAAO,mBAAiF,GACjFP,KAAAQ,cAAgB,KAChBR,KAAAS,kBAAoB,CAAA,EACpBT,KAAAU,kBAAoB,CAAA,EAG3BV,KAAKQ,cAAgBT,EACrBC,KAAKW,WAAa,IAAIvB,UAAU,CAAEwB,OAAQ,EAAGC,YAAa,CAAC,CAAE,EAE7Db,KAAKS,kBAAuD,SAAnCK,QAAQC,IAAIC,mBACrChB,KAAKU,kBAAuD,SAAnCI,QAAQC,IAAIE,mBACrCjB,KAAKkB,cAAa,EAElBlB,KAAKmB,sBAAqB,EAEtBnB,KAAKS,mBAAqBT,KAAKU,mBAClCV,KAAKoB,kBAAiB,CAExB,CAgdD,OA9cStB,aAAAuB,UAAAH,cAAR,WACKlB,KAAKS,kBACRT,KAAKsB,WAAatB,KAAKU,kBAAqC,GAAjBV,KAAKK,UAAmC,GAAjBL,KAAKK,UAGvEL,KAAKsB,WAA8B,GAAjBtB,KAAKK,SAEzB,EAEMP,aAAAuB,UAAAF,sBAAN,W,gHACmB,MAAA,CAAA,EAAMlC,QAAAsC,gBAAgBC,UAAS,EAAGC,gBAAe,EAAGC,QAAO,G,cAAzEC,EAAcC,EAAAC,KAAA,EAClB7B,KAAKO,mBAAqBoB,E,UAG3B7B,aAAAuB,UAAAS,qBAAA,WACC,OAAO9B,KAAKO,kBACb,EAEAT,aAAAuB,UAAAU,mBAAA,SAAmBC,GAAnB,IAAAC,EAAAjC,KAEEgC,EAAWE,mBACXF,EAAWE,kBAAkBC,YAC7BH,EAAWE,kBAAkBC,WAAWC,WACxCpC,KAAKO,mBAAmB8B,KAAK,SAAAC,GAAK,OAAAA,EAAEC,OAASP,EAAWQ,gBAA6B,eAAXF,EAAEG,IAA1C,CAA+D,GAEjGxD,QAAAsC,gBAAgBC,UAAS,EACvBkB,eAAeV,EAAWQ,cAAc,EACxCG,KAAK,WACLV,EAAKW,iBAAiBZ,CAAU,CACjC,CAAC,EAGHhC,KAAKC,aAAa4C,KAAKb,CAAU,CAClC,EAEAlC,aAAAuB,UAAAuB,iBAAA,SAAiBZ,GAChB/C,QAAAsC,gBAAgBC,UAAS,EAAGoB,iBAAqCZ,EAAWQ,eAAgBR,EAAWE,iBAAiB,CACzH,EAEApC,aAAAuB,UAAAM,YAAA,WACC,OAAO3B,KAAKC,YACb,EAEAH,aAAAuB,UAAAW,WAAA,SAAWQ,GACV,OAAOxC,KAAKC,aAAa6C,KAAK,SAAAR,GAAK,OAAAA,EAAEE,iBAAmBA,CAArB,CAAmC,CACvE,EAEc1C,aAAAuB,UAAA0B,MAAd,SAAoBC,G,mFACnB,MAAA,CAAA,EAAO,IAAIC,QAAQ,SAAAC,GAAW,OAAAC,WAAWD,EAASF,CAAE,CAAtB,CAAuB,E,MAGzClD,aAAAuB,UAAAyB,KAAb,SACCN,EACAY,EACAC,G,OADA,KAAA,IAAAD,IAAAA,EAAA,I,2FAKA,OAFME,EAAWtD,KAAKuD,iBAAiB,CAACf,GAAiB,OAAQ,CAACY,EAAQC,EAAQ,EAEnEG,KAAAA,KADXC,EAASzD,KAAK0D,aAAaJ,CAAQ,IAElCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,qBAAsBxB,CAAc,EAE7D,CAAA,EAAOiB,IAGJzD,KAAKG,qBAAqB8D,IAAIX,CAAQ,GACrCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,+BAAgCxB,CAAc,EAEvE,CAAA,EAAOxC,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEa,WAG5ClF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,uBAAwBxB,CAAc,EAGzD4B,EAAYpE,KAAKqE,YAAe7B,EAAgBY,EAAQC,EAASC,CAAQ,EAC/EtD,KAAKG,qBAAqBmE,IAAIhB,EAAU,CACvCa,QAASC,EACTG,2BAA4B,CAAA,EAC5B5C,YAAa,CAACa,E,CACd,EAED4B,EAAUI,QAAQ,WACbvF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,oBAAqBxB,CAAc,EAG5DP,EAAK9B,qBAAqBsE,OAAOnB,CAAQ,CAC1C,CAAC,EAED,CAAA,EAAOc,G,MAGMtE,aAAAuB,UAAAgD,YAAd,SACC7B,EACAY,EACAC,EACAC,G,kHAMS,OAHHtB,EAAa/C,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcQ,CAAc,EAErEkC,EAAU,IAAInF,kBAAAoF,aAAa,OAAQnC,EAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACjF,CAAA,EAAMrB,EAAWc,KAAUM,EAAQC,CAAO,EAAE3B,QAAO,G,OAO5D,OAPA+B,EAAS7B,EAAAC,KAAA,EACT6C,EAAQI,OAAM,EAET9E,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEiB,4BAC5CvE,KAAK+E,WAAW,CAACvC,GAAiBc,EAAUG,CAAM,EAGnD,CAAA,EAAOA,E,OAIK3D,aAAAuB,UAAA2D,QAAb,SACCxC,EACAY,EACAC,G,OADA,KAAA,IAAAD,IAAAA,EAAA,I,2FAKA,OAFME,EAAWtD,KAAKuD,iBAAiB,CAACf,GAAiB,UAAW,CAACY,EAAQC,EAAQ,EAEtEG,KAAAA,KADXC,EAASzD,KAAK0D,aAAaJ,CAAQ,IAElCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,wBAAyBxB,CAAc,EAGhE,CAAA,EAAOiB,IAGJzD,KAAKG,qBAAqB8D,IAAIX,CAAQ,GACrCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,kCAAmCxB,CAAc,EAG1E,CAAA,EAAOxC,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEa,WAG5ClF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,0BAA2BxB,CAAc,EAG5D4B,EAAYpE,KAAKiF,eAAkBzC,EAAgBY,EAAQC,EAASC,CAAQ,EAClFtD,KAAKG,qBAAqBmE,IAAIhB,EAAU,CACvCa,QAASC,EACTG,2BAA4B,CAAA,EAC5B5C,YAAa,CAACa,E,CACd,EAED4B,EAAUI,QAAQ,WACbvF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,uBAAwBxB,CAAc,EAG/DP,EAAK9B,qBAAqBsE,OAAOnB,CAAQ,CAC1C,CAAC,EAED,CAAA,EAAOc,G,MAGMtE,aAAAuB,UAAA4D,eAAd,SACCzC,EACAY,EACAC,EACAC,G,kHAMS,OAHHtB,EAAa/C,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcQ,CAAc,EAErEkC,EAAU,IAAInF,kBAAAoF,aAAa,UAAWnC,EAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACpF,CAAA,EAAMrB,EAAWgD,QAAa5B,EAAQC,CAAO,G,OAOtD,OAPAI,EAAS7B,EAAAC,KAAA,EACT6C,EAAQI,OAAM,EAET9E,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEiB,4BAC5CvE,KAAK+E,WAAW,CAACvC,GAAiBc,EAAUG,CAAM,EAGnD,CAAA,EAAOA,E,OAIK3D,aAAAuB,UAAA6D,UAAb,SACC1C,EACA2C,EACA9B,G,oGAKA,OAHM1B,EAAWyD,cAAA,CAAI5C,GAAc6C,OAAKF,EAASG,QAAQ,SAAAC,GAAK,IAAA3D,EAAI,OAAA,OAAAA,EAAA2D,EAAMC,UAAO5D,EAAE6D,KAAO,CAACF,EAAMC,QAAQC,MAAQ,EAAE,CAAA,CAAC,EAAA,CAAA,CAAA,EAC5GnC,EAAWtD,KAAKuD,iBAAiB5B,EAAa,YAAa,CAACwD,EAAU9B,EAAQ,EAErEG,KAAAA,KADXC,EAASzD,KAAK0D,aAAaJ,CAAQ,IAElCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,oBAAqBrC,CAAW,EAEzD,CAAA,EAAO8B,IAGJzD,KAAKG,qBAAqB8D,IAAIX,CAAQ,GACrCrE,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,8BAA+BrC,CAAW,EAGnE,CAAA,EAAO3B,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEa,WAG5ClF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,sBAAuBrC,CAAW,EAGrDyC,EAAYpE,KAAK0F,iBAAoBlD,EAAgB2C,EAAU9B,EAASC,EAAU3B,CAAW,EACnG3B,KAAKG,qBAAqBmE,IAAIhB,EAAU,CACvCa,QAASC,EACTG,2BAA4B,CAAA,EAC5B5C,YAAaA,C,CACb,EAEDyC,EAAUI,QAAQ,WACbvF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,mBAAoBrC,CAAW,EAGxDM,EAAK9B,qBAAqBsE,OAAOnB,CAAQ,CAC1C,CAAC,EAED,CAAA,EAAOc,G,MAGMtE,aAAAuB,UAAAqE,iBAAd,SACClD,EACA2C,EACA9B,EACAC,EACA3B,G,kHAMS,OAHHK,EAAa/C,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcQ,CAAc,EAErEkC,EAAU,IAAInF,kBAAAoF,aAAa,YAAanC,EAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAQ,CAAC,EACxF,CAAA,EAAMrB,EAAWkD,UAAUC,EAAU9B,CAAO,EAAE3B,QAAO,G,OAO9D,OAPA+B,EAAS7B,EAAAC,KAAA,EACT6C,EAAQI,OAAM,EAET9E,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEiB,4BAC5CvE,KAAK+E,WAAWpD,EAAa2B,EAAUG,CAAM,EAG9C,CAAA,EAAOA,E,OAGK3D,aAAAuB,UAAAsE,eAAb,SACCnD,EACAY,EACAC,G,OADA,KAAA,IAAAD,IAAAA,EAAA,I,2FAKA,OAFME,EAAWtD,KAAKuD,iBAAiB,CAACf,GAAiB,iBAAkB,CAACY,EAAQC,EAAQ,EAE7EG,KAAAA,KADXC,EAASzD,KAAK0D,aAAaJ,CAAQ,GAEtC,CAAA,EAAOG,GAGJzD,KAAKG,qBAAqB8D,IAAIX,CAAQ,EACzC,CAAA,EAAOtD,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEa,UAG1CC,EAAYpE,KAAK4F,sBAAyBpD,EAAgBY,EAAQC,EAASC,CAAQ,EACzFtD,KAAKG,qBAAqBmE,IAAIhB,EAAU,CACvCa,QAASC,EACTG,2BAA4B,CAAA,EAC5B5C,YAAa,CAACa,E,CACd,EAED4B,EAAUI,QAAQ,WAAM,OAAAvC,EAAK9B,qBAAqBsE,OAAOnB,CAAQ,CAAzC,CAA0C,EAElE,CAAA,EAAOc,G,MAGMtE,aAAAuB,UAAAuE,sBAAd,SACCpD,EACAY,EACAC,EACAC,G,kHAMS,OAHHtB,EAAa/C,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcQ,CAAc,EAErEkC,EAAU,IAAInF,kBAAAoF,aAAa,iBAAkBnC,EAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAC3F,CAAA,EAAMrB,EAAW2D,eAAoBvC,EAAQC,CAAO,G,OAO7D,OAPAI,EAAS7B,EAAAC,KAAA,EACT6C,EAAQI,OAAM,EAET9E,KAAKG,qBAAqB+D,IAAIZ,CAAQ,EAAEiB,4BAC5CvE,KAAK+E,WAAW,CAACvC,GAAiBc,EAAUG,CAAM,EAGnD,CAAA,EAAOA,E,OAIA3D,aAAAuB,UAAAkC,iBAAR,SAAyB5B,EAAuBkE,EAAsBC,GAC/DC,EAAYnB,KAAKC,UAAU,CAAElD,YAAWA,EAAEkE,aAAYA,EAAEC,KAAIA,CAAA,CAAE,EACpE,OAAOzG,OAAO2G,WAAW,QAAQ,EAAEC,OAAOF,CAAS,EAAEG,OAAO,KAAK,CAClE,EAEQpG,aAAAuB,UAAAqC,aAAR,SAAqBJ,GACpB,IACC,IAAM6C,EAAanG,KAAKW,WAAWuD,IAAIZ,CAAQ,EAC/C,GAAI6C,EACH,OAAOvB,KAAKwB,MAAMD,EAAYhH,SAAAkH,WAAW,C,CAEzC,MAAOC,GACRtG,KAAKW,WAAW4F,IAAIjD,CAAQ,C,CAG9B,EAEQxD,aAAAuB,UAAA0D,WAAR,SAAmBpD,EAAuB2B,EAAkBkD,G,QAC3D,IAAI,EAAArH,SAAAsH,eAAc7B,KAAKC,UAAU2B,CAAI,CAAC,EAAI,KACzC,CAAC7E,EAAY+E,SAAS,MAAM,GAC5B,CAAC/E,EAAY+E,SAAS,sBAAsB,GAC5C,CAAC/E,EAAY+E,SAAS,mBAAmB,GACzC,CAAC/E,EAAYmB,KAAK,SAAAR,GAAK,OAAAA,EAAEqE,SAAS,WAAW,CAAtB,CAAuB,GAC9C,CAAChF,EAAYmB,KAAK,SAAAR,GAAK,OAAAA,EAAEsE,WAAW,UAAU,CAAvB,CAAwB,EAC9C,CACD,IAAIC,EAAgB7G,KAAKW,WAAWmG,SAAQ,EAAGC,MAE/C,GAAIF,EAAgB7G,KAAKsB,WAAY,CACpC,IAAI0F,EAAc,EACZC,EAAOjH,KAAKW,WAAWsG,KAAI,E,IAEjC,IAAkB,IAAAC,EAAAC,SAAAF,CAAI,EAAAG,EAAAF,EAAAG,KAAA,EAAA,CAAAD,EAAAE,KAAAF,EAAAF,EAAAG,KAAA,EAAE,CAAnB,IAAME,EAAGH,EAAAI,MAMb,GALAxH,KAAKW,WAAW4F,IAAIgB,CAAG,EACvBP,GAAe,GAEfH,EAAgB7G,KAAKW,WAAWmG,SAAQ,EAAGC,OAEL,IAAlB/G,KAAKsB,WACxB,K,mGAIFwC,QAAQC,IAAI,oCAA2CiD,EAAc,MAAQH,CAAa,C,CAG3F7G,KAAKW,WAAW2D,IAAIhB,EAAUsB,KAAKC,UAAU2B,CAAI,CAAC,EAClDxG,KAAKE,UAAU2C,KAAK,CAAElB,YAAWA,EAAE4F,IAAKjE,CAAQ,CAAE,C,CAEpD,EAEOxD,aAAAuB,UAAAoG,qBAAP,SAA4BzF,G,YACrB0F,EAAqB1H,KAAKE,UAAUkD,OAAO,SAAAd,GAAK,OAAAA,EAAEX,YAAY+E,SAAS1E,CAAU,CAAjC,CAAkC,EAEpF/C,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,GAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,yBAA0BhC,CAAU,E,IAG7D,IAAuB,IAAA2F,EAAAR,SAAAO,CAAkB,EAAAE,EAAAD,EAAAN,KAAA,EAAA,CAAAO,EAAAN,KAAAM,EAAAD,EAAAN,KAAA,EAAE,CAAtC,IAAMQ,EAAQD,EAAAJ,MAClBxH,KAAKW,WAAW4F,IAAIsB,EAASN,GAAG,EAE5BvH,KAAKG,qBAAqB8D,IAAI4D,EAASN,GAAG,IAC7CvH,KAAKG,qBAAqB+D,IAAI2D,EAASN,GAAG,EAAEhD,2BAA6B,CAAA,EAErEtF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,IAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,qCAAsC6D,EAASlG,WAAW,C,uGAKrF,IAA+B,IAAAmG,EAAAX,SAAAnH,KAAKG,qBAAqB4H,QAAO,CAAE,EAAAC,EAAAF,EAAAT,KAAA,EAAA,CAAAW,EAAAV,KAAAU,EAAAF,EAAAT,KAAA,EAAE,CAAzD,IAAAY,EAAA5C,OAAA2C,EAAAR,MAAA,CAAA,EAAMpD,GAAF6D,EAAA,GAAWA,EAAA,IACrB7D,EAAUzC,YAAY+E,SAAS1E,CAAU,IAC5CoC,EAAUG,2BAA6B,CAAA,EAEnCtF,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,IAAM3E,QAAAsC,gBAAgBoC,cAAa,EAAGC,uBAAsB,EAAGC,eAAc,GACtIC,QAAQC,IAAI,IAAIC,KAAQ,gDAAiDI,EAAUzC,WAAW,C,mGAKjG3B,KAAKE,UAAYF,KAAKE,UAAUkD,OAAO,SAAAd,GAAK,MAAA,CAACA,EAAEX,YAAY+E,SAAS1E,CAAU,CAAlC,CAAmC,CAChF,EAEQlC,aAAAuB,UAAAD,kBAAR,WAAA,IAAAa,EAAAjC,KAcOkI,EAbKjJ,QAAAsC,gBAAgBC,UAAS,EAaZ2G,MAXP,CAChB,CACCC,OAAQ,CACPC,KAAM,CACL,CAACC,UAAW,CAAEC,KAAM,CAAC,OAAQ,uBAAwB,oBAAoB,CAAE,EAC3E,CAACD,UAAW,CAAEE,KAAM,eAAe,CAAE,EACrC,CAACF,UAAW,CAAEE,KAAM,WAAW,CAAE,E,IAKG,CAAEC,aAAc,cAAc,CAAE,EAExEP,EAAaQ,GAAG,SAAU,SAAOC,GAAW,OAAAC,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACvC0G,EAAW,IAAKA,EAAW,GAAEE,OAC1BrG,EAAiBmG,EAAW,GAAEE,KACjB7I,KAAKgC,WAAWQ,CAAc,IAGhDxC,KAAKyH,qBAAqBjF,CAAc,E,QAkD1C,EAED0F,EAAaQ,GAAG,QAAS,SAAAI,GACxBhF,QAAQC,IAAI,IAAIC,KAAQ,uCAAuC,EAC/DkE,EAAaa,MAAK,EAClB5F,WAAW,WAAM,OAAAlB,EAAKb,kBAAiB,CAAtB,EAA0B,GAAI,CAChD,CAAC,EAED8G,EAAaQ,GAAG,QAAS,WACxB5E,QAAQC,IAAI,IAAIC,KAAQ,2CAA2C,EACnEb,WAAW,WAAM,OAAAlB,EAAKb,kBAAiB,CAAtB,EAA0B,GAAI,CAChD,CAAC,CACF,EACDtB,YAAA,EAAC,EAEDkJ,mBA3eaC,QAAAnJ,aAAAA,aA+eZ,SAAYuD,GAQX,IAOK6F,EAlBNlJ,KAAAmJ,gBAA6E,KAC7EnJ,KAAAoJ,mBAAgF,KAGhD,UAA3B/F,EAAQb,eACXxC,KAAKmJ,gBAAkB,IAAIE,2BAA8BhG,CAAO,EAGhErD,KAAKmJ,gBAAkB,IAAIG,uBAA0BjG,CAAO,EAGzDA,EAAQkG,uBACXvJ,KAAKmJ,gBAAgBK,YAAc,CAAA,GAE/BC,GAAgB,EAAAtK,SAAAuK,UAASrG,EAAQsG,MAAM,GAC7BC,IAAInH,KAAO,SACzBgH,EAAcG,IAAIC,SAAW,CAAA,EAEzBX,EAAgD,CACnD1G,eAAgBa,EAAQb,eAAiB,YACzCmH,OAAQF,EACRF,qBAAsB,CAAA,EACtBO,iBAAkB,CAAA,EAClBC,0BAA2B,GAC3BC,WAAY,CAAA,EACZC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbhI,kBAAmB,I,EAGW,UAA3BmB,EAAQb,eACXxC,KAAKoJ,mBAAqB,IAAIC,2BAA8BH,CAAc,EAG1ElJ,KAAKoJ,mBAAqB,IAAIE,uBAA0BJ,CAAc,EAGvElJ,KAAKoJ,mBAAmBe,YAAY,CAACC,UAAW,EAAGC,UAAW,CAAC,CAAC,EAChErK,KAAKmJ,gBAAgBmB,kBAAoBjH,EAAQb,eAAiB,YAEpE,GAeD8G,wBAxDaL,QAAAD,kBAAAA,kBAwDb,WAYC,SAAAM,uBAAYjG,GAAZ,IAUMkH,EAVNtI,EAAAjC,KAeKwK,GA1BLxK,KAAAwC,eAAiB,GACjBxC,KAAAkK,YAAc,CAAA,EACdlK,KAAAyK,YAAc,KACdzK,KAAA0K,SAAW,KACX1K,KAAAgK,WAAa,CAAA,EACbhK,KAAAwJ,YAAc,CAAA,EACdxJ,KAAAsK,kBAAoB,GACpBtK,KAAAiK,WAAa,CAAA,EACbjK,KAAA2K,MAAQ,CAAA,EAIP3K,KAAKwC,eAAiBa,EAAQb,eAC9BxC,KAAKyK,YAAc,IAAI3L,eAAA8L,QAAavH,EAAQsG,MAAM,EAClD3J,KAAKgK,WAAa3G,EAAQ2G,WAC1BhK,KAAKiK,WAAa5G,EAAQ4G,WAC1BjK,KAAKkK,YAAc7G,EAAQ6G,YAC3BlK,KAAKkC,kBAAoBmB,EAAQnB,kBAE7BmB,EAAQyG,mBACX9J,KAAK2K,MAAQ,CAAA,EACTJ,GAAa,EAAApL,SAAAuK,UAASrG,EAAQsG,MAAM,EACpCe,GAAW,EAAAvL,SAAA0L,gBAAexH,EAAQ0G,0BAA2BQ,EAAY,EAAE,EAC/EvK,KAAK0K,UAAW,EAAAvL,SAAA2L,eAAcJ,CAAQ,GAGxBK,YAAY,WACtB9L,QAAAsC,iBAAmBtC,QAAAsC,gBAAgBoC,cAAa,GAAM1E,QAAAsC,gBAAgByJ,gBAAe,GAAM/L,QAAAsC,gBAAgByJ,gBAAe,EAAGlJ,qBAAoB,EAAGnC,SACvJV,QAAAsC,gBAAgByJ,gBAAe,EAAGjJ,mBAAmBE,CAAI,EACzDgJ,cAAcT,CAAQ,EAExB,EAAG,CAAC,EACL,C,MA81DD,OAvzDClB,uBAAAjI,UAAA6J,0BAAA,SAA0BC,GACzB,IACIC,EAAUD,EAAaE,MADR,mDAC0B,EAQ7C,OAHCD,EAHG,CAACA,GAAWA,EAAQzL,QAAU,EAGvBwL,EAAaE,MADR,kCAC0B,EAGnCD,IAA4B,EAAjBA,EAAQzL,OAAayL,EAAQ,GAAK,IACrD,EAEA9B,uBAAAjI,UAAA6D,UAAA,SAAUC,EAAoB9B,EAA4BiI,GAA1D,IAAArJ,EAAAjC,KACC,OADyD,KAAA,IAAAsL,IAAAA,EAAA,CAAA,GAClD,IAAIrI,QAAQ,SAACC,EAASqI,GAC5B,IAQKC,EARAF,GAQAE,EAAU,IAAIjM,kBAAAoF,aAAa,YAAa1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAQ,CAAC,EACpGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEgD,UAAUC,EAAU9B,CAAO,EAAE3B,QAAO,EAAGiB,KAAK,SAAA8I,GAClID,EAAQ1G,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACF0C,EAAQ1G,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,kBAAmB/B,EAAKO,eAAgB2C,EAAU9B,EAASyF,CAAG,EACtFyC,EAAOzC,CAAG,CACX,CAAC,GAfD7J,QAAAsC,gBAAgByJ,gBAAe,EAAG9F,UAAUjD,EAAKO,eAAgB2C,EAAU9B,CAAO,EAAEV,KAAK,SAAA8I,GACxFvI,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFyC,EAAOzC,CAAG,CACX,CAAC,CAaH,CAAC,CACF,EAEMQ,uBAAAjI,UAAAqK,eAAN,SAAqBvG,EAAoB9B,G,8FACxC,MAAA,CAAA,EAAO,IAAIJ,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,iBAAkB1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAQ,CAAC,EACzGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEgD,UAAUC,EAAU9B,CAAO,EAAE3B,QAAO,EAAGiB,KAAK,SAAA8I,GAClI/G,EAAQI,OAAM,EACd5B,EAAQuI,EAAI9L,MAAM,CACnB,EAAG,SAAAmJ,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,kBAAmB/B,EAAKO,eAAgB2C,EAAU9B,EAASyF,CAAG,EACtFyC,EAAO,CAAC,CACT,CAAC,CACF,CAAC,E,MAGFjC,uBAAAjI,UAAAsK,gBAAA,SAAgBxG,EAAoB9B,GACnC,IAAIqB,EAAU,IAAInF,kBAAAoF,aAAa,kBAAmB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAQ,CAAC,EACtGuI,EAAS3M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEgD,UAAUC,EAAU9B,CAAO,EAM/H,OALAuI,EAAOlD,GAAG,QAAS,SAAAmD,GAElB,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EAEMD,CACR,EAEAtC,uBAAAjI,UAAAyK,gBAAA,SAAgB3G,EAAoB9B,EAA4B0I,GAC/D,IAAIrH,EAAU,IAAInF,kBAAAoF,aAAa,kBAAmB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACM,EAAU9B,EAAS0I,EAAc,CAAC,EACrHC,EAAS/M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEgD,UAAUC,EAAU9B,CAAO,EAAE2I,OAAOD,CAAa,EAcrJ,OAbAC,EAAOtD,GAAG,MAAO,SAAAmD,GAEhB,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EACAnD,GAAG,QAAS,SAAAmD,GAEZ,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EACAnD,GAAG,QAAS,SAAAmD,GAEZ,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EAEMG,CACR,EAEM1C,uBAAAjI,UAAA4K,UAAN,SACCC,EACA7I,EACA8I,G,OAAA,KAAA,IAAAA,IAAAA,EAAA,CAAA,G,+IAEA,GAAI,CAACD,EAAWvM,OACf,MAAA,CAAA,EAAO,MAGFyM,EAAa,IACfC,EAAU,E,sBAEPA,EAAUH,EAAWvM,QAAM,MAAA,CAAA,EAAA,IAC3B2M,EAAWJ,EAAWK,MAAMF,EAASA,EAAUD,CAAU,EAGzDI,EAAO,GACPC,EAAa,G,IAEnB,IAAiBC,EAAA,KAAA,EAAAC,EAAAxF,SAAAmF,CAAQ,EAAAM,EAAAD,EAAAtF,KAAA,EAAA,CAAAuF,EAAAtF,KAAAsF,EAAAD,EAAAtF,KAAA,EAAE,CAK1B,GALUwF,EAAED,EAAApF,MACNsF,EAASC,OAAO9F,KAAK4F,CAAE,EAAE,GACzBG,EAAMH,EAAGC,GAGX9M,KAAKkK,aAAe,CAACiC,EAAmB,CAI3C,GAHMc,EAAoBjN,KAAKyK,YAAYyC,WAAU,EACjDC,EAAO,KAAA,EAEI,cAAXL,EACHK,EAAUF,EAAkBG,SAASJ,EAAIK,QAAQ,OAE7C,GAAe,eAAXP,EACRK,EAAUF,EAAkBG,SAASJ,EAAIM,WAAW,OAEhD,GAAe,cAAXR,GAAqC,eAAXA,EAElCK,EAAUF,EAAkBG,SAASJ,EAAI/G,OAAQ,CAAEsH,SAAU,CAAA,CAAI,CAAE,MAE/D,CAAA,GAAe,cAAXT,GAAqC,eAAXA,EAKlC,MAAM,IAAIU,MAAM,+BAAAC,OAA+BX,CAAM,CAAE,EAHvDK,EAAU,CAAA,C,CAMX,GAAI,CAACA,EACJ,MAAM,IAAIK,MACT,gCAAAC,OAAgCX,EAAM,IAAA,EAAAW,OAAK7I,KAAKC,UAAUoI,EAAkBS,iBAAgB,CAAE,CAAC,CAAE,C,CAOpG,GAAe,cAAXZ,EAEC9M,KAAKgK,aACRgD,EAAIK,SAASM,UAAY,IAAI3J,KAC7BgJ,EAAIK,SAASO,UAAY,IAAI5J,MAI1BhE,KAAKiK,YACRuC,EAAK3J,KAAK,CACTgL,UAAW,CACVR,SAAU,CACTzD,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIK,SAASzD,KAAOkE,kBAAiB,EAClDE,SACC,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAUmI,EAAIK,QAAQ,CAAC,EAAI,IAC3CzI,KAAKC,UAAUmI,EAAIK,SAAU,KAAM,CAAC,EACpC,UACJY,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,GAGjB,EAIEhE,KAAKwJ,cACF8E,EAAUC,SAAAA,SAAA,GACZvB,EAAIK,QAAQ,EAAA,CACfmB,IAAK,EACL5E,IAAK,CAAEA,IAAKoD,EAAIK,SAASzD,KAAOkE,kBAAiB,EAAIU,IAAK,CAAC,CAAE,CAAA,EAE9D/B,EAAW5J,KAAK,CACfgL,UAAW,CACVR,SAAUiB,C,EAEX,GAIFzB,EAAGC,GAAQO,SAAWL,EAAIK,cAEtB,GAAe,cAAXP,GAAqC,eAAXA,EAE9B9M,KAAKgK,aACHgD,EAAI/G,OAAOwI,OACfzB,EAAI/G,OAAOwI,KAAO,IAEnBzB,EAAI/G,OAAOwI,KAAKb,UAAY,IAAI5J,MAI7BhE,KAAKwJ,cACHwD,EAAI/G,OAAOyI,OACf1B,EAAI/G,OAAOyI,KAAO,IAEnB1B,EAAI/G,OAAOyI,KAAKF,IAAM,GAInBxO,KAAKiK,YACRuC,EAAK3J,KAAK,CACTgL,UAAW,CACVR,SAAU,CACTzD,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAI5J,OAAOwG,KAAO,KAC/BoE,SACC,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAUmI,EAAI/G,MAAM,CAAC,EAAI,IACzCrB,KAAKC,UAAUmI,EAAI/G,OAAQ,KAAM,CAAC,EAClC,UACJgI,OAAQnB,EACRoB,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,GAGjB,EAIEhE,KAAKwJ,aACRiD,EAAW5J,KAAK,CACfO,OAAQ4J,EAAI5J,M,CACZ,OAKE,GAAe,eAAX0J,EAEJ9M,KAAKgK,aACRgD,EAAIM,YAAYM,UAAY,IAAI5J,MAI7BhE,KAAKwJ,cACRwD,EAAIM,YAAYkB,KAAOxB,EAAIM,YAAYkB,KAAO,GAAK,GAIhDxO,KAAKiK,YACRuC,EAAK3J,KAAK,CACTgL,UAAW,CACVR,SAAU,CACTzD,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAI5J,OAAOwG,KAAO,KAC/BoE,SACC,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAUmI,EAAIM,WAAW,CAAC,EAAI,IAC9C1I,KAAKC,UAAUmI,EAAIM,YAAa,KAAM,CAAC,EACvC,UACJW,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,GAGjB,EAIEhE,KAAKwJ,aACRiD,EAAW5J,KAAK,CACfO,OAAQ4J,EAAI5J,M,CACZ,EAIFyJ,EAAGC,GAAQQ,YAAcN,EAAIM,gBAEzB,CAAA,GAAe,cAAXR,GAAqC,eAAXA,EAmClC,MAAM,IAAIU,MAAM,+BAAAC,OAA+BX,CAAM,CAAE,EAjCnD9M,KAAKiK,YACRuC,EAAK3J,KAAK,CACTgL,UAAW,CACVR,SAAU,CACTzD,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAI5J,OAAOwG,KAAO,KAC/BoE,SACC,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAUmI,EAAI5J,MAAM,CAAC,EAAI,IACzCwB,KAAKC,UAAUmI,EAAI5J,OAAQ,KAAM,CAAC,EAClC,UACJ6K,OAAQnB,EACRoB,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,GAGjB,EAIEhE,KAAKwJ,aACRiD,EAAW5J,KAAK,CACfO,OAAQ4J,EAAI5J,M,CACZ,C,2GAUAuL,EAAe,GAGf3O,KAAKwJ,aAAmC,EAApBiD,EAAW9M,SAE5BiP,EAAiBnC,EAAWoC,IAAI,SAACC,GAAM,OAAAA,EAAE1L,MAAF,CAAQ,EACtC,CAAA,EAAMnE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,cAAc,EAAEM,KAAK,CAAEiM,IAAKH,CAAc,CAAE,EAAElN,QAAO,IAHnH,CAAA,EAAA,G,cAGHiN,EAAe7G,EAAAjG,KAAA,EAaa,GAVtBmN,EAAiBL,EAAaE,IAAI,SAAC7B,GAAQ,MAAA,CAChDa,UAAW,CACVR,SAAQkB,SAAAA,SAAA,GACJvB,CAAG,EAAA,CACNpD,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAE,CAAA,C,CAGrC,CAPgD,CAO/C,GAGiB7O,QAClB,CAAA,EAAMV,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKsK,iBAAiB,EAAE2B,UAAe+C,EAAgB,CAAEC,QAAS,CAAA,CAAK,CAAE,GADnH,CAAA,EAAA,G,OACHnH,EAAAjG,KAAA,E,iBAMF,OADM6C,EAAU,IAAInF,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACyH,EAAUjJ,EAAQ,CAAC,EACtG,CAAA,EAAMpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,cAAc,EAAEyJ,UAAUK,EAAUjJ,CAAO,G,cAA7FyE,EAAAjG,KAAA,EACA6C,EAAQI,OAAM,EAGV9E,KAAKiK,YAA4B,EAAduC,EAAK7M,QAC3B,CAAA,EAAMV,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAEiK,UAAUO,CAAI,GADhE,CAAA,EAAA,G,OACH1E,EAAAjG,KAAA,E,qBAGG7B,KAAKwJ,YAAL,MAAA,CAAA,EAAA,I,iBA6BkB,O,wBA1Bd0F,EAAiBP,EAAaE,IAAI,SAAC7B,GAAQ,OAAAA,EAAIpD,GAAJ,CAAO,EAElDzE,EAAW,CAChB,CACCiD,OAAQ,CAAEgC,UAAW,CAAE+E,IAAKD,CAAc,CAAE,C,EAE7C,CACCE,MAAO,CAAEhF,UAAW,EAAGC,UAAW,CAAC,CAAC,C,EAErC,CACCgF,OAAQ,CACPzF,IAAK,WACL0F,SAAU,CAAEC,MAAO,MAAM,C,GAG3B,CACCC,SAAU,CACTC,iBAAkB,CAAEC,OAAQ,CAAC,YAAa,EAAG,CAAEC,MAAO,WAAW,EAAG,C,GAGtE,CAAEC,QAAS,mBAAmB,EAC9B,CACCC,aAAc,CAAEC,QAAS,CAAElG,IAAK,mBAAmB,CAAE,C,GAInC,CAAA,EAAM3K,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKsK,iBAAiB,EAAEpF,UAAUC,CAAQ,EAAEzD,QAAO,G,cAE3F,GAFnBqO,EAAcjI,EAAAjG,KAAA,GAEJlC,OACf,CAAA,EAAMV,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKsK,iBAAiB,EAAE0F,WAAW,CAAEpG,IAAK,CAAEuF,IAAKY,EAAYlB,IAAI,SAACC,GAAM,OAAAA,EAAElF,GAAF,CAAK,CAAC,CAAE,CAAE,GAD5H,CAAA,EAAA,I,QACH9B,EAAAjG,KAAA,E,0DAIDiC,QAAQwC,MAAM,gCAAiC2J,CAAK,E,eAQtD,OAHA5D,GAAWD,EAGX,CAAA,EAAM,IAAInJ,QAAQ,SAACC,GAAY,OAAAgN,aAAahN,CAAO,CAApB,CAAqB,G,eAApD4E,EAAAjG,KAAA,EAGA5C,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBzH,KAAKwC,cAAc,E,cAG3E,MAAA,CAAA,EAAO,CAAE2N,GAAI,CAAC,E,OAGf7G,uBAAAjI,UAAAsE,eAAA,SACCvC,EACAC,EACAiI,GAHD,IAAArJ,EAAAjC,KAKC,OAJA,KAAA,IAAAoD,IAAAA,EAAA,IAEA,KAAA,IAAAkI,IAAAA,EAAA,CAAA,GAEO,IAAIrI,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,uGAGa,IAA/B8K,OAAO9F,KAAK7D,CAAM,EAAEzD,QAI5B,CAAA,EAAMV,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEkO,uBAAuB/M,CAAO,GAFpI,CAAA,EAAA,G,cAEGoI,EAAM4E,EAAAxO,KAAA,EACZqB,EAAQuI,CAAG,E,aAEFH,GASLgF,EAAU,IAAI/Q,kBAAAoF,aAAa,iBAAkB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACvGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEyD,eAAoBvC,EAAQC,CAAO,EAAEV,KAC3H,SAAA8I,GACC6E,EAAQxL,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EACA,SAAA3C,GACCwH,EAAQxL,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,wBAAyB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC1FyC,EAAOzC,CAAG,CACX,CAAC,GAjBF7J,QAAAsC,gBAAgByJ,gBAAe,EAAGrF,eAAe3F,KAAKwC,eAAgBY,EAAQC,CAAO,EAAEV,KACtF,SAAA8I,GAAO,OAAAvI,EAAQuI,CAAG,CAAX,EACP,SAAA3C,GAAO,OAAAyC,EAAOzC,CAAG,CAAV,CAAW,E,sDAmBpBhF,QAAQC,IAAI,IAAIC,KAAQ,gCAAiChE,KAAKwC,eAAgBY,EAAQC,EAASkN,CAAG,EAClGhF,EAAOgF,CAAG,E,4BAEX,CACF,EAGAjH,uBAAAjI,UAAAmP,OAAA,SAAOC,EAAiBpN,GACvB,OAAKqN,MAAMC,QAAQF,CAAM,EAGE,IAAlBA,EAAO9Q,OACRK,KAAK6N,UAAU4C,EAAO,GAAsBpN,CAAO,EAGpDrD,KAAK4Q,WAAWH,EAA0BpN,CAAO,EANhDrD,KAAK6N,UAAU4C,EAA0BpN,CAAO,CAOzD,EAEAiG,uBAAAjI,UAAA8I,YAAA,SAAY0G,EAAkBxN,GAA9B,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,iEAIf,O,sBAAA,CAAA,EADHhD,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAC5D4O,QAAO,G,OAOlD,OAPMC,EAAkBV,EAAAxO,KAAA,EAGJkP,EAAgB1O,KAAK,SAAA2O,GACxC,OAAApM,KAAKC,UAAUmM,EAAMzJ,GAAG,IAAM3C,KAAKC,UAAUgM,CAAW,CAAxD,CAAyD,GAIzD,CAAA,EAAO3N,EAAQ,sBAAsB,IAItCoG,uBAAuB2H,WAAWpO,KAAK,CACtCqO,OAAQ,cACRlP,WAAYhC,KACZmR,MAAO,CAACN,GACRxN,QAASA,C,EACP,SAACyF,EAAKrF,GACJqF,EAAKyC,EAAOzC,CAAG,EACd5F,EAAQO,CAAM,CACpB,CAAC,E,gCAED8H,EAAO6F,CAAG,E,4BAEX,CACF,EAEA9H,uBAAAjI,UAAAgQ,cAAA,SAAcC,EAAgCjO,GAA9C,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,mEAGf,O,sBAAA,CAAA,EADHhD,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAC5D4O,QAAO,G,OAUlD,OAVMS,EAAkBlB,EAAAxO,KAAA,EAUO,KAPzB2P,EAAkBF,EAAWlO,OAAO,SAAAqO,GACzC,MAAA,CAACF,EAAgBlP,KAAK,SAAAqP,GACrB,OAAA9M,KAAKC,UAAU6M,EAAcnK,GAAG,IAAM3C,KAAKC,UAAU4M,EAAUlK,GAAG,CAAlE,CAAmE,CADpE,CAEC,GAIkB5H,QACnB,CAAA,EAAOuD,EAAQ,CAAC,4BAA4B,IAI7CoG,uBAAuB2H,WAAWpO,KAAK,CACtCqO,OAAQ,gBACRlP,WAAYhC,KACZmR,MAAO,CAACK,GACRnO,QAASA,C,EACP,SAACyF,EAAKrF,GACJqF,EAAKyC,EAAOzC,CAAG,EACd5F,EAAQO,CAAM,CACpB,CAAC,E,gCAED8H,EAAOoG,CAAG,E,4BAEX,CACF,EAEArI,uBAAAjI,UAAA2O,WAAA,SAAW5M,EAAqEC,EAAyBuO,GAAzG,IAAA3P,EAAAjC,KACC,OADU,KAAA,IAAAoD,IAAAA,EAAA,IAA8F,KAAA,IAAAwO,IAAAA,EAAA,CAAA,GACjG,IAAI3O,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,sFACpCjC,CAAAA,KAAKiK,YAAe2H,EAApB,CAAA,EAAA,GACQ,CAAA,EAAM5R,KAAK8C,KAAKM,CAAM,G,OAEjC,IAFIyO,EAAOxB,EAAAxO,KAAA,EAEFiQ,EAAI,EAAGA,EAAID,EAAKlS,OAAQmS,CAAC,GAC7B9E,EAAM6E,EAAKC,GAEf7S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,GAAU,KAAM,CAAC,EAAI,UAC5H4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAEGhE,KAAKwJ,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyH,WAAgB,CAACnI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAAC0D,OAAQ,CAAA,CAAI,CAAC,EACrJ/S,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAE0F,WAAgB,CAAC3H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC4H,IAAKjF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,G,wBAKnJ9J,EAAU,IAAInF,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACnGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE8N,WAAgB5M,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAC5H/G,EAAQI,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAI0G,YAAY,GAGxB5G,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACtFyC,EAAOzC,CAAG,CACX,CAAC,E,SACD,CACF,EAEAQ,uBAAAjI,UAAA+Q,UAAA,SAAUhP,EAAqEC,EAAmCuO,GAAlH,IAAA3P,EAAAjC,KACC,OADS,KAAA,IAAAoD,IAAAA,EAAA,IAAwG,KAAA,IAAAwO,IAAAA,EAAA,CAAA,GAC1G,IAAI3O,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,0DACpCjC,KAAKiK,YAAc,CAAC2H,GACnBS,EAAU,IAAI9S,kBAAAoF,aAAa,mBAAoB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACzGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEoQ,iBAAsBlP,EAAQC,CAAO,EAAEV,KAAK,SAAM4P,GAAS,OAAA3J,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,mDACjJoQ,EAAQvN,OAAM,GACVkI,EAAMuF,EAAU/K,QAGfxH,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,GAAU,KAAM,CAAC,EAAI,UAC5H4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGEhE,KAAKwJ,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyH,WAAgB,CAACnI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAAC0D,OAAQ,CAAA,CAAI,CAAC,EACrJ/S,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAE0F,WAAgB,CAAC3H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC4H,IAAKjF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,GAGrJvP,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBzH,KAAKwC,cAAc,EAE1EU,EAAQ,CAAC,GAGTA,EAAQ,CAAC,E,SAER,SAAA4F,GACFuJ,EAAQvN,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC9FyC,EAAOzC,CAAG,CACX,CAAC,IAGG0J,EAAU,IAAIjT,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAClGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEkQ,UAAehP,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAC3H+G,EAAQ1N,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAI0G,YAAY,GAGxB5G,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACF0J,EAAQ1N,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACrFyC,EAAOzC,CAAG,CACX,CAAC,G,QAEF,CACF,EAEAQ,uBAAAjI,UAAAoR,SAAA,SAASlL,EAAanE,EAAiEC,GAAvF,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,WAAY1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAAC0C,EAAKnE,EAAQC,EAAQ,CAAC,EACtGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEuQ,SAASlL,EAAUnE,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAC/H/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACnFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAqR,KAAA,SAAKrP,GAAL,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,OAAQ1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACxB,EAAQ,CAAC,EACrFpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEwQ,KAAKrP,CAAO,EAAEV,KAAK,SAAA8I,GACzG/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,wBAAyB/B,EAAKO,eAAgBa,EAASyF,CAAG,EAClFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAsR,UAAA,SAAUC,EAAmBvP,GAA7B,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,YAAa1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAAC+N,EAAWvP,EAAQ,CAAC,EACrGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEyQ,UAAUC,EAAWvP,CAAO,EAAEV,KAAK,SAAA8I,GACzH/G,EAAQI,OAAM,EACd5B,EAAkBuI,CAAG,CACtB,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBoQ,EAAWvP,EAASyF,CAAG,EACxFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAwR,YAAA,SAAYxP,GAAZ,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,cAAe1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACxB,EAAQ,CAAC,EAC5FpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE2Q,YAAYxP,CAAO,EAAEV,KAAK,SAAA8I,GAChH/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,qBAAsB/B,EAAKO,eAAgBa,EAASyF,CAAG,EAC/EyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAyB,KAAA,SAAKM,EAAqEC,EAA0BiI,GAApG,IAAArJ,EAAAjC,KACC,OADI,KAAA,IAAAoD,IAAAA,EAAA,IAA+F,KAAA,IAAAkI,IAAAA,EAAA,CAAA,GAC5F,IAAIrI,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,wDACnCqJ,GAQAwH,EAAU,IAAIvT,kBAAAoF,aAAa,OAAQ3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAC7FpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEY,KAAaM,EAAQC,CAAO,EAAE3B,QAAO,EAAGiB,KAAK,SAAA8I,GACnIqH,EAAQhO,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFgK,EAAQhO,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,aAAc/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC/EyC,EAAOzC,CAAG,CACX,CAAC,GAfD7J,QAAAsC,gBAAgByJ,gBAAe,EAAGlI,KAAK9C,KAAKwC,eAAgBY,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GACjFvI,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFyC,EAAOzC,CAAG,CACX,CAAC,E,QAaF,CACF,EAEAQ,uBAAAjI,UAAA0R,SAAA,SAASC,EAAY3P,GAArB,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,WAAY1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAAC,CAAC+E,IAAKoJ,CAAE,EAAG3P,EAAQ,CAAC,EACpGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE8C,QAAgB,CAAC4E,IAAKoJ,CAAE,EAAG3P,CAAO,EAAEV,KAAK,SAAA8I,GAC/H/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgB,CAACoH,IAAKoJ,CAAE,EAAG3P,EAASyF,CAAG,EACxFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAA4R,UAAA,SAAU7P,EAAqEC,GAA/E,IAAApB,EAAAjC,KACC,OADS,KAAA,IAAAoD,IAAAA,EAAA,IACF,IAAIH,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,YAAa1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAClGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEY,KAAUM,EAAQC,CAAO,EAAE6P,MAAK,EAAGvQ,KAAK,SAAA8I,GAC9H/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACrFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAA8R,WAAA,SAAW/P,EAAqEC,GAArE,KAAA,IAAAD,IAAAA,EAAA,IACV,IAAIsB,EAAU,IAAInF,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAC/FuI,EAAS3M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEY,KAAUM,EAAQC,CAAO,EAO7H,OANAuI,EAAOlD,GAAG,QAAS,SAAAmD,GAGlB,OAFAnH,EAAQI,OAAM,EACd8G,EAAOwH,mBAAkB,EAClBvH,CACR,CAAC,EAEMD,CACR,EAEAtC,uBAAAjI,UAAAgS,WAAA,SAAWjQ,EAAqEC,EAA0B0I,GAA/F,KAAA,IAAA3I,IAAAA,EAAA,IACV,IAAIsB,EAAU,IAAInF,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAS0I,EAAc,CAAC,EAC9GC,EAAS/M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEY,KAAUM,EAAQC,CAAO,EAAE2I,OAAOD,CAAa,EAcnJ,OAbAC,EAAOtD,GAAG,MAAO,SAAAmD,GAEhB,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EACAnD,GAAG,QAAS,SAAAmD,GAEZ,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EACAnD,GAAG,QAAS,SAAAmD,GAEZ,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EAEMG,CACR,EAEA1C,uBAAAjI,UAAA2D,QAAA,SAAQ5B,EAAqEC,EAA0BiI,GAAvG,IAAArJ,EAAAjC,KACC,OADO,KAAA,IAAAoD,IAAAA,EAAA,IAA+F,KAAA,IAAAkI,IAAAA,EAAA,CAAA,GAC/F,IAAIrI,QAAQ,SAACC,EAASqI,GAC5B,IAQK+H,EARAhI,GAQAgI,EAAU,IAAI/T,kBAAAoF,aAAa,UAAW1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EAChGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE8C,QAAgB5B,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAC5H6H,EAAQxO,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFwK,EAAQxO,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EACnFyC,EAAOzC,CAAG,CACX,CAAC,GAfD7J,QAAAsC,gBAAgByJ,gBAAe,EAAGhG,QAAQ/C,EAAKO,eAAgBY,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GACpFvI,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFyC,EAAOzC,CAAG,CACX,CAAC,CAaH,CAAC,CACF,EAEAQ,uBAAAjI,UAAAiR,iBAAA,SAAiBlP,EAAqEC,EAAmCuO,GAAzH,IAAA3P,EAAAjC,KACC,OADgB,KAAA,IAAAoD,IAAAA,EAAA,IAAwG,KAAA,IAAAwO,IAAAA,EAAA,CAAA,GACjH,IAAI3O,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,wDACpCyC,EAAU,IAAInF,kBAAAoF,aAAa,mBAAoB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQC,EAAQ,CAAC,EACzGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEoQ,iBAAsBlP,EAAQC,CAAO,EAAEV,KAAK,SAAA8I,GAClI/G,EAAQI,OAAM,EACd,IAoBMwJ,EApBFtB,EAAMvB,EAAIjE,MAEVwF,GACC/K,EAAKgI,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQC,GAAU,KAAM,CAAC,EAAI,UAC5H4K,OAAQ,mBACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGE/B,EAAKuH,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWC,EAAKqI,iBAAiB,EAAEyH,WAAgB,CAACnI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAAC0D,OAAQ,CAAA,CAAI,CAAC,GAGtJ/S,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAE1EU,EAAW8J,CAAG,GAGd9J,EAAQ,IAAI,CAEd,EAAG,SAAA4F,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC9FyC,EAAOzC,CAAG,CACX,CAAC,E,QACD,CACF,EAEAQ,uBAAAjI,UAAAkS,kBAAA,SAAkBnQ,EAAqEkK,EAAgBjK,EAAoCuO,EAAoBzF,GAA/J,IAAAlK,EAAAjC,KACC,OADiB,KAAA,IAAAoD,IAAAA,EAAA,IAAyH,KAAA,IAAAwO,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAzF,IAAAA,EAAA,CAAA,GACvJ,IAAIlJ,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACpCjC,CAAAA,KAAKkK,aAAgBiC,IAClBqH,EAAaxT,KAAKyK,YAAYyC,WAAU,EAC9BsG,EAAWpG,SAASE,CAAW,IAW5CmG,EAAO,IAAIzP,KAEXhE,KAAKgK,aACRsD,EAAYM,UAAY6F,GAGrBpQ,GAAWA,EAAQ2O,SACjB1E,EAAY1D,MAChB0D,EAAY1D,IAAMkE,kBAAiB,GAGhC9N,KAAKwJ,cACR8D,EAAYkB,IAAM,GAGfxO,KAAKgK,aAAc,CAACsD,EAAYK,YACnCL,EAAYK,UAAY8F,GAItB/O,EAAU,IAAInF,kBAAAoF,aAAa,oBAAqB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EACvHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEqR,kBAAuBnQ,EAAQkK,EAAajK,CAAO,EAAEV,KAAK,SAAA8I,GAChJ/G,EAAQI,OAAM,EACd,IAoBMwJ,EApBFtB,EAAMvB,EAAIjE,MAEVwF,GACC/K,EAAKgI,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,oBACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGE/B,EAAKuH,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWC,EAAKqI,iBAAiB,EAAEyH,WAAgB,CAACnI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAAC0D,OAAQ,CAAA,CAAI,CAAC,GAGtJ/S,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAE1EU,EAAW8J,CAAG,GAGd9J,EAAQ,IAAI,CAEd,EAAG,SAAA4F,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,6BAA8B/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC/FyC,EAAOzC,CAAG,CACX,CAAC,IApEChF,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,oCAAqCgR,EAAW9F,iBAAgB,CAAE,EAC/GzO,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAGC,mBAAmBC,KAAK3U,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAI,iBAAkB,wCAA0C1T,KAAKwC,eAAgB,CAACgR,EAAW9F,iBAAgB,EAAIJ,EAAY,EAE5P/B,EAAOiI,EAAW9F,iBAAgB,CAAE,G,QAkEtC,CACF,EAEApE,uBAAAjI,UAAAwS,iBAAA,SAAiBzQ,EAAqE6C,EAAqC5C,EAAmCuO,EAAoBzF,GAAlL,IAAAlK,EAAAjC,KACC,OADgB,KAAA,IAAAoD,IAAAA,EAAA,IAA6I,KAAA,IAAAwO,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAzF,IAAAA,EAAA,CAAA,GAC1K,IAAIlJ,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACpCjC,CAAAA,KAAKkK,aAAgBiC,IAClBqH,EAAaxT,KAAKyK,YAAYyC,WAAU,EAC9BsG,EAAWpG,SAASnH,EAAQ,CAACsH,SAAU,CAAA,CAAI,CAAC,IAUzDvN,KAAKgK,aACJyJ,EAAO,IAAIzP,KAEViC,EAAOwI,KAIXxI,EAAOwI,KAAKb,UAAY6F,EAHxBxN,EAAOwI,KAAY,CAACb,UAAW6F,CAAI,GAOjCpQ,GAAWA,EAAQ2O,SACjB/L,EAAO6N,cAcN7N,EAAO6N,aAAalK,MACxB3D,EAAO6N,aAAalK,IAAMkE,kBAAiB,GAGxC9N,KAAKgK,YAAc,CAAC/D,EAAO6N,aAAanG,YAC3C1H,EAAO6N,aAAanG,UAAY,IAAI3J,OAlBjChE,KAAKgK,WACR/D,EAAO6N,aAAoB,CAC1BlK,IAAKkE,kBAAiB,EACtBH,UAAW,IAAI3J,I,EAIhBiC,EAAO6N,aAAoB,CAC1BlK,IAAKkE,kBAAiB,C,GAetBpJ,EAAU,IAAInF,kBAAAoF,aAAa,mBAAoB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EACjHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE2R,iBAAsBzQ,EAAa6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GAC/I/G,EAAQI,OAAM,EACd,IAoBMwJ,EApBFtB,EAAMvB,EAAIjE,MAEVwF,GACC/K,EAAKgI,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAqBf,EAAIpD,IACzBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UAC5I4K,OAAQ,mBACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGE/B,EAAKuH,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWC,EAAKqI,iBAAiB,EAAEyH,WAAgB,CAACnI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAAC0D,OAAQ,CAAA,CAAI,CAAC,GAGtJ/S,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAE1EU,EAAW8J,CAAG,GAGd9J,EAAQ,IAAI,CAEd,EAAG,SAAA4F,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B/B,EAAKO,eAAgBY,EAAQC,EAASyF,CAAG,EAC9FyC,EAAOzC,CAAG,CACX,CAAC,IAnFChF,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,mCAAoCgR,EAAW9F,iBAAgB,CAAE,EAC9GzO,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAGC,mBAAmBC,KAAK3U,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAI,iBAAkB,uCAAyC1T,KAAKwC,eAAgB,CAACgR,EAAW9F,iBAAgB,EAAIzH,EAAO,EACtPsF,EAAOiI,EAAW9F,iBAAgB,CAAE,G,QAkFtC,CACF,EAEApE,uBAAAjI,UAAAyP,QAAA,SAAQzN,GAAR,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,UAAW1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACxB,EAAQ,CAAC,EACxFpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE4O,QAAQzN,CAAO,EAAEV,KAAK,SAAA8I,GAC5G/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,gBAAiB/B,EAAKO,eAAgBa,EAASyF,CAAG,EAC1EyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAA0S,YAAA,SAAYjD,EAA4BzN,GAAxC,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,cAAe1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAACiM,EAASzN,EAAQ,CAAC,EACrGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAE6R,YAAYjD,EAASzN,CAAO,EAAEV,KAAK,SAAA8I,GACzH/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,qBAAsB/B,EAAKO,eAAgBsO,EAASzN,EAASyF,CAAG,EACxFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAAuP,WAAA,SAAWiB,EAAWxO,EAA4BuO,EAAoBzF,EAA2B6H,GAAjG,IAAA/R,EAAAjC,KACC,OADiD,KAAA,IAAA4R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAzF,IAAAA,EAAA,CAAA,GAA2B,KAAA,IAAA6H,IAAAA,EAAA,CAAA,GACzF,IAAI/Q,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACxC,GAAK4P,EAAKlS,OAAV,CAyBA,IApBIsU,EAAoB,GAEpBjU,KAAKkK,aAAe,CAACiC,GACxB0F,EAAKqC,QAAQ,SAAAlH,GACZ,IAAMwG,EAAavR,EAAKwI,YAAYyC,WAAU,EAC9BsG,EAAWpG,SAASJ,CAAG,EAQtCiH,EAAkBpR,KAAK,CAAA,CAAI,GAL3BiB,QAAQC,IAAI,IAAIC,KAAQ/B,EAAKO,eAAgB,6BAA8BgR,EAAW9F,iBAAgB,CAAE,EACxGzO,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAGC,mBAAmBC,KAAK3U,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAI,iBAAkB,iCAAmCzR,EAAKO,eAAgB,CAACgR,EAAW9F,iBAAgB,EAAIV,EAAI,EAC7OiH,EAAkBpR,KAAK,CAAA,CAAK,EAK9B,CAAC,EAGEsR,EAAYnU,KAAKkK,YAAc2H,EAAKzO,OAAO,SAACd,EAAG8R,GAAQ,OAAAH,EAAkBG,EAAlB,CAAsB,EAAIvC,EAE5EC,EAAI,EAAGA,EAAIqC,EAAUxU,OAAQmS,CAAC,IAClC9E,EAAMmH,EAAUrC,IAEXlI,MACRoD,EAAIpD,IAAMkE,kBAAiB,GAGxB9N,KAAKgK,aACJyJ,EAAO,IAAIzP,KAEVgJ,EAAIW,YACRX,EAAIW,UAAY8F,GAGZzG,EAAIY,YACRZ,EAAIY,UAAY6F,IAIdzT,KAAKwJ,aAAe,CAACwD,EAAIqH,eAAe,KAAK,IAChDrH,EAAIwB,IAAM,GAGPxO,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK3J,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK3J,GAAU,KAAM,CAAC,EAAI,UAC5G4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAICmQ,EAAUxU,SACT2U,EAAU,KAETN,IACJM,EAAU,IAAI/U,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACsP,EAAW9Q,EAAQ,CAAC,GAGnGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE0O,WAA0CuD,EAAW9Q,CAAO,EAAEV,KAAK,SAAA8I,GACrJ6I,GACHA,EAAQxP,OAAM,EAEX2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQiR,CAAS,GAGjB5I,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACEwL,GACHA,EAAQxP,OAAM,EAEfhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgB2R,EAAW9Q,EAASyF,CAAG,EACzFyC,EAAOzC,CAAG,CACX,CAAC,E,MAxFD5F,EAAQ,EAAE,E,cA0FX,CACF,EAEAoG,uBAAAjI,UAAAwM,UAAA,SAAUb,EAAQ3J,EAA4BuO,EAAoBzF,GAAlE,IAAAlK,EAAAjC,KACC,OAD6C,KAAA,IAAA4R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAzF,IAAAA,EAAA,CAAA,GAC1D,IAAIlJ,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,4DACnC+K,EAAIpD,MACRoD,EAAIpD,IAAMkE,kBAAiB,GAGxB9N,CAAAA,KAAKkK,aAAgBiC,IAClBqH,EAAaxT,KAAKyK,YAAYyC,WAAU,EAC9BsG,EAAWpG,SAASJ,CAAG,IAUpChN,KAAKgK,aACJyJ,EAAO,IAAIzP,KAEVgJ,EAAIW,YACRX,EAAIW,UAAY8F,GAGZzG,EAAIY,YACRZ,EAAIY,UAAY6F,IAIdzT,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK3J,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK3J,GAAU,KAAM,CAAC,EAAI,UAC5G4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGEhE,KAAKwJ,aAAe,CAACwD,EAAIqH,eAAe,KAAK,IAChDrH,EAAIwB,IAAM,GAGP9J,EAAU,IAAInF,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACmI,EAAK3J,EAAQ,CAAC,EAC/FpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE2L,UAAuCb,EAAK3J,CAAO,EAAEV,KAAK,SAAA8I,GAChJ/G,EAAQI,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQ8J,CAAG,GAGXzB,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBwK,EAAK3J,EAASyF,CAAG,EAClFyC,EAAOzC,CAAG,CACX,CAAC,IArDChF,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,4BAA6BgR,EAAW9F,iBAAgB,CAAE,EACvGzO,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAGC,mBAAmBC,KAAK3U,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAI,iBAAkB,gCAAkC1T,KAAKwC,eAAgB,CAACgR,EAAW9F,iBAAgB,EAAIV,EAAI,EAC5OzB,EAAOiI,EAAW9F,iBAAgB,CAAE,G,QAoDtC,CACF,EAEApE,uBAAAjI,UAAAkT,YAAA,SAAYlR,GACX,IAAIqB,EAAU,IAAInF,kBAAAoF,aAAa,cAAe3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACxB,EAAQ,CAAC,EACxFuI,EAAS3M,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEqS,YAAYlR,CAAO,EAMvH,OALAuI,EAAOlD,GAAG,QAAS,SAAAmD,GAElB,OADAnH,EAAQI,OAAM,EACP+G,CACR,CAAC,EAEMD,CACR,EAEAtC,uBAAAjI,UAAAmT,OAAA,SAAOC,EAAiBpR,GAAxB,IAAApB,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAACC,EAASqI,GAC5B,IAAI7G,EAAU,IAAInF,kBAAAoF,aAAa,SAAU1C,EAAKO,eAAgBoC,KAAKC,UAAU,CAAC4P,EAASpR,EAAQ,CAAC,EAChGpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAcC,EAAKO,eAAgBP,EAAKC,iBAAiB,EAAEsS,OAAOC,EAASpR,CAAO,EAAEV,KAAK,SAAA8I,GACpH/G,EAAQI,OAAM,EACd5B,EAAQuI,CAAG,CACZ,EAAG,SAAA3C,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,eAAgB/B,EAAKO,eAAgBiS,EAASpR,EAASyF,CAAG,EAClFyC,EAAOzC,CAAG,CACX,CAAC,CACF,CAAC,CACF,EAEAQ,uBAAAjI,UAAA0Q,WAAA,SAAW3O,EAAgEkK,EAAgBjK,EAA0BuO,EAAoBzF,EAA2Ba,GAApK,IAAA/K,EAAAjC,KACC,OADoH,KAAA,IAAA4R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAzF,IAAAA,EAAA,CAAA,GAA2B,KAAA,IAAAa,IAAAA,EAAA,MAC5J,IAAI/J,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,4FACxC,MAAIjC,CAAAA,KAAKkK,aAAgBiC,IAClBqH,EAAaxT,KAAKyK,YAAYyC,WAAU,EAC9BsG,EAAWpG,SAASE,CAAW,IAU5CmG,EAAO,IAAIzP,KAEXhE,KAAKgK,aACRsD,EAAYM,UAAY6F,GAGrBzT,KAAKwJ,YACHwD,EAAD,CAAA,EAAA,GACG,CAAA,EAAMhN,KAAKgF,QAAa5B,EAAQ,KAAM,CAAA,CAAI,GAF9C,CAAA,EAAA,KAbFU,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,6BAA8BgR,EAAW9F,iBAAgB,CAAE,EACxGzO,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAGC,mBAAmBC,KAAK3U,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAI,iBAAkB,iCAAmC1T,KAAKwC,eAAgB,CAACgR,EAAW9F,iBAAgB,EAAIJ,EAAY,EACrP/B,EAAOiI,EAAW9F,iBAAgB,CAAE,EACpC,CAAA,I,OAYAV,EAAMqD,EAAAxO,KAAA,E,wBAGHmL,GACChN,KAAKgK,YAAc,CAACsD,EAAYK,WAAaX,EAAIW,YACpDL,EAAYK,UAAYX,EAAIW,WAGzBX,EAAIwB,MAAQlB,EAAYkB,IAAxB,CAAA,EAAA,IACHlB,EAAYkB,KAAO,GAEfF,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyH,WAAgB,CAACnI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAAC0D,OAAQ,CAAA,CAAI,CAAC,EAEtI,GAAXhF,EAAIwB,KACPvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAE0F,WAAgB,CAAC3H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC4H,IAAKjF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,EAGjJxO,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGE0Q,EAAU,IAAInV,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EAChHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE6P,WAAgB3O,EAAQkK,EAAajK,CAAO,EAAEV,KAAK,SAAA8I,GACzIiJ,EAAQ5P,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIkJ,aAAa,GAGzBpJ,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACF4L,EAAQ5P,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQkK,EAAajK,EAASyF,CAAG,EACnGyC,EAAOzC,CAAG,CACX,CAAC,E,QA/CC,CAAA,EAAA,G,OAoDY,OAFdhF,QAAQC,IAAI,qBAAuB/D,KAAKwC,eAAgBwK,EAAIwB,IAAKlB,EAAYkB,GAAG,EAElE,CAAA,EAAMvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEtF,QAAQ,CAChG4E,IAAU,CACTA,IAAKoD,EAAIpD,IACT4E,IAAKlB,EAAYkB,G,GAEhB,KAAM,CAAA,CAAI,G,QALToG,EAAUvE,EAAAxO,KAAA,IAQTgT,EAAQ7H,EAAIpD,IACZkL,EAAa9H,EAAIwB,KACjBuG,GAAgB,EAAA5V,SAAA6V,yBAAwB1H,EAAaN,EAAK4H,CAAO,GAC1DhL,IAAMiL,EACjBE,EAAWvG,IAAMsG,EAAa,EAE1B9U,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAa8G,EACb7G,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,yBAA0BmI,EAAK5J,EAAQ2R,EAAY1R,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,yBAA0BmI,EAAK5J,EAAQ2R,EAAY1R,GAAU,KAAM,CAAC,EAAI,UACxM4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGEiR,EAAU,IAAI1V,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ2R,EAAY1R,EAAQ,CAAC,EAC/GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE6P,WAAgB3O,EAAQ2R,EAAY1R,CAAO,EAAEV,KAAK,SAAA8I,GACxIwJ,EAAQnQ,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIkJ,aAAa,GAGzBpJ,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACFmM,EAAQnQ,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQ2R,EAAY1R,EAASyF,CAAG,EAClGyC,EAAOzC,CAAG,CACX,CAAC,GAGDyC,EAAO,oDAAsDyB,EAAIwB,IAAM,4BAA8BlB,EAAYkB,GAAG,E,oCAI9GnL,GAAWA,EAAQ2O,QACvBhS,KAAKgK,aACRsD,EAAYK,UAAY8F,GAGpBnG,EAAY1D,MAChB0D,EAAY1D,IAAMkE,kBAAiB,GAGpCR,EAAYkB,IAAM,EAEdxO,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaT,EAAY1D,IACzBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,SAAUzB,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,SAAUzB,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UAChK4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGEkR,EAAU,IAAI3V,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EAChHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE6P,WAAgB3O,EAAQkK,EAAajK,CAAO,EAAEV,KAAK,SAAA8I,GACzIyJ,EAAQpQ,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIkJ,aAAa,GAGzBpJ,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACFoM,EAAQpQ,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQkK,EAAajK,EAASyF,CAAG,EACnGyC,EAAOzC,CAAG,CACX,CAAC,GAGDyC,EAAO,aAAa,E,oCAIjBlI,GAAWA,EAAQ2O,SAClBhS,KAAKgK,YAAc,CAACsD,EAAYK,YACnCL,EAAYK,UAAY8F,GAGpBnG,EAAY1D,MAChB0D,EAAY1D,IAAMkE,kBAAiB,GAGpCR,EAAYkB,IAAM,GAGfxO,KAAKiK,YAAc,CAAC2H,GAClBvO,EAIuBA,EAAS8R,eAAiB,SAHrD9R,EAAoC,CAAC8R,eAAgB,QAAQ,EAM1DC,EAAU,IAAI7V,kBAAAoF,aAAa,oBAAqB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EACvHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEqR,kBAAuBnQ,EAAQkK,EAAuCjK,CAAO,EAAEV,KAAK,SAAA8I,GAC1K2J,EAAQtQ,OAAM,EACVkI,EAAMvB,EAAIjE,MAEVwF,EACH/N,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAqBf,EAAIpD,IACzBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGD/E,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAaT,EAAY1D,IACzBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,SAAUzB,EAAQkK,EAAajK,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,SAAUzB,EAAQkK,EAAajK,GAAU,KAAM,CAAC,EAAI,UAChK4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGF/E,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQ,CAAC,CACV,EAAG,SAAA4F,GACFsM,EAAQtQ,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,6BAA8B/B,EAAKO,eAAgBY,EAAQkK,EAAajK,EAASyF,CAAG,EAC5GyC,EAAOzC,CAAG,CACX,CAAC,IAGGuM,EAAU,IAAI9V,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQkK,EAAajK,EAAQ,CAAC,EAChHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE6P,WAAgB3O,EAAQkK,EAAajK,CAAO,EAAEV,KAAK,SAAA8I,GACzI4J,EAAQvQ,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIkJ,aAAa,GAGzBpJ,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACFuM,EAAQvQ,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQkK,EAAajK,EAASyF,CAAG,EACnGyC,EAAOzC,CAAG,CACX,CAAC,G,gCAGH,CACF,EAEAQ,uBAAAjI,UAAAiU,WAAA,SAAWlS,EAAgE6C,EAAqC5C,EAAyBuO,EAAoBzF,EAA2BoJ,GAAxL,IAAAtT,EAAAjC,KACC,OADwI,KAAA,IAAA4R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAzF,IAAAA,EAAA,CAAA,GAA2B,KAAA,IAAAoJ,IAAAA,EAAA,CAAA,GAChL,IAAItS,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,kFACxC,OAAMgE,EAAOyI,MAAwC,OAAhC9J,KAAKC,UAAUoB,EAAOyI,IAAI,GAAiBzI,EAAOwI,MAAwC,OAAhC7J,KAAKC,UAAUoB,EAAOwI,IAAI,GAAiBxI,EAAO6N,cAAwD,OAAxClP,KAAKC,UAAUoB,EAAO6N,YAAY,GAAiB7N,EAAOuP,QAA4C,OAAlC5Q,KAAKC,UAAUoB,EAAOuP,MAAM,GAK7OxV,KAAKgK,aACJyJ,EAAO,IAAIzP,KAEViC,EAAOwI,KAIXxI,EAAOwI,KAAKb,UAAY6F,EAHxBxN,EAAOwI,KAAY,CAACb,UAAW6F,CAAI,GAOjCzT,CAAAA,KAAKkK,aAAgBiC,IAClBqH,EAAaxT,KAAKyK,YAAYyC,WAAU,EAC9BsG,EAAWpG,SAASnH,EAAQ,CAACsH,SAAU,CAAA,CAAI,CAAC,GAUxDvN,KAAKwJ,aAAe,CAAC+L,GAAoBvV,KAAKiK,YAAc,CAAC2H,EACtD,CAAA,EAAM5R,KAAK8C,KAAKM,CAAM,GAD9B,CAAA,EAAA,IAPFU,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,6BAA8BgR,EAAW9F,iBAAgB,CAAE,EACxGzO,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAGC,mBAAmBC,KAAK3U,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAI,iBAAkB,iCAAmC1T,KAAKwC,eAAgB,CAACgR,EAAW9F,iBAAgB,EAAIzH,EAAO,EAChPsF,EAAOiI,EAAW9F,iBAAgB,CAAE,EACpC,CAAA,MAvBDxK,EAAQ,CAAC,EACT,CAAA,I,OA6BA,IAFI2O,EAAOxB,EAAAxO,KAAA,EAEFiQ,EAAI,EAAGA,EAAID,EAAKlS,OAAQmS,CAAC,GAC7B9E,EAAM6E,EAAKC,GAEX9R,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UAC5I4K,OAAQ,aACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGEhE,KAAKwJ,eACJ8E,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyH,WAAgB,CAACnI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAAC0D,OAAQ,CAAA,CAAI,CAAC,EAEtI,GAAXhF,EAAIwB,KACPvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAE0F,WAAgB,CAAC3H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC4H,IAAKjF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,EAGhJiH,2BAA2BxP,EAAQ,KAAK,IACvCA,EAAOyI,KAGFzI,EAAOyI,KAAKF,MACrBvI,EAAOyI,KAAKF,IAAM,GAHlBvI,EAAOyI,KAAO,CAACF,IAAK,CAAC,I,wBAUtB9J,EAAU,IAAInF,kBAAAoF,aAAa,aAAc3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAC3GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEoT,WAAgBlS,EAAQ6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GACjI/G,EAAQI,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIkJ,aAAa,GAGzBpJ,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACFpE,EAAQI,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,oBAAqB/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EAC9FyC,EAAOzC,CAAG,CACX,CAAC,E,SACD,CACF,EAEAQ,uBAAAjI,UAAAqU,UAAA,SAAUtS,EAAgE6C,EAAqC5C,EAAyBuO,EAAoBzF,GAA5J,IAAAlK,EAAAjC,KACC,OADuI,KAAA,IAAA4R,IAAAA,EAAA,CAAA,GAAoB,KAAA,IAAAzF,IAAAA,EAAA,CAAA,GACpJ,IAAIlJ,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,kFACxC,MAAIjC,CAAAA,KAAKkK,aAAgBiC,IAClBqH,EAAaxT,KAAKyK,YAAYyC,WAAU,EAC9BsG,EAAWpG,SAASnH,EAAQ,CAACsH,SAAU,CAAA,CAAI,CAAC,GAUvDtH,EAAOyI,MAAwC,OAAhC9J,KAAKC,UAAUoB,EAAOyI,IAAI,GAAiBzI,EAAOwI,MAAwC,OAAhC7J,KAAKC,UAAUoB,EAAOwI,IAAI,GAAiBxI,EAAO6N,cAAwD,OAAxClP,KAAKC,UAAUoB,EAAO6N,YAAY,GAAiB7N,EAAOuP,QAA4C,OAAlC5Q,KAAKC,UAAUoB,EAAOuP,MAAM,GAK7O/B,EAAO,IAAIzP,KAEXhE,KAAKgK,aACH/D,EAAOwI,KAIXxI,EAAOwI,KAAKb,UAAY6F,EAHxBxN,EAAOwI,KAAY,CAACb,UAAW6F,CAAI,GAOjCzT,KAAKwJ,YACE,CAAA,EAAMxJ,KAAKgF,QAAQ5B,EAAQ,KAAM,CAAA,CAAI,GAD5C,CAAA,EAAA,KAfHF,EAAQ,CAAC,EACT,CAAA,KATCY,QAAQC,IAAI,IAAIC,KAAQhE,KAAKwC,eAAgB,4BAA6BgR,EAAW9F,iBAAgB,CAAE,EACvGzO,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAGC,mBAAmBC,KAAK3U,QAAAsC,gBAAgBoC,cAAa,EAAG+P,iBAAgB,EAAI,iBAAkB,gCAAkC1T,KAAKwC,eAAgB,CAACgR,EAAW9F,iBAAgB,EAAIzH,EAAO,EAC/OsF,EAAOiI,EAAW9F,iBAAgB,CAAE,EACpC,CAAA,I,cAqBGV,EAAMqD,EAAAxO,KAAA,IAGL7B,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAaf,EAAIpD,IACjBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UAC5I4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,GAGEsK,GAAa,EAAAnP,SAAAuK,UAASsD,CAAG,GAClBpD,IAAM,CAACA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,EAE5CvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAEyH,WAAgB,CAACnI,IAAK,CAAEA,IAAKoD,EAAIpD,IAAK4E,IAAKxB,EAAIwB,GAAG,CAAC,EAAGF,EAAY,CAAC0D,OAAQ,CAAA,CAAI,CAAC,EAEtI,GAAXhF,EAAIwB,KACPvP,QAAAsC,gBAAgByJ,gBAAe,EAAGhJ,WAAWhC,KAAKsK,iBAAiB,EAAE0F,WAAgB,CAAC3H,KAAM,CAAC,CAAC+B,UAAW4C,EAAIpD,GAAG,EAAG,CAACS,UAAW,CAAC4H,IAAKjF,EAAIwB,IAAM,CAAC,CAAC,EAAE,CAAC,EAGhJiH,2BAA2BxP,EAAQ,KAAK,IACvCA,EAAOyI,KAGFzI,EAAOyI,KAAKF,MACrBvI,EAAOyI,KAAKF,IAAM,GAHlBvI,EAAOyI,KAAO,CAACF,IAAK,CAAC,GAOnBmH,EAAU,IAAIpW,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAC1GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEwT,UAAetS,EAAQ6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GAChIkK,EAAQ7Q,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIkJ,aAAa,GAGzBpJ,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACF6M,EAAQ7Q,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EAC7FyC,EAAOzC,CAAG,CACX,CAAC,GAEOzF,GAAWA,EAAQ2O,QACtB/L,EAAO6N,cAgBN7N,EAAO6N,aAAalK,MACxB3D,EAAO6N,aAAalK,IAAMkE,kBAAiB,GAGxC9N,KAAKgK,YAAc,CAAC/D,EAAO6N,aAAanG,YAC3C1H,EAAO6N,aAAanG,UAAY,IAAI3J,OApBjChE,KAAKgK,WACR/D,EAAO6N,aAAoB,CAC1BlK,IAAKkE,kBAAiB,EACtBU,IAAK,EACLb,UAAW,IAAI3J,I,EAIhBiC,EAAO6N,aAAoB,CAC1BlK,IAAKkE,kBAAiB,EACtBU,IAAK,C,EAcJxO,KAAKiK,YAAc,CAAC2H,GACvB3S,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYhC,KAAKwC,eACjBuL,YAAa9H,EAAO6N,aAAalK,IACjCoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,SAAUzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,SAAUzB,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAGE4R,EAAU,IAAIrW,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAC1GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEwT,UAAetS,EAAQ6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GAChImK,EAAQ9Q,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIkJ,aAAa,GAGzBpJ,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACF8M,EAAQ9Q,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EAC7FyC,EAAOzC,CAAG,CACX,CAAC,GAGDyC,EAAO,aAAa,E,aAIjBlI,GAAWA,EAAQ2O,SACjB/L,EAAO6N,cAcN7N,EAAO6N,aAAalK,MACxB3D,EAAO6N,aAAalK,IAAMkE,kBAAiB,GAGxC9N,KAAKgK,YAAc,CAAC/D,EAAO6N,aAAanG,YAC3C1H,EAAO6N,aAAanG,UAAY,IAAI3J,OAlBjChE,KAAKgK,WACR/D,EAAO6N,aAAoB,CAC1BlK,IAAKkE,kBAAiB,EACtBH,UAAW,IAAI3J,I,EAIhBiC,EAAO6N,aAAoB,CAC1BlK,IAAKkE,kBAAiB,C,GAetB9N,KAAKiK,YAAc,CAAC2H,GAClBvO,EAIsBA,EAAS8R,eAAiB,SAHpD9R,EAAmC,CAAC8R,eAAgB,QAAQ,EAMzDU,EAAU,IAAItW,kBAAAoF,aAAa,mBAAoB3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EACjHpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAE2R,iBAAsBzQ,EAAQ6C,EAAiC5C,CAAO,EAAEV,KAAK,SAAA8I,GAChKoK,EAAQ/Q,OAAM,EACd,IAAIkI,EAAMvB,EAAIjE,MAEVwF,GACH/N,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAkBf,EAAIpD,IACtBoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAACmI,EAAK5J,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UAC5I4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAEDd,EAAQuI,EAAI0E,EAAE,GAENlK,EAAO6N,cACf7U,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAW,MAAM,EAAE6L,UAAe,CAC7DjE,IAAKkE,kBAAiB,EACtBrL,KAAM,WACNT,WAAYC,EAAKO,eACjBuL,YAAa9H,EAAO6N,aAAalK,IACjCoE,SAAS,EAAA7O,SAAAsH,eAAc7B,KAAKC,UAAU,CAAC,SAAUzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAAI,IAASuB,KAAKC,UAAU,CAAC,SAAUzB,EAAQ6C,EAAQ5C,GAAU,KAAM,CAAC,EAAI,UACtJ4K,OAAQ,YACRC,QAAS,GACTC,KAAM,GACNC,UAAW,EACXC,MAAO,GACPV,UAAW,IAAI3J,I,CACf,EAED/E,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAE1EU,EAAQuI,EAAI0E,EAAE,GAGdjN,EAAQ,CAAC,CAEX,EAAG,SAAA4F,GACF+M,EAAQ/Q,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,4BAA6B/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EACtGyC,EAAOzC,CAAG,CACX,CAAC,IAGGgN,EAAU,IAAIvW,kBAAAoF,aAAa,YAAa3E,KAAKwC,eAAgBoC,KAAKC,UAAU,CAACzB,EAAQ6C,EAAQ5C,EAAQ,CAAC,EAC1GpE,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWhC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEwT,UAAetS,EAAQ6C,EAAQ5C,CAAO,EAAEV,KAAK,SAAA8I,GAChIqK,EAAQhR,OAAM,EACV2G,EAAIyG,cACPjT,QAAAsC,gBAAgByJ,gBAAe,EAAGvD,qBAAqBxF,EAAKO,cAAc,EAC1EU,EAAQuI,EAAIkJ,aAAa,GAGzBpJ,EAAOE,EAAIyG,YAAY,CAEzB,EAAG,SAAApJ,GACFgN,EAAQhR,OAAM,EACdhB,QAAQC,IAAI,IAAIC,KAAQ,mBAAoB/B,EAAKO,eAAgBY,EAAQ6C,EAAQ5C,EAASyF,CAAG,EAC7FyC,EAAOzC,CAAG,CACX,CAAC,G,gCAGH,CACF,EAEAQ,uBAAAjI,UAAA0U,gBAAA,SAAgB5Q,EAAe9B,GAE9B,OAFe,KAAA,IAAA8B,IAAAA,EAAA,IACFlG,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAchC,KAAKwC,eAAgBxC,KAAKkC,iBAAiB,EAAEiG,MAAMhD,EAAU9B,CAAO,CAE5H,G,0BA31De4N,WAAapR,QAAA+K,QAAMoL,MAAM,SAAOC,EAAMC,GAAQ,OAAAtN,UAAA,KAAA,EAAA,KAAA,EAAA,KAAA,EAAA,W,8EAI5D,GAHQsI,EAAuC+E,EAAI/E,OAAnClP,EAA+BiU,EAAIjU,WAAvBmP,EAAmB8E,EAAI9E,MAAhB9N,EAAY4S,EAAI5S,QAG/C,EAFE8S,EAAelX,QAAAsC,gBAAgBC,UAAS,EAAGQ,WAAWA,EAAWQ,eAAgBR,EAAWE,iBAAiB,GAGlH,MAAA,CAAA,EAAOgU,EAAS,IAAI1I,MAAM,cAAAC,OAAczL,EAAWQ,eAAc,YAAA,CAAY,CAAC,GAG3EkC,EAAU,IAAInF,kBAAAoF,aAAauM,EAAQlP,EAAWQ,eAAgBoC,KAAKC,UAAU,CAACsM,EAAO9N,EAAQ,CAAC,E,iBAIlF,O,uBAAA,CAAA,EAAM8S,EAAajF,GAAOkF,MAApBD,EAAY/Q,cAAAA,cAAA,GAAAC,OAAY8L,CAAK,EAAA,CAAA,CAAA,EAAA,CAAE9N,GAAO,CAAA,CAAA,CAAA,G,cAArDI,EAAS4M,EAAAxO,KAAA,EACf6C,EAAQI,OAAM,EACdoR,EAAS,KAAMzS,CAAM,E,iBAGJ,M,YAAT4S,MAAeC,CAAAA,EAAIC,QAAQ7P,SAAS,sBAAsB,EAA9D,MAAA,CAAA,EAAA,G,8CAEI8P,EAAoBxU,EAAWkJ,0BAA0BoL,EAAIC,OAAO,GAEzE,CAAA,EAAMJ,EAAaxD,UAAU6D,CAAiB,GAD3C,CAAA,EAAA,G,OAEY,OADfnG,EAAAxO,KAAA,EACe,CAAA,EAAMsU,EAAajF,GAAOkF,MAApBD,EAAY/Q,cAAAA,cAAA,GAAAC,OAAY8L,CAAK,EAAA,CAAA,CAAA,EAAA,CAAE9N,GAAO,CAAA,CAAA,CAAA,G,OAG3D,OAHMI,EAAS4M,EAAAxO,KAAA,EACf6C,EAAQI,OAAM,EACdoR,EAAS,KAAMzS,CAAM,EACrB,CAAA,G,4CAGDyS,EAASO,CAAU,E,oBAGrB/R,EAAQI,OAAM,EACdoR,EAASI,CAAG,E,+BAEX,CAAC,EA0zDLhN,sB,EAAC,GAEDD,2BAAA,SAAAqN,GAAA,SAAArN,6B,8CAyKA,CAAA,OAzK8EsN,UAAAtN,2BAAAqN,CAAA,EAC7ErN,2BAAAhI,UAAAuV,aAAA,SAAazI,EAAiB0I,GAA9B,IAAA5U,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,+EAClC6U,EAAmBC,KAAKC,IAAI,IAAKD,KAAKhT,IAAIoK,EAAK8I,SAAW,CAAC,CAAC,EAC5DC,EAAqBJ,EAAmB,IAASA,EAAmB,IAEtE3I,EAAKgJ,MACJnT,KAAKoT,IAAG,EAAKjJ,EAAKgJ,KAAKE,QAAO,EAAKH,GACtC/I,EAAKgJ,KAAO,IAAInT,KAChB,CAAA,EAAM9E,kBAAAoY,MAAM5B,UAAU,CAAC9L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAAC0I,KAAMhJ,EAAKgJ,IAAI,CAAC,CAAC,IAF7D,CAAA,EAAA,GADD,CAAA,EAAA,G,OASF,OANA9G,EAAAxO,KAAA,EACAqB,EAAQ,CACPsD,KAAM,KACNF,MAAO,kB,CACP,EAED,CAAA,G,0BAID6H,EAAKgJ,KAAO,IAAInT,K,wBAGI,GAAjBmK,EAAK8I,SACR/T,EAAQ,CACPsD,KAAM,KACNF,MAAO,mB,CACP,EAKG6H,EAAKoJ,KASVC,OAAOX,EAAU1I,EAAKoJ,KAAM,CAC3BE,WAAY,KACZC,OAAQ,IACRC,gBAAiB,Q,EACf,SAAO7O,EAAK8O,GAAU,OAAAhP,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DACxB,OAAI6G,EACH,CAAA,EAAOyC,EAAOzC,CAAG,GAGdxJ,KAAKsY,EAAYC,OAAOpS,KAAK0I,EAAK2J,KAAM,KAAK,CAAC,GACjD3J,EAAKgJ,KAAO,IAAInT,KAChBmK,EAAK8I,SAAW,EAChB,CAAA,EAAM/X,kBAAAoY,MAAM5B,UAAU,CAAC9L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAAC0I,KAAMhJ,EAAKgJ,KAAMF,SAAU9I,EAAK8I,QAAQ,CAAC,CAAC,IAHtF,CAAA,EAAA,G,cAGH5G,EAAAxO,KAAA,EAEAqB,EAAQ,CACPsD,KAAM2H,EACN7H,MAAO,E,CACP,E,aAKD,OAFA6H,EAAKgJ,KAAO,IAAInT,KAChBmK,EAAK8I,SAAW9I,EAAK8I,SAAW,EAChC,CAAA,EAAM/X,kBAAAoY,MAAM5B,UAAU,CAAC9L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAAC0I,KAAMhJ,EAAKgJ,KAAMF,SAAU9I,EAAK8I,QAAQ,CAAC,CAAC,G,OAAzF5G,EAAAxO,KAAA,EAEqB,GAAjBsM,EAAK8I,SACR/T,EAAQ,CACPsD,KAAM,KACNF,MAAO,mB,CACP,EAGDpD,EAAQ,CACPsD,KAAM,KACNF,MAAO,+B,CACP,E,gCAGH,EA7CApD,EAAQ,CACPsD,KAAM,KACNF,MAAO,sB,CACP,E,SA2CF,CACF,EAEA+C,2BAAAhI,UAAA0W,cAAA,WACC,OAAO,SAAC5J,EAAM6J,GACbA,EAAG,KAAM7J,EAAK8J,QAAQ,CACvB,CACD,EAEA5O,2BAAAhI,UAAA6W,gBAAA,WACC,OAAO,SAACD,EAAUD,GACjB9Y,kBAAAoY,MAAMtS,QAAQ,CAACiT,SAAUA,CAAQ,CAAC,EAAEtV,KAAK,SAAA8I,GACxCuM,EAAG,KAAMvM,CAAG,CACb,EAAG,SAAA3C,GACFkP,EAAGlP,EAAK,IAAI,CACb,CAAC,CACF,CACD,EAEAO,2BAAAhI,UAAA8W,YAAA,SAAYhK,EAAiB0I,GAA7B,IAAA5U,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,0EACnCkM,EAAD,CAAA,EAAA,IACH5C,EAAO,SAAS,E,qBAEPsL,EAAD,CAAA,EAAA,IACRtL,EAAO,aAAa,E,cAGH,MAAA,CAAA,EAAM6M,YAAY,EAAE,G,OAEvB,OAFVC,EAAahI,EAAAxO,KAAA,EACb0V,EAAOc,EAAWC,SAAS,KAAK,EACtB,CAAA,EAAMC,kBAAkB1B,EAAUU,EAAM,CACrDE,WAAY,KACZC,OAAQ,IACRC,gBAAiB,Q,CACjB,G,OAJGa,EAAUnI,EAAAxO,KAAA,EAKViW,EAAOD,OAAOpS,KAAK+S,EAAS,QAAQ,EAAEF,SAAS,KAAK,EACxDpZ,kBAAAoY,MAAM5B,UAAU,CAAC9L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAACqJ,KAAMA,EAAMP,KAAMA,EAAMkB,SAAU,GAAIxB,SAAU,CAAC,CAAC,CAAC,EAAEtU,KAAK,SAAA8I,GAAO,OAAAvI,EAAQuI,CAAG,CAAX,EAAc,SAAAiN,GAAO,OAAAnN,EAAOmN,CAAG,CAAV,CAAW,E,gCAE3I,CACF,EAEArP,2BAAAhI,UAAAsX,eAAA,SAAexK,EAAMyK,EAAaC,GAAlC,IAAA5W,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,wEACnCkM,EAAD,CAAA,EAAA,IACH5C,EAAO,cAAc,E,qBAEZqN,GAAgBC,EAAjB,CAAA,EAAA,IACRtN,EAAO,kBAAkB,E,cAGV,MAAA,CAAA,EAAMvL,KAAK4W,aAAazI,EAAMyK,CAAW,G,QAApDE,EAAWzI,EAAAxO,KAAA,GAEK,KAInB7B,KAAKmY,YAAYhK,EAAM0K,CAAW,EAAElW,KAAK,SAAA8I,GAAO,OAAAvI,EAAQuI,CAAG,CAAX,EAAc,SAAAiN,GAAO,OAAAnN,EAAOmN,CAAG,CAAV,CAAW,EAHhFnN,EAAOuN,EAAgB,KAAC,E,gCAM1B,CACF,EAEAzP,2BAAAhI,UAAA0X,SAAA,SAAS5K,EAAM0I,GAAf,IAAA5U,EAAAjC,KACC,OAAO,IAAIiD,QAAQ,SAAOC,EAASqI,GAAM,OAAA3C,UAAA3G,EAAA,KAAA,EAAA,KAAA,EAAA,W,kEACnCkM,EAAK8J,SAAN,CAAA,EAAA,IACH1M,EAAO,kBAAkB,E,cAGZ,MAAA,CAAA,EAAMrM,kBAAAoY,MAAMtS,QAAQ,CAACiT,SAAU9J,EAAK8J,QAAQ,CAAC,G,cAA7C5H,EAAAxO,KAAA,GAGZ0J,EAAO,iBAAiB,E,OADrB,CAAA,EAAA,G,OAIM,MAAA,CAAA,EAAMrM,kBAAAoY,MAAMtS,QAAQ,CAACgU,MAAO7K,EAAK6K,KAAK,CAAC,G,OAAvC3I,EAAAxO,KAAA,EAGR0J,EAAO,cAAc,GAGrB4C,EAAKgK,YAAYtB,CAAQ,EACzB3T,EAAQiL,CAAI,G,gCAIf,CACF,EAEA9E,2BAAAhI,UAAA4X,cAAA,SAAc9K,GACb,OAAOjP,kBAAAoY,MAAM5B,UAAU,CAAC9L,IAAKuE,EAAKvE,GAAG,EAAG,CAAC6E,KAAM,CAACwI,SAAU,CAAC,CAAC,CAAC,CAC9D,EACD5N,0BAAA,EA1iEaJ,QAAAK,uBAAAA,sBAi4DuF,EA2KpG,SAAgBwE,oBAEf,OADe,IAAI9O,UAAAka,UACHC,YAAW,CAC5B,CAEA,SAAS3B,OAAOX,EAAUU,EAAMlU,EAAS6S,GACxC7W,OAAOmY,OAAOX,EAAUU,EAAMlU,EAAQoU,WAAYpU,EAAQqU,OAAQrU,EAAQsU,gBAAiBzB,CAAQ,CACpG,CAEA,SAASqC,kBAAkB1B,EAAUU,EAAMlU,GAC1C,OAAO,IAAIJ,QAAQ,SAACC,EAASqI,GAAW,OAAAiM,OAAOX,EAAUU,EAAMlU,EAAS,SAACyF,EAAK0P,GAAY,OAAC1P,EAAMyC,EAAOzC,CAAG,EAAI5F,EAAQsV,CAAO,CAApC,CAAsC,CAAxF,CAAyF,CAClI,CAEA,SAASJ,YAAYgB,GACpB,OAAO,IAAInW,QAAQ,SAACC,EAASqI,GAAW,OAAAlM,OAAO+Y,YAAYgB,EAAS,SAACtQ,EAAKuP,GAAe,OAACvP,EAAMyC,EAAOzC,CAAG,EAAI5F,EAAQmV,CAAU,CAAvC,CAAyC,CAA1F,CAA2F,CACpI,CAEA,SAAS5C,2BAA2B4D,EAAaC,GAChD,IAAIrS,EAAO8F,OAAO9F,KAAKoS,CAAG,EAE1B,GAAIpS,EAAK5E,KAAK,SAAAC,GAAK,OAAAA,IAAMgX,CAAN,CAAU,EAC5B,MAAO,CAAA,EAGR,IAAK,IAAIxH,EAAI,EAAGA,EAAI7K,EAAKtH,OAAQmS,CAAC,GAAI,CACrC,IAAIvK,EAAMN,EAAK6K,GACf,GAAIuH,EAAI9R,IAA4B,UAApB,OAAO8R,EAAI9R,IAAqBkO,2BAA2B4D,EAAI9R,GAAM+R,CAAI,EACxF,MAAO,CAAA,C,CAIT,MAAO,CAAA,CACR,CA3MarQ,QAAAI,2BAAAA,2BA2KbJ,QAAA6E,kBAAAA","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions, ChangeStreamDocument } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n\t$gt?: P;\n\t$gte?: P;\n\t$in?: P extends Array<any> ? P : P[];\n\t$lt?: P;\n\t$lte?: P;\n\t$ne?: P;\n\t$nin?: P extends Array<any> ? P : P[];\n\t$not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n\t$exists?: boolean;\n\t$expr?: any[]\n\t$regex?: P extends string ? RegExpConstructor | string : never;\n\t$options?: P extends string ? string : never;\n\t$geoIntersects?: {\n\t\t$geometry: Document;\n\t};\n\t$geoWithin?: Document;\n\t$near?: Document;\n\t$nearSphere?: Document;\n\t$maxDistance?: number;\n\t$all?: any[];\n\t$elemMatch?: Document;\n\t$size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n\t$and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n\t$text?: {\n\t\t$search: string;\n\t\t$language?: string;\n\t\t$caseSensitive?: boolean;\n\t\t$diacriticSensitive?: boolean;\n\t};\n\t$where?: string | ((this: T) => boolean);\n\t$comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n\t$inc?: MongoManagerIncFilter<T> | Document;\n\t$set?: MongoManagerFilter<T> | Document;\n\t$setOnInsert?: MongoManagerFilter<T> | Document;\n\t$unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap: { collections: string[], key: string }[] = [];\n\tprivate _operationInProgress: Map<string, { promise: Promise<any>, invalidatedDuringExecution: boolean, collections: string[] }> = new Map();\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\t\tthis.setCacheLimit();\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tthis._heapLimit = this._isWorkerInstance ? this._heapSize * 0.8 : this._heapSize * 0.4;\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Cache', collectionName);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Already running', collectionName);\n\t\t\t}\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Find - Running', collectionName);\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Find - Done', collectionName);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFind<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// FindOne Operation\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Cache', collectionName);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Already running', collectionName);\n\t\t\t}\n\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo FindOne - Running', collectionName);\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo FindOne - Done', collectionName);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFindOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.findOne(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Aggregate Operation\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\tconst collections = [collectionName, ...pipeline.flatMap(stage => stage.$lookup?.from ? [stage.$lookup.from] : [])];\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Cache', collections);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Already running', collections);\n\t\t\t}\n\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Agg - Running', collections);\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: collections\n\t\t});\n\n\t\toperation.finally(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Agg - Done', collections);\n\t\t\t}\n\n\t\t\tthis._operationInProgress.delete(cacheKey);\n\t\t});\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeAggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions: AggregateOptions | undefined,\n\t\tcacheKey: string,\n\t\tcollections: string[]\n\t): Promise<any[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\tmonitor.finish();\n\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\tpublic async countDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions\n\t): Promise<number> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeCountDocuments<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { \n\t\t\tpromise: operation, \n\t\t\tinvalidatedDuringExecution: false,\n\t\t\tcollections: [collectionName]\n\t\t});\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeCountDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: CountDocumentsOptions,\n\t\tcacheKey: string\n\t): Promise<number> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.countDocuments(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Cache and Invalidation Setup\n\tprivate generateCacheKey(collections: string[], functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collections, functionName, args });\n\t\treturn crypto.createHash('sha256').update(keyString).digest('hex');\n\t}\n\n\tprivate getFromCache(cacheKey: string): any | undefined {\n\t\ttry {\n\t\t\tconst cachedData = this._nodeCache.get(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\treturn JSON.parse(cachedData, dateReviver);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: string[], cacheKey: string, data: any) {\n\t\tif (getBinarySize(JSON.stringify(data)) < 1000000 && \n\t\t\t!collections.includes('logs') &&\n\t\t\t!collections.includes('log-method-latencies') &&\n\t\t\t!collections.includes('log-subscriptions') &&\n\t\t\t!collections.find(a => a.endsWith('.versions')) &&\n\t\t\t!collections.find(a => a.startsWith('monitor-'))\n\t\t) {\n\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\tlet deleteCount = 0;\n\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t}\n\t\t\t\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t\tthis._cacheMap.push({ collections, key: cacheKey });\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst collectionCacheMap = this._cacheMap.filter(a => a.collections.includes(collection));\n\n\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Mongo Invalidate Cache', collection);\n\t\t}\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t\t\n\t\t\tif (this._operationInProgress.has(cacheMap.key)) {\n\t\t\t\tthis._operationInProgress.get(cacheMap.key).invalidatedDuringExecution = true;\n\n\t\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Mongo Invalidated During Execution', cacheMap.collections);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [key, operation] of this._operationInProgress.entries()) {\n\t\t\tif (operation.collections.includes(collection)) {\n\t\t\t\toperation.invalidatedDuringExecution = true;\n\t\t\n\t\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'Mongo Invalidated During Execution (No cache)', operation.collections);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMainDB();\n\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$and: [\n\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst changeStream = db.watch(pipeline, { fullDocument: 'updateLookup' });\n\n\t\tchangeStream.on('change', async (change: any) => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\t\t\t\tconst collection = this.collection(collectionName);\n\n\t\t\t\tif (collection) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\n\t\t\t\t\t// if ((!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') && process.env.WORKER_INDEX === '0') {\n\t\t\t\t\t// \tconst { operationType, fullDocument, documentKey, updateDescription } = change;\n\t\t\t\t\t// \tconst docId = documentKey._id;\n\n\t\t\t\t\t// \tlet oldDocument = null;\n\n\t\t\t\t\t// \t// For updates and deletes, you might need to fetch the old document if not provided\n\t\t\t\t\t// \tif (operationType === 'update' || operationType === 'replace' || operationType === 'delete') {\n\t\t\t\t\t// \t\t// Assuming the old document can be obtained via changeStream\n\t\t\t\t\t// \t\toldDocument = change.fullDocumentBeforeChange || await collection.findOne({ _id: docId });\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \t// Handle Versioning\n\t\t\t\t\t// \tif (collection.useVersions && oldDocument) {\n\t\t\t\t\t// \t\tawait db.collection('yourCollection_versions').insertOne({\n\t\t\t\t\t// \t\t\t...oldDocument,\n\t\t\t\t\t// \t\t\t_id: { _id: oldDocument._id, __v: oldDocument.__v },\n\t\t\t\t\t// \t\t});\n\n\t\t\t\t\t// \t\t// Optionally, delete old versions (keep only the latest N versions)\n\t\t\t\t\t// \t\tconst versionsToKeep = 5;\n\t\t\t\t\t// \t\tawait db.collection('yourCollection_versions').deleteMany({\n\t\t\t\t\t// \t\t\t'_id._id': oldDocument._id,\n\t\t\t\t\t// \t\t\t'_id.__v': { $lt: oldDocument.__v - versionsToKeep + 1 },\n\t\t\t\t\t// \t\t});\n\t\t\t\t\t// \t}\n\n\t\t\t\t\t// \t// Handle Logging\n\t\t\t\t\t// \tif (this.createLogs) {\n\t\t\t\t\t// \tawait db.collection('logs').insertOne({\n\t\t\t\t\t// \t\t_id: objectIdHexString(),\n\t\t\t\t\t// \t\ttype: 'document',\n\t\t\t\t\t// \t\tcollection: 'yourCollection',\n\t\t\t\t\t// \t\tid_document: docId,\n\t\t\t\t\t// \t\toldDocument,\n\t\t\t\t\t// \t\tnewDocument: fullDocument,\n\t\t\t\t\t// \t\tmethod: operationType,\n\t\t\t\t\t// \t\tcreatedAt: new Date(),\n\t\t\t\t\t// \t\t// Include any additional information like user, messageId, route, etc.\n\t\t\t\t\t// \t});\n\n\t\t\t\t\t// \tchangeStream.on('error', (error) => {\n\t\t\t\t\t// \t\tconsole.error('Error in Change Stream:', error);\n\t\t\t\t\t// \t\t// Handle error, possibly restarting the stream\n\t\t\t\t\t// \t});\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000);\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n\t\tconst { action, collection, specs, options } = task;\n\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n\t\n\t\tif (!dbCollection) {\n\t\t\treturn callback(new Error(`Collection ${collection.collectionName} not found`));\n\t\t}\n\t\n\t\tlet monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\t\n\t\ttry {\n\t\t\t// Try creating the index, will auto-skip if already checked in createIndex/createIndexes\n\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\tmonitor.finish();\n\t\t\tcallback(null, result);\n\t\t} catch (err) {\n\t\t\t// Handle any specific errors related to index creation\n\t\t\tif (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingIndexName = collection.extractIndexNameFromError(err.message);\n\t\t\t\t\tif (existingIndexName) {\n\t\t\t\t\t\tawait dbCollection.dropIndex(existingIndexName);\n\t\t\t\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (innerError) {\n\t\t\t\t\tcallback(innerError);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonitor.finish();\n\t\t\tcallback(err);\n\t\t}\n\t}, 1);\n\n\t// Method to extract index name from error message\n\textractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\n\t\tbypassCheckSchema = false\n\t): Promise<BulkWriteResult> {\n\t\tif (!operations.length) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tconst BATCH_SIZE = 1000;\n\t\tlet opIndex = 0;\n\t\n\t\twhile (opIndex < operations.length) {\n\t\t\tconst batchOps = operations.slice(opIndex, opIndex + BATCH_SIZE);\n\t\n\t\t\t// Initialize arrays for logs and version operations\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = [];\n\t\n\t\t\tfor (const op of batchOps) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tconst doc = op[opType];\n\t\n\t\t\t\t// Skip validation if bypassCheckSchema is true\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validationContext = this.simplschema.newContext();\n\t\t\t\t\tlet isValid: boolean;\n\t\n\t\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t\tisValid = validationContext.validate(doc.document);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t\tisValid = validationContext.validate(doc.replacement);\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t\t// For updates, validate the update modifier\n\t\t\t\t\t\tisValid = validationContext.validate(doc.update, { modifier: true });\n\t\t\t\t\t}\n\t\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t\t// No validation needed for deletes\n\t\t\t\t\t\tisValid = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for ${opType}: ${JSON.stringify(validationContext.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Now proceed to process the operations\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// If this.timestamps is true, set createdAt and updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.document.createdAt = new Date();\n\t\t\t\t\t\tdoc.document.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id || objectIdHexString(),\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.document)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.document, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare version document\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tconst versionDoc = {\n\t\t\t\t\t\t\t...doc.document,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t_id: { _id: doc.document._id || objectIdHexString(), __v: 0 },\n\t\t\t\t\t\t};\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: versionDoc,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Since we might have modified doc.document, update the operation\n\t\t\t\t\top[opType].document = doc.document;\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateOne' || opType === 'updateMany') {\n\t\t\t\t\t// If this.timestamps is true, add updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (!doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If this.useVersions is true, increment __v\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\tdoc.update.$inc = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.update)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.update, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// No need to modify the operation further\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t// If this.timestamps is true, set updatedAt\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If this.useVersions is true, increment __v\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tdoc.replacement.__v = (doc.replacement.__v || 0) + 1;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.replacement)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.replacement, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Since we might have modified doc.replacement, update the operation\n\t\t\t\t\top[opType].replacement = doc.replacement;\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t// Prepare log entry\n\t\t\t\t\tif (this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.filter._id || null,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify(doc.filter)) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify(doc.filter, null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '', // Add user info if available\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// For versioning, store the filter to fetch the document later\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\tfilter: doc.filter,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// No need to modify the operation\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet affectedDocs = [];\n\t\n\t\t\t// Handle versioning\n\t\t\tif (this.useVersions && versionOps.length > 0) {\n\t\t\t\t// Fetch the affected documents\n\t\t\t\tconst versionFilters = versionOps.map((v) => v.filter);\n\t\t\t\taffectedDocs = await ResolveIOServer.getMainDB().collection(this.collectionName).find({ $or: versionFilters }).toArray();\n\t\n\t\t\t\t// Prepare version documents\n\t\t\t\tconst versionInserts = affectedDocs.map((doc) => ({\n\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t...doc,\n\t\t\t\t\t\t\t_id: { _id: doc._id, __v: doc.__v },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}));\n\t\n\t\t\t\t// Insert versions in bulk\n\t\t\t\tif (versionInserts.length > 0) {\n\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).bulkWrite(<any>versionInserts, { ordered: false });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Execute bulkWrite\n\t\t\tconst monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([batchOps, options]));\n\t\t\tawait ResolveIOServer.getMainDB().collection(this.collectionName).bulkWrite(batchOps, options);\n\t\t\tmonitor.finish();\n\t\n\t\t\t// Insert logs in bulk\n\t\t\tif (this.createLogs && logs.length > 0) {\n\t\t\t\tawait ResolveIOServer.getMainDB().collection('logs').bulkWrite(logs);\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\t// Delete old versions beyond the latest 5\n\t\t\t\ttry {\n\t\t\t\t\tconst affectedDocIds = affectedDocs.map((doc) => doc._id);\n\t\n\t\t\t\t\tconst pipeline = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: { '_id._id': { $in: affectedDocIds } },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$sort: { '_id._id': 1, '_id.__v': -1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$group: {\n\t\t\t\t\t\t\t\t_id: '$_id._id',\n\t\t\t\t\t\t\t\tversions: { $push: '$_id' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$project: {\n\t\t\t\t\t\t\t\tversionsToDelete: { $slice: ['$versions', 5, { $size: '$versions' }] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ $unwind: '$versionsToDelete' },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$replaceRoot: { newRoot: { _id: '$versionsToDelete' } },\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\n\t\t\t\t\tconst oldVersions = await ResolveIOServer.getMainDB().collection(this.versionCollection).aggregate(pipeline).toArray();\n\t\n\t\t\t\t\tif (oldVersions.length > 0) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection(this.versionCollection).deleteMany({ _id: { $in: oldVersions.map((v) => v._id) } });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (error) {\n\t\t\t\t\tconsole.error('Error during version cleanup:', error);\n\t\t\t\t\t// Handle the error as needed\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\topIndex += BATCH_SIZE;\n\t\n\t\t\t// Yield to the event loop\n\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\n\t\t\t// Invalidate cache\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t}\n\t\n\t\treturn { ok: 1 } as BulkWriteResult; // Adjust return value as per your requirements\n\t}\n\n\tcountDocuments(\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions,\n\t\tskipCache = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if the filter is empty\n\t\t\t\tconst isUnfiltered = Object.keys(filter).length === 0;\n\t\n\t\t\t\tif (isUnfiltered) {\n\t\t\t\t\t// Use collection stats for an unfiltered count\n\t\t\t\t\tconst res = await ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).estimatedDocumentCount(options);\n\t\t\t\t\tresolve(res);\n\t\t\t\t}\n\t\t\t\telse if (!skipCache) {\n\t\t\t\t\t// Use cached count if skipCache is false\n\t\t\t\t\tResolveIOServer.getMongoManager().countDocuments(this.collectionName, filter, options).then(\n\t\t\t\t\t\tres => resolve(res),\n\t\t\t\t\t\terr => reject(err)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Fallback to direct countDocuments call with monitoring if skipCache is true\n\t\t\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(\n\t\t\t\t\t\tres => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if index already exists based on the key\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Check if an index with the same key already exists\n\t\t\t\tconst indexExists = existingIndexes.some(index => \n\t\t\t\t\tJSON.stringify(index.key) === JSON.stringify(fieldOrSpec)\n\t\t\t\t);\n\t\n\t\t\t\tif (indexExists) {\n\t\t\t\t\treturn resolve('Index already exists'); // Skip creation if index exists\n\t\t\t\t}\n\t\n\t\t\t\t// If index doesn't exist, push it to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndex',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Filter out indexes that already exist based on the key\n\t\t\t\tconst indexesToCreate = indexSpecs.filter(indexSpec => \n\t\t\t\t\t!existingIndexes.some(existingIndex => \n\t\t\t\t\t\tJSON.stringify(existingIndex.key) === JSON.stringify(indexSpec.key)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\n\t\t\t\t// If no new indexes to create, resolve early\n\t\t\t\tif (indexesToCreate.length === 0) {\n\t\t\t\t\treturn resolve(['All indexes already exist']);\n\t\t\t\t}\n\t\n\t\t\t\t// Push only new indexes to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndexes',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [indexesToCreate],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: '',\n\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal.value;\n \n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res.value;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res.value;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id as string,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res.value;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: '',\n\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: '',\n\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection('logs').insertOne(<any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: '',\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}
|