@omegup/msync 0.1.63 → 0.1.65

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.
package/index.esm.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","mappings":";;;;AAGA,MAAa,aAA0B,SAAkB,EAAE,WAAW,IAAG;AACzE,MAAa,UAAiC,MAC5C;AAEF,MAAa,cAAqC,MAChD;;;ACJF,MAAa,OAAa,GAAG,SAC3B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AACH,MAAa,OAAa,GAAG,SAC3B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AAEH,MAAa,MAGF,GAAG,SACZ,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC3D;AACH,MAAa,MAGF,GAAG,SACZ,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC3D;AAEH,MAAa,OAGF,GAAG,SACZ,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AACH,MAAa,OAGF,GAAG,SACZ,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AASH,SAAgB,SAAe,GAAG,MAAwC;CACxE,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,WAAW,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACjE;AACH;AAKA,SAAgB,IAAU,GAAG,MAAwC;CACnE,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AACH;AAKA,SAAgB,OAAa,GAAG,MAAwC;CACtE,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,SAAS,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC/D;AACH;AAMA,SAAgB,SAAe,GAAG,MAAwC;CACxE,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,WAAW,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACjE;AACH;AAIA,SAAgB,MAAY,MAAqB;CAC/C,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAClD;AACH;AAIA,SAAgB,KAAW,MAAqB;CAC9C,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACjD;AACH;;;AChGA,MAAa,mBAAqB;CAChC,QAAW,MAAa;AAC1B;AACA,MAAaA,QAAS,MAAS;AAC/B,MAAa,WAAc,MAAoC,KAAK;AAEpE,MAAa,aAAY,CAAE;AAM3B,MAAa,QAA8B,GAAiB,OAAU;CACpE,MAAM,KAAQ;CACd,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,EAAC;AACxB;;;ACgBA,MAAa,qBACX,GACA,MACsB;CACtB,MAAM,UAAuD,MAC3D,EAAE,QAAQ,MAAqB,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE;CACjD,MAAM,UAAU,OAAyC,OAAO,QAAQ,CAAC,CAAC;CAC1E,OAAO,OAAO,YACZ,QAAQ,KAAkD,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAEzF;AAEA,MAAa,qBACX,GACA,MAC2B,kBAAkC,GAAG,CAAC;AAMnE,MAAa,aACX,GACA,MACe,kBAAgD,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE1F,MAAa,aACX,GACA,MACe,kBAAwC,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAElF,MAAa,oBACX,GACA,MACqB,kBAAyC,GAAG,CAAC;AAMpE,MAAa,YACX,GACA,MACgB,iBAAsC,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAGjF,MAAa,UACX,GACA,OACI;CAAE,GAAG;CAAG,GAAG,SAAS,GAAGA,IAAE;AAAC;AAShC,MAAa,WAQX,GACA,OAEC;CAAE,GAAG;CAAG,GAAG,UAAU,GAAGA,IAAE;AAAC;;;AC/F9B,MAAa,OAA0B,QACrC,OAAO,EACL,WACE,UACG,OAAO,OAAO,QAAQ,YAAY,EAAE,eAAe,SACjD,OAAO,QAAQ,YAAY,IAAI,OAAO,MACrC,EAAE,UAAU,IAAG,IACf,GAAG,GAEZ;AAEH,MAAa,UAAoC,OAAO,EACtD,WAAW,UAAuC,gBAAgB,GACnE;AACD,MAAa,QACX,MACA,WAEA,OAAgB,EACd,MAAK,MACH,UAAU,EACR,MAAM;CACJ,MAAM,iBAAsD,OAAM,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE;CACrF,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;GAExB,GACJ;AAEH,MAAa,MAAM,IAAI,IAAI;AAE3B,MAAa,aAMgC,MAAyB,UACpE,OAA0B,EACxB,MAAK,MACH,UAAU,EACR,WAAW;CACF;CACP,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;GAEzB,GACJ;AAIH,MAAa,QACX,GACA,GAAG,SAEH,OAAsB,EACpB,MAAK,UACH,UAAU,EACR,WAAW;CACT,MAAM,EAAE,SAAQ;CAChB,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,KAAK,CAAC,CAAC,IAAG,CAAE;CACtC,MAAM;GAET,GACJ;AAEH,MAAa,OAAO;CAClB,MAAM,IAAI;CACV,OAAO,MAAM,EAAE,CAAC,CACb,KAAK,CAAC,CAAC,CACP,UAAU,EAAE,KAAK,MAAM,KAAK,OAAM,IAAK,EAAE,EAAE,CAAC,CAC5C,KAAK,EAAE;AACZ;AACA,MAAa,QAAQ,KAAK,IAAI;;;ACvE9B,MAAa,QACX,MACA,MACA,WAEA,OAAsB,EACpB,MAA0C,MACxC,UAA8B,EAC5B,OAAO;CACL,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACnB,MAAM,KAAK,IAAI,CAAsB,CAAC,CAAC,IAAG;CAC1C,MAAM,OAAO,IAAI,CAAsB,CAAC,CAAC,IAAG;GAE/C,GACJ;AAaH,MAAa,OAAuB,GAAG,SACrC,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AAEH,MAAa,MAAsB,GAAG,SACpC,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC3D;AAEH,MAAa,OAAuB,SAClC,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAChD;AAEH,MAAa,MACS,OACnB,MACC,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC9D;AAEL,MAAa,OAA+B,GAAoB,MAC9D,OAAkB,EAChB,MAA0D,MACxD,UAAkC,EAAE,IAAI,EAAE,KAAsB,CAAC,CAAC,CAAC,CAAC,IAAG,CAAE,GAC5E;AAEH,MAAa,WAOX,GACA,MAEA,WAAW,EACT,MAAwB,MACtB,UAA4B,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACxE;AAEH,MAAa,MACS,OAChB,MACF,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC9D;AAEL,MAAa,WAAoB,MAAqB,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG;AAE7E,MAAa,WAOC,GAAG,SACf,OAAgB,EACd,MAAK,MAAK,UAAU,EAAE,SAAS,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC/D;AAEH,MAAa,cACX,MACA,KACA,OAEA,OAA6B,EAC3B,MAAK,MACH,UAAU,EACR,SAAS;CACP,UAAU,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,OACrC,WAAU,CAAU,CAAC;EACnB,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,EAAE,UAAU,EAAC,CAAE,EAAC;EACjD,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG;EACnB,CAAC;CAEJ,GAAI,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE;GAEvC,GACJ;AAEH,MAAa,UACX,MACA,KACA,OAEA,WACE,MACA,OAAO,YACL,OAAO,QAAQ,GAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAEhE,IAAI,EAAE,CAAC;AAGX,MAAa,YAA0C,EACrD,OACA,OACA,YAMA,OAA+B,EAC7B,MAAK,MACH,UAAU,EACR,WAAW;CACT,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;GAE1B,GACJ;;;AC7IH,IAAa,QAAb,MAAa,MAAK;CAON;CACA;CACA;CANV,IAA6C,GAAwB;EACnE,OAAO,EAAE,MAAK,OAAM,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,IAAG,IAAK,EAAE,IAAG,GAAG;CACtD;CACA,YACU,OACA,KACA,QAAc;eAFd;aACA;gBACA;CACP;CACH,OAAO,aAAyB;EAC9B,MAAM,UAAkB,IAAI,OAC1B,IAAI,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,OAAOA,IAAE,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM;EACxE,OAAO,IAAI,MAAY,KAAI,MAAM,IAAI,IAAI,MAAM,UAAW,MAAM;CAClE;CACA,OAAO,aAEc,MAAQ;EACzB,MAAM,UAAkB,GAAG,OAAO,IAAI,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM;EACvE,OAAO,IAAI,MAA+B,IAAG,MAAK,KAAK,KAAK,MAAM;CACpE;CAeK,GAAwB,GAAI;EACjC,OAAO,IAAI,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAOA,IAAE,CAAC,CAAC,KAAK,GAAG,GAAG,KAAK,KAAK,KAAK,MAAM;CAC9E;CAkBO,KAAQ,GAAoB;EACjC,OAAO,EAAE,OAAyB,MAA2B,CAAC;CAChE;CAEA,MAAG;EACD,OAAO,KAAK;CACd;CACQ,UAAO;EACb,OAAO,UAAU,KAAK,IAAI,KAAK,KAAK,CAAC;CACvC;CAEA,OAAI;EACF,OAAO,OAAkB,EACvB,MACE,MACoC,EAAE,KAAsB,IAAI,CAAC,CAAC,QAAO,GAC5E;CACH;;AAGF,MAAa,EAAE,MAAM,QAAQ;;;ACxE7B,MAAM,iBAAoC,MAAc;AAExD,MAAM,SACJ,UAC+B,EAAE,MAAK,MAAK,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,EAAC;AACvF,MAAa,QACX,UACoC;CACpC,OAAO,MACL,IACE,KAAI,CAAW,CAAC,GAAG,SAAS,CAAC,CAAC,KAAI,GAClC,IAAI,CAAC,GACL,IACE,KAAI,CAAW,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,GAC9B,SAAS,IAAI,CAAC,GAAG,QAAQ,IAAI,MAAM,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GACpE,IAAI,MAAM,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CACnC,CACF;CAEH,QAAQ,GAAG,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;;AAG5C,MAAM,iBACJ,MACA,gBACA,YACA,UACgC;CAChC,OAAO,EACL,MAAK,MACH,cAAc,EACZ,cAAc;EACZ,MAAM,KAAK,SAAQ;EACnB,UAAU;EACV,YAAY,WAAW,SAAQ;EAC/B,gBAAgB,eAAe,KAAqD,MAClF,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE;EAEhB,OAAO,MAAM,SAAQ;EACrB,MAAM;IAET;AAEP;AAEA,MAAa,gBACX,MACA,gBACA,YACA,WACuC;CACvC,OAAO,cAAc,MAAM,gBAAgB,YAAY,KAAK;CAC5D,QAAc,GAA4B,MACxC,KAA0B,OAAO,GAAG,CAAC;;AAGzC,MAAa,cACX,SAEA,aACE;CACE,OAAO;AACT,GACA;CACE,IAAI,MAAM,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC;CACjC,KAAI,CAAW,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CAC9B,KAAI,CAAW,CAAC,GAAG,SAAS,CAAC,CAAC,KAAI;GAEpC,SAAU,GAAG,GAAG,KAAK,SAAO;CAC1B,IAAI,SAAS,OAAO;CACpB,IAAI,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK;CAClC,OAAO,IAAK,EAAE,KAAK,IAAK,OAAO,EAAE,IAAI;AACvC,GACA,SAAU,GAAG,GAAC;CACZ,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,QAA0B,GAAG,MAAK;EACtD,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE;EACxB,OAAO,IAAK,EAAE,KAAK,IAAK,OAAO,EAAE,IAAI;CACvC,GAAG,KAAK,EAAE;AACZ,CAAC;AAEL,MAAa,mBACX,SAEA,aACE;CACE,OAAO;AACT,GACA;CACE,IAAI,MAAM,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC;CACjC,KAAI,CAAW,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CAC9B,KAAI,CAAW,CAAC,GAAG,SAAS,CAAC,CAAC,KAAI;GAEpC,SAAU,GAAG,MAAM,KAAK,SAAO;CAC7B,IAAI,SAAS,OAAO;CACpB,KAAK,SAAQ,MAAI;EACf,MAAM,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK;EACpC,IAAI,GAAG,EAAE,KAAK;OACT,OAAO,EAAE;CAChB,CAAC;CACD,OAAO;AACT,GACA,SAAU,GAAG,GAAC;CACZ,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,QAA0B,GAAG,MAAK;EACtD,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE;EACxB,OAAO,IAAK,EAAE,KAAK,IAAK,OAAO,EAAE,IAAI;CACvC,GAAG,KAAK,EAAE;AACZ,CAAC;AAEL,MAAa,aACX,KACA,UAGA,aACE;CACE,OAAO;AACT,GACA;CACE,IAAI,KAAK,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC;CAChC,IAAI,OAAO,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC;CAClC,KAAI,CAAW,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CAC9B,KAAI,CAAW,CAAC,GAAG,SAAS,CAAC,CAAC,KAAI;GAEpC,SAAU,IAAI,GAAG,GAAG,KAAK,SAAO;CAC9B,IAAI,SAAS,OAAO;CACpB,IAAI,IAAiC,EAAE,GAAG,GAAE;CAE5C,MAAM,SAAS,GAAG,MAAK;EACrB,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,MAAM;EAC3B,IAAI,aAAa,MAAM,OAAO,aAAa,QAAQ,EAAE,QAAO,MAAO,EAAE,QAAO;EAC5E,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAK,MAAK,OAAO,eAAe,CAAC,KAAK,OAAO,SAAS,GAAG,OAAO,EAAE,QAAO,MAAO,EAAE,QAAO;EACpG,MAAM,OAAO,OAAO,KAAK,CAAC;EAE1B,OAAO,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,OAAM,MAAK,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;CACnF;CACA,MAAM,QAAS,EAAE,OAAO;EAAE,GAAG;EAAI,GAAG;CAAE,GACpC,OAAO,MAAM,MAAM,IAAI,IACvB,MAAM,MAAM,MAAM,IAAI,IACtB,MAAM,IAAI,WAAU,MAAK,MAAM,GAAG,CAAC,CAAC;CACtC,IAAI,QAAQ,IAAI,IAAI,OAAO,KAAK,CAAC;MAC5B,KAAK,KAAK,CAAC;CAChB,OAAO;AACT,GACA,SAAU,KAAsB,GAAc;CAC5C,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,QAAqB,GAAG,MAAK;EACjD,OAAO,OAAO,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAE,CAAC,CAAC,QAChC,GAAG,CAAC,GAAG,OACN,EAAG,QAAqB,GAAG,MAAK;GAE9B,MAAM,SAAS,GAAG,MAAK;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAK,MAAK,CAAC,KAAK,OAAO,KAAK,QAAQ,GAAG,OAAO,MAAM;IAC/D,MAAM,OAAO,OAAO,KAAK,CAAC;IAE1B,OAAO,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,OAAM,MAAK,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;GACnF;GACA,MAAM,QAAS,EAAE,OAAO;IAAE,GAAG;IAAI,GAAG;GAAE,GACpC,OAAO,MAAM,IACb,MAAM,MAAM,CAAC,IAAI,IAAI,IACrB,MAAM,IAAI,WAAU,MAAK,MAAM,GAAG,CAAC,CAAC;GACtC,IAAI,QAAQ,IAAI,IAAI,OAAO,KAAK,CAAC;QAC5B,KAAK,KAAK,CAAC;GAChB,OAAO;EACT,GAAG,CAAC,GACN,CAAC;CAEL,GAAG,OAAO,EAAE;AACd,CAAC;AAGL,MAAa,SACX,SAEA,KAAoC,SAAU,KAAG;CAC/C,OAAO,OAAO,KAAK,GAAG;AACxB,GAAG,IAAI;AAET,MAAa,YACX,SAEA,KAAiD,SAAU,KAAG;CAC5D,OAAO,OAAO,QAAQ,EAAE,GAAG,IAAG,CAAE,CAAC,CAAC,SAAS,CAAC,GAAG,OAAQ,EAAmB,EAAE,CAAC,KAAI,OAAM;EAAE;EAAG;CAAC,EAAG,CAAC;AACnG,GAAG,IAAI;;;AC5LT,MAAa,YACX,MAC6B;AAc/B,MAAa,gBACX,OACA,UAC6B,SAAS,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;AAU5D,MAAa,eACX,OACA,WAC0B;CAC1B,OAAO,aAAa,MAAM,OAAO,MAAM,KAAK;CAC5C,MAAK,MAAK,aAAa,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;;AAmBnD,MAAa,QACX,QACA,GACA,QAIA,UACE;CAeF,OAAO;EAbL,OACE,QAEA,KACE,KAAI,MAAK,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,GAC7B,MAAK,GACL,QACA,KAAK;EAET,OAAmC,SACjC,KAAyB,QAAQ,OAAO,GAAG,IAAI,GAAG,QAAQ,KAAK;EACjE,WAAW,OAAO,CAAC;CAEd;AACT;AACA,MAAMC,YACJ,YAC2B;CAC3B,OAAM,UAASA,SAAO,aAAa,QAAQ,KAAK,CAAC;CACjD;;AAYF,MAAa,cAAoB;CAC/B,OAAM,UAASA,SAAO,KAAK;CAC3B,QAAQ,SAAS,EAAE;;AAQrB,MAAa,oBAAiC;CAC5C,OAAO,KAAI,CAAY,CAAC;CACxB,WAA6B,KAAI,CAAa,CAAC;;AAGjD,MAAa,iBACX,EAAE,MAAM,MAAM,SACd,YACyB;CAAE;CAAM;CAAO,MAAM,aAAa,MAAM,MAAM;AAAC;;;ACtF1E,MAAa,UAGF,GAAG,SACZ,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,SAAS,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC/D;AAEH,MAAa,WACX,MACA,OACA,WAEA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,WAAW;CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;AAAE,GACvE,GACJ;AACH,MAAa,WAAiB,MAA0B,QACtD,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,MAAM;CACJ,MAAM,EACJ,GAAG,EACD,SAAS,CAAC,EAAE,UAAU,IAAG,GAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE;CAGlD,IAAI,EAAE,WAAW;EAAC;EAAO,EAAE,WAAW,CAAC,EAAE,WAAW,MAAK,GAAI,IAAI,MAAM,EAAC;EAAI,IAAI;CAAM,EAAC;GAE1F,GACJ;AACH,MAAa,SACX,MACA,OACA,YAEA,OAAsB,EACpB,MAAK,MACH,UAAU,EACR,aAAa;CACX,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACtB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB,SAAS,SAAS,IAAI,CAAC,CAAC,CAAC,IAAG;GAE/B,GACJ;AACH,MAAa,OAAa,SACxB,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACrD;AACH,MAAa,SAAe,SAC1B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAClD;AAEH,MAAa,UAQX,MACA,MAEA,OAAkD,EAChD,MAA0C,MACxC,UACE,OAAO,YACL,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAwB,CAAC,KAAK,SAC9C,KAAK,OAAO,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,CAAC,IAAI,EAAE,CACjD,CACF,GAEN;AASH,MAAa,cACX,GAAG,CAAC,aAAa,iBAEjB,OAAoC,aAAa,WAAW;AAQ9D,MAAa,eAOX,GAAG,CAAC,aAAa,iBAId,QAAuC,aAAa,WAAW;AAEpE,MAAa,aACX,GAAG,UAEH,WAA0C,GAAG,KAAK;AAYpD,MAAa,gBAEwB,UACjC,OAAO,KAAK,KAAK,CAAC,CAAC,SACf,OAAkD,EAChD,MAAK,MACH,UACE,iBAAsD,QAAO,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,CAAC,GAEtF,IACD,OACE,IAAI,WAAU,CAAU,CAAC,EAAE,CAAC,CAAC;AAEvC,MAAa,QAEW,OAAM;;;AClK9B,MAAa,QAAiB,SAC5B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACjD;AAEH,MAAa,iBAAoC,SAC/C,OAAO;CACL;CACA,IAAI;CACJ,MAAM,IAAG,CAAE,CAAC,GAAG,CAAC,CAAC,KAAI;CACtB;AAEH,MAAa,UAA+C,EAC1D,IACA,MACA,MACA,YAOA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,SAAS;CACP,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACtB;CACA,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACrB,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,IAAK;GAE/C,GACJ;AACH,MAAa,aAAyC,EACpD,QACA,MACA,YAMA,OAAqB,EACnB,MAAK,MACH,UAAU,EAAE,YAAY;CAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ,GAAG,SAAS,SAAS,GAAE;AAAE,EAAE,CAAE,GAC5F;AAEH,MAAa,WACX,SAEA,WAAiD,EAC/C,MAAK,MAAK,UAA6B,EAAE,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACvE;AAEH,MAAa,WAAoB,MAAqB,SACpD,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACpE;AAEH,MAAa,SAA4B,GAAG,UAC1C,OAAqB,EACnB,MAAK,MAAK,UAAU,MAAM,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,CAAC,GACnD;AAEH,MAAa,eAAwB,GAAG,UACtC,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe,MAAM,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACtE;AAEH,MAAa,SAAkB,SAC7B,OAAuB,EACrB,MAAK,MAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAClD;AACH,MAAa,YAAY;AACzB,MAAa,QAAiB,SAC5B,OAAuB,EACrB,MAAK,MAAK,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACjD;AAIH,MAAa,gBACX,GAAG,UAEH,OAAuC,EACrC,MAAK,MAAK,UAAU,EAAE,eAAe,MAAM,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACtE;AAEH,MAAa,kBAAkC,SAC7C,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAC3D;AAGH,MAAa,WACX,OACA,cACA,WAEA,OAAgB,EACd,MAAK,MACH,UAAU,EACR,SAAS;CACP,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB,cAAc,aAAa,IAAI,CAAC,CAAC,CAAC,IAAG;CACrC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;GAExB,GACJ;AAEH,MAAM,gBAAyB,OAA2B,SACxD,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,GACtD,GACJ;AAEH,MAAa,SACX,OACA,OACA,QAEA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,QAAQ;CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAG;AAAE,GAClE,GACJ;AACH,MAAa,UAAmB,GAAuB,MAAyB;CAG9E,MAAM,QAAQ,IAAG,CAAc,CAAC,OAAO;CACvC,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,KAAI;CAChC,MAAM,SAAS,MAAM,GAAG,QAAQ,CAAC,CAAC,KAAI;CACtC,MAAM,OAAO,IAAG,CAAK,CAAC,MAAM,CAAC,CAAC,KAAI;CAClC,MAAM,gBAAgB,IAAG,CAAU,CAAC,eAAe,CAAC,CAAC,KAAI;CACzD,OAAO,KACL,EACE,KAAK,CACH,OACA,QACE,GACA,MAAM;EAAE,KAAK,CAAC,OAAO,MAAK,CAAQ;EAAG,QAAQ,CAAC,UAAU,CAAC;CAAC,CAAE,GAC5D,KACE,EACE,eAAe,CAAC,iBAAiB,aAAuB,QAAQ,IAAI,CAAC,KAEvE,IACE,IAAI,eAAe,IAAI,CAAC,CAAC,GACzB,MAAM;EACJ,KAAK,CAAC,OAAO,GAAG;EAChB,QAAQ,CACN,UACA,YACE,IACE,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,GACxB,MAAK,GACL,MAAgB,QAAQ,IAAI,CAAC,GAAG,aAAa,CAAC,GAEhD,MAAgB,QAAQ,IAAI,eAAe,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;EAGtE,GACD,MAAM;EACJ,KAAK,CAAC,OAAO,YAAyC,KAAK,MAAM,IAAI,CAAC,CAAC;EACvE,QAAQ,CAAC,UAAU,MAAM;EAC1B,CAAC,CACH,CACF,MAIP,IAAG,CAAc,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE;AAE7C;;;AC3JA,MAAa,WACgB,WAC3B,MACE,SAAS,QAAQ,CAAC,EAAE,QAAQ,MAAM,IAAI,EAAC,CAAK,EAAC,CAAE,IAAI,EAAE;AAEzD,MAAa,SAET,aAEF,MACE,SAAS,CACP,EACE,MAAM,OAAO,YACX,QAAQ,IAAI,EAAC,CAAK,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAClC,EAAC,CAAK,CACH,GAAG,EAAE,MAAM,CAAC,CAAY,CAAC,CACzB,IAAG,GACN,EACD,CAAC,IAGP;AAEL,MAAa,aACX,eAEA,SAAS,CACP,EACE,UAAU,iBAAkD,kBAAkB,CAAC,IAElF;AAEH,MAAa,iBAC6B,UACxC,MAAI;CACF,MAAM,QAAQ,EAAC,CAAK,CAAC,IAAG,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC,OAAOD,IAAE;CAC/C,OAAO,SAAS,CACd,EAAE,cAAc,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,EAAC,IAAK,KAAK,IAAI,EAAC,CAAK,CAAC,CAAC,IAAG,CAAE,EAAC,EAC7E;AACH;AAEF,MAAa,YAET,GACA,iBAEF,MAAI;CACF,MAAM,OAAO,IAAI,EAAC,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAG;CAC9C,OAAO,SAAS,CACd,EAAE,SAAS,gBAAgB,OAAO;EAAE;EAAM,4BAA4B;CAAI,IAAK,KAAI,EACpF;AACH;AAEF,MAAa,WACuB,IAAoB,UAEpD,MAEA,SAAS,CACP,EACE,QAAQ;CACN,KAAK,GAAG,IAAI,EAAC,CAAE,CAAC,CAAC,IAAG;CACpB,GAAG,iBAA4D,OAAM,MAAK,EAAE,IAAI,EAAC,CAAK,CAAC;IAG5F;AASL,MAAa,WACX,MACA,MACG,iBAAwD,OAAM,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE;AAEtF,MAAa,kBAET,UAEF,MAAI;CACF,MAAM,EAAE,MAAM,GAAG,MAAM,QAAQ,GAAG,QAAQ;CAC1C,MAAM,UAAU,QAAQ,MAAM,EAAC,CAAK;CACpC,OAAO,SAAS,CACd,EACE,SAAS;EACP,GAAI,QAAQ,EAAE,MAAM,KAAK,eAAc;EACvC,GAAI,UAAU;GACZ,YAAY,EAAC,CAAK,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC,IAAG;GACzC,cAAc,KAAI,CAAS,CAAC,KAAK,OAAO,OAAO,CAAC,CAAC,IAAG;;EAEtD,IAAI,EAAC,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAG;EACjC,GAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,QAAO;EACrD,GAAG;KAGR;AACH;;;AChHF,MAAa,WACX,UAC6B,QAAQ,KAAK,CAAC,CAAW,IAAI;AAE5D,MAAa,SACX,YACgC,MAAkB,OAAO,CAAC,CAAW,IAAI;AAE3E,MAAa,iBACX,SAC6B,cAAc,IAAI,CAAC,CAAW,IAAI;AAEjE,MAAa,YACX,GACA,gBAEA,SAAwB,GAAG,WAAW,CAAC,CAAW,IAAI;AAExD,MAAa,iBAGT,IACA,SAEA,QAAqB,IAAI,IAAI,CAAC,CAAW,IAAI;AAKjD,MAAa,YAAY;AAEzB,MAAa,kBASX,SACiD,eAAe,IAAI,CAAC,CAAW,IAAI;;;AC7CtF,MAAa,YACX,IACA,MACA,WACmD;CASnD,MAAM,OAAO,cACX,MACE,IACE,QAAkD,KAAI,CAAY,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,GAAI,GAAG,GAC1F,KACA,MAAuB;EACrB,GAAG,CAAC,KAAK,KAAI,CAAa,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,CAAE;EAC7C,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;EACvB,SAAS,CACP,WACA,KAAI,CAAa,CACd,GAA6B,SAAS,CAAC,CACvC,GAAgC,OAAO,CAAC,CACxC,KAAI;EAEV,CAAC,GAEJ,IACE,QACE,KAAI,CAAmC,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,GACzD,GAAG,GAEL,KACA,MAAwB;EACtB,GAAG,CAAC,KAAK,KAAI,CAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,CAAE;EAC/C,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;EACtB,SAAS,CACP,WACA,KAAI,CAAc,CACf,GAA6B,SAAS,CAAC,CACvC,GAAiC,QAAQ,CAAC,CAC1C,KAAI;EAEV,CAAC,CACH,CACF;CAGH,MAAM,eAAyC,SAAqB,cAAc,IAAI;CAEtF,OAAO,KAAI,CAAqB,CAC7B,KACC,cACE,MAAM,EACJ,MAAM,CAAC,QAAQ,IAAI,GACpB,CAAC,CACH,CACF,CACA,KAAiC,SAA0B,MAAM,CAAC,CAAC,CACnE,KAAoB,cAAc,KAAI,CAAqB,CAAC,GAAG,MAAM,CAAC,CAAC,KAAI,CAAE,CAAC,CAAC,CAC/E,KACC,QAAO,CAAK,CACV,IAAI,IAAI,KAAI,CAAQ,CAAC,GAAG,GAAG,CAAC,GAC5B,SAA0D,OAAM,MAAK,EAAE,KAAK,CAAC,CAC9E,CACF,CACA,KACC,YACE,MACE,OACE,SAAwD,OAAO,GAAG,MAChE,UAAU,KAAI,CAAW,CAAC,KAAI,GAAI,CAAC,CAAC,CACrC,CACF,CACF,CACF,CACF,CAAC;AACN;;;AC1FA,MAAa,mBAAyB,SACpC,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe;CAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ;AAAO,EAAE,CAAE,GACpF;AACH,MAAa,YACX,OAAmB,EACjB,MAAK,MAAK,UAAU,OAAO,GAC5B;AACH,MAAa,aAAmB,SAC9B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe;CAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ;AAAO,EAAE,CAAE,GACpF;AACH,MAAa,YAAkB,SAC7B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe;CAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ;AAAO,EAAE,CAAE,GACpF;AACH,MAAa,QAAc,SACzB,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACjD;AACH,MAAa,WACX,MACA,QACA,SAEA,OAAmB,EACjB,MAAK,MACH,UAAU,EACR,UAAU;CACR,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAC1B,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACrB,QAAQ,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;GAE5B,GACJ;AAEH,MAAa,WAAiB,SAC5B,OAAmB,EACjB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAChD;AAEH,MAAa,WAAiB,SAC5B,OAAmB,EACjB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAChD;AACH,MAAa,YAAkB,SAC7B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe;CAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ;AAAU,EAAE,CAAE,GACvF;AACH,MAAa,WACX,WACA,MACA,WAEA,OAAmB,EACjB,MAAK,MACH,UAAU,EACR,MAAM;CACJ,MAAM;EAAE,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,IAAG;EAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;EAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;CAAE;CAC/E,IAAI,EACF,SAAS;EACP,UAAU;GACR;IACE,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAC;IAC5B,MAAM,EACJ,gBAAgB;KACd,aAAa,EAAE,cAAc,MAAK;KAClC,SAAS,EACP,MAAM,CACJ,EAAE,UAAU,MAAK,GACjB,EACE,OAAO;MACL,IAAI,EACF,KAAK,CAAC,OAAO,EAAE,eAAe,MAAK,CAAE;MAEvC,MAAM;MACN,MAAM;;KAKd,cAAc;;;GAIpB;IACE,MAAM,EAAE,KAAK,CAAC,OAAO,OAAO,EAAC;IAC7B,MAAM,EACJ,gBAAgB;KACd,MAAM,EAAE,OAAO,MAAK;KACpB,OAAO,EACL,MAAM,CACJ,EAAE,QAAQ,MAAK,GACf,EACE,OAAO;MACL,IAAI,EACF,KAAK,CAAC,OAAO,EAAE,aAAa,MAAK,CAAE;MAErC,MAAM;MACN,MAAM;;KAKd,KAAK;;;GAIX;IACE,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAC;IAC5B,MAAM,EACJ,gBAAgB;KACd,MAAM,EACJ,MAAM,CACJ,EAAE,OAAO,MAAK,GACd,EACE,OAAO;MACL,IAAI,EACF,KAAK,CACH,EACE,KAAK,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,EAAC,EAAE,GAAI,EAAE,QAAQ,MAAK,CAAE,KAEhE,EACE,MAAM,CACJ,EACE,KAAK,CACH,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,EAAC,EAAE,GACnC,EAAE,QAAQ,MAAK,MAGnB,EACE,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,EAAC,GAAI,EAAE,aAAa,MAAK,CAAE;MAM9D,MAAM;MACN,MAAM;;KAKd,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,EAAC,EAAE;KAC1C,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,EAAC;;;;EAKjC,SAAS,EACP,gBAAgB;GACd,MAAM,EAAE,OAAO,MAAK;GACpB,OAAO,EAAE,QAAQ,MAAK;GACtB,KAAK,EAAE,MAAM,CAAC,EAAE,aAAa,MAAK,GAAI,KAAK,EAAC;;;GAMvD,GACJ;AAEH,MAAa,YAAkB,EAC7B,KACA,MACA,YAMA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,MAAM;CACJ,MAAM;EACJ,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;EAClB,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAG;EACnB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;;CAEzB,IAAI,EACF,MAAM;EACJ,MAAM,EACJ,MAAM,EACJ,WAAW;GACT,WAAW;GACX,SAAS;GACT,MAAM;;EAIZ,IAAI,EACF,SAAS;GACP,UAAU;IACR;KACE,MAAM,EAAE,KAAK,CAAC,OAAO,OAAO,EAAC;KAC7B,MAAM,EACJ,OAAO;MACL,IAAI,EACF,MAAM,CAAC,EAAE,aAAa,UAAS,GAAI,EAAE,aAAa,QAAO,CAAE;MAE7D,MAAM;MACN,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,EAAC;;;IAItC;KACE,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAC;KAC5B,MAAM,EACJ,OAAO;MACL,IAAI,EACF,MAAM,CAAC,EAAE,eAAe,UAAS,GAAI,EAAE,eAAe,QAAO,CAAE;MAEjE,MAAM;MACN,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,EAAC;;;IAItC;KACE,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAC;KAC5B,MAAM,EACJ,OAAO;MACL,IAAI,EACF,KAAK,CACH,EACE,KAAK,CAAC,EAAE,QAAQ,UAAS,GAAI,EAAE,QAAQ,QAAO,CAAE,KAElD,EACE,MAAM,CACJ,EACE,KAAK,CAAC,EAAE,QAAQ,UAAS,GAAI,EAAE,QAAQ,QAAO,CAAE,KAElD,EACE,MAAM,CAAC,EAAE,aAAa,UAAS,GAAI,EAAE,aAAa,QAAO,CAAE;MAMrE,MAAM;MACN,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,EAAC;;;;GAKxC,SAAS;;;GAMpB,GACJ;AAEH,MAAa,wBAA8B,EACzC,WACA,eAKA,OAAmB,EACjB,MAAK,MACH,UAAU,EACR,iBAAiB;CACf,YAAY,EACV,eAAe;EAAE,MAAM,UAAU,IAAI,CAAC,CAAC,CAAC,IAAG;EAAI,UAAU;CAAK;CAEhE,UAAU,SAAS,IAAI,CAAC,CAAC,CAAC,IAAG;GAEhC,GACJ;AAEH,MAAa,sBACX,MACA,aAEA,OAAmB,EACjB,MAAK,MACH,UAAU,EACR,iBAAiB,EACf,eAAe;CACb,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACrB,UAAU,SAAS,IAAI,CAAC,CAAC,CAAC,IAAG;KAGlC,GACJ;;;AC7RH,MAAa,SACX,OACA,KACA,SAEA,OAA0B,EACxB,MAAK,MACH,UAAU,EAAE,QAAQ;CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG,KAAM;AAAC,EAAC,CAAE,GACxF;AAEH,MAAa,SAAuC,EAClD,IACA,MACA,YAMA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,MAAM;CACJ,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB;CACA,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;GAEtB,GACJ;AACH,MAAa,SACX,IACA,QACG,MAAM;CAAE,OAAO;CAAI,IAAI;CAAQ,MAAM,IAAI,IAAG,CAAK,CAAC,MAAM,CAAC;AAAC,CAAE;AACjE,MAAa,QACX,IACA,QACG,MAAM,KAAI,MAAK,IAAI,EAAE,KAAI,CAAE,CAAC;;;AC7BjC,MAAa,cACX,GACA,OAC2B,EAAE,MAAmB,MAAuB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAAC;AAgBzF,MAAM,UAEF,YAEY,MAAwE;CAEpF,OAAO,OAAO,QAAQ,kBAA+B,SAAQ,MAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,OACjF,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;AAE9C;AAEF,MAAa,aAGT,YAE2D,EAC3D,KAAK,OAAO,MAAM;AAGtB,MAAa,aAA6B;CAGxC,QACE,YACmD,EACnD,KAAK,OAA2B,MAAM;AAE1C;AACA,MAAa,UACX,aAC2C,EAAE,MAAK,MAAK,QAAQ,IAAI,CAAC,EAAC;AAEvE,MAAa,MAAsC,UAA8C,EAC/F,MAAK,MAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,CAAC;;;AC/DpC,MAAa,UAAU,MAAgE,WAAU,CAAU,CAAC;CAC1G,IAAI,EAAE;CACN,MAAM,EAAE;CACT;;;ACqCD,MAAa,WAA8E,EACzF,MACA,IACA,gBACA,GAAG,iBAEH,SAA4B,CAC1B,EACE,QAAQ;CACN,MAAM,OAAO,IAAI;CACjB,IAAI,GAAG,IAAG;CACV,GAAI,kBAAkB,EAAE,eAAc;CACtC,GAAI,WAAW,UAAU;EACvB,aAAa,WAAW;EACxB,GAAI,WAAW,WAAW,SAAS,EAAE,KAAK,QAAQ,WAAW,MAAM,KAAI,CAAK,EAAC;;IAIpF;AACH,MAAa,WACX,SACG,QAAyB,IAAI;;;ACNlC,MAAa,wBAKX,QACsE;CAEtE,MAAM,SAAyD,iBAI7D,MAAM,GAAG,MAAK;EACd,OAAO,GACL,KAAI,CAAgB,CACjB,GAAG,KAAK,CAAC,CACT,GAAG,CAAU,CAAC,CACd,KAAI,CAAiC,CACzC,CAAC,IAAI,CAAC,CAAC;CACV,CAAC;CACD,MAAM,SAAS,OAAO,OAAoC,MAAM;CAChE,OAAO,OAAO,SAAU,OAAO,WAAW,IAAI,OAAO,KAAM,IAAI,GAAG,MAAM,IAAK;AAC/E;AAEA,MAAa,0BAKX,gBACA,QACA,aAC2F;CAC3F,MAAM,UAAgB,MACpB,mBAAmB,YAAY,QAAQ,GAAG,GAAG,IAAI;CAUnD,MAAM,YAAY,QAJ8D,mBAChF,WACI,IAAG,CAAgB,CAAC,KAAK,IACzB,KAAI,GAC0B,GAAG,WAAW,CAAC,CAAC,KAAI,CAAE;CAKxD,MAAM,SAAS,aACb,KAAI,CAAO,CAAC,KAAI,GAChB,OAAO,IAAG,CAAM,CAAC,KAAK,CAAC,CAAC,KAAI,GAAI,KAAI,CAAO,CAAC,KAAI,CAAE,GAClD,MAAsC,EACpC,WAAW,CAAC,aAAa,SAAS,GACnC,CAAC;CAEJ,OAAO,KAAI,CAAoB,CAC5B,KACC,cACE,MAAsC;EACpC,KAAK,CAAC,OAAO,KAAI,CAAO,CAAC,KAAI,CAAE;EAC/B,QAAQ,CAAC,UAAU,MAAM;EAC1B,CAAC,CACH,CACF,CACA,KAAK,eAAuB,gBAAgB,QAAQ,CAAC,CAAC,CAAC;AAC5D;AACE,MAAa,kBACb,gBACA,aACqF;CACrF,MAAM,UAAgB,MACpB,mBAAmB,YAAY,QAAQ,GAAG,GAAG,IAAI;CAInD,MAAM,cAAgD,aAKpD,KAAI,CAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,GACnC,MAAuC;EACrC,WAAW,CAAC,aAAa,OAAO,KAAI,CAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAI,CAAE,CAAC;EACtF,WAAW,CAAC,aAAa,KAAI,CAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAI,CAAE;EAClF,CAAC;CAGJ,MAAM,OAAO,GAA+B,WAAW,CAAC,CAAC,KAAI,CAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,CAAE;CACjG,MAAM,SAAS,WAAW,IAAI,MAAM,QAAQ,IAAI;CAEhD,OAAO,KAAI,CAAgB,CAAC,KAC1B,cACE,IAAI,QAAQ,KAAI,CAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,GAAI,KAAI,CAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE,CAAC,CAC7F,CACF,CAAC;AACJ;AAgBA,MAAM,WAQJ,KACA,MACA,GACA,KACA,KACA,WACoC;CAQpC,MAAM,QAA+C,SAInD,OAAsC,MAAuC;EAC7E,OAAO,QAA+C,IAAI,GAAG,CAAC,GAAG,GAAG;CACtE,CAAC;CAID,MAAM,SAEF,iBAAgD,MAAK,OAAM,EAAE,KAAK,EAAC,EAAG;CAC1E,MAAM,aAAa,qBAAgC,GAAG;CAEtD,MAAM,aAAa,IAAI,mBAAmB;CAE1C,MAAM,WAAmC,IACvC,MACE,OAAwE,OAAO;EAC7E,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE;EAC/B,WAAW,CAAC,aAAa,OAAO;EACjC,CAAC,CACH;CAGH,MAAM,MAAoC,aACtC,KAAI,CAAK,CACN,KACC,MACE,IAAG,CAAa,CAAC,EACf,WAAW,CAAC,aAAa,GAAiB,OAAO,CAAC,GACnD,CAAC,CACH,CACF,CACA,KACC,QAAkD;EAChD,MAAM,IAAI;EACV,IAAI,KAAI,CAAO,CAAC,GAAG,KAAK;EACxB,gBAAgB;EAChB,QAAQ;EACR,aAAa,uBACX,IAAI,gBACJ,QACA,UAAU;EAEb,CAAC,CACH,CAAC,SACJ,KAAI,CAAK,CAAC,KACR,QAA8B;EAC5B,MAAM,IAAI;EACV,IAAI,KAAI,CAAO,CAAC,GAAG,KAAK;EACxB,gBAAgB;EAChB,QAAQ;EACR,aAAa,uBACX,IAAI,gBACJ,QACA,UAAU;EAEb,CAAC,CACH,CAAC;CAEN,MAAM,YAAe,UAAmE;EACtF,YAAY;EACZ,QAAQ;EACR,QAAQ,CACN,QACA,CACE,EACE,QAAQ,OAAO,KACb,iBAA0D,YAAY,CAAC,CAAC;;CAMlF,OAAO;EACL,MAAM,UACJ,KAAI,CAAU,CAAC,KAAiB,cAAyB,QAAQ,CAAC,CAAC,CAAC,KAAqB,GAAG,CAAC,CAC1F;EACL,WAAU,MAAK,EAAE,SAAS,IAAI,IAAI,CAAC;;AAEvC;AAEA,MAAa,kBAQT,KACA,MACA,IACA,KACA,UAA8B,MAAK,MACmB;CAatD,OAAO,QACL,KACA,MACA,KAAI,CAAgB,CAAC,GAAG,OAAO,IAC/B,OAAK;EACH,OAAO,IACL,QACE,KAAI,CAAwB,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,GAC7C,GAAG,GAEL,MACE,OACE,SACE,YACM,GAAG,GAEX;GACE,KAAK,CAAC,OAAO,EAAE;GACf,WAAW,CAAC,aAAa,OAAO;GACjC,CACF,GAEH,EAAE;CAEN,GACA,KACA,MAAM;AAEV;AAEF,MAAa,0BAGT,KACA,MACA,KACA,UAA8B,MAAK,MAEnC,QAAqC,KAAK,MAAM,KAAI,GAAIA,MAAI,KAAK,MAAM;AAE3E,MAAa,sBAGT,KACA,MACA,iBAAqC,QACrC,UAA8B,MAAK,MAEnC,QAAoC;CAAE,MAAM;CAAK;AAAc,GAAI,MAAM,KAAI,GAAIA,MAAI,IAAI,MAAM;AAEnG,MAAa,oBAGT,KACA,MACA,KACA,UAA8B,MAAK,MACY;CAE/C,OAAO,SAAQ,CAAK,CAClB;EAAE,MAAM;EAAK,gBAAgB;CAAM,GACnC,MACAE,gBACE,KAAI,CAAO,CAAC,GAAqB,QAAQ,CAAC,CAAC,GAAkC,KAAK,CAAC,CAAC,KAAI,CAAE,GAE5F,KACA,MAAM;AAEV;AACF,MAAa,gBAGT,KACA,MACA,UAA8B,MAAK,MAEnC,WAAU,CAAK,CAAsB,KAAK,MAAM,IAAI,MAAM;AAE9D,MAAMA,mBAA0B,SAA4B;;;ACzQ5D,MAAa,YAQX,MACA,KACA,KAEA,OACA,UACA,UACiD;CAWjD,MAAM,IAAsC;CAE5C,MAAM,kBAAsE,UAI1E,OAAO,GAAG,MACV,GACE,QACI,IAAG,CAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI,IAC7B,EAAE,MACA,KAAI,CAAqB,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI,GAC9C,IAAG,CAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI,CAAE,CAChC,CACN;CAGH,MAAM,kBAA4E,MAMhF,IAAG,CAAkC,CAAC,EACpC,QAAQ,CAAC,UAAU,IAAG,CAAK,CAAC,eAAe,CAAC,GAC7C,CAAC;CAIJ,MAAM,UAA4B,KAAI,CAAS,CAAC,GAAG,GAAG,CAAC,CAAC,KAAI;CAW5D,MAAM,SACJ,GACA,MACyB,KAAK,GAAG,CAAC;CAEpC,MAAM,KAA4C;EAChD,KAAK,CAAC,OAAO,GAAG,WAAW,OAAO,IAAI,QAAQ,GAAG,KAAK,IAAI,KAAK,CAAC;EAChE,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC;;CAEtC,MAAM,KAA4D,MAIhE,KAAK,GAAG,OAAO,CAAC;CAClB,MAAM,aAA8C,QAMlD,UAAyE,OAAO,EAAE,GAClF,EAAE;CAQJ,MAAM,mBANkB,QAKtB,YAAY,EACW;CAEzB,MAAM,gBAAgE;EACpE,GAAG,UACD,GACA,EAAE;EAEJ,GAAI,IAAI,mBAAmB,WAAW,EAAE,WAAW,CAAC,aAAa,GAAG,GAAG,CAAC,EAAC,IAAK;EAC9E,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC;;CAMtC,MAAM,UAAU,IAAG,CAAS,CAAoC,aAAa;CAc7E,MAAM,cAA2B,eAC/B,IAAI,gBACJ,IAAI;CAGN,MAAM,oBAAoB,KAAI,CAAY,CACvC,KACC,cACE,MAAM;EACJ,KAAK,CAAC,OAAO,KAAI,CAAO,CAAC,KAAI,CAAE;EAC/B,QAAQ,CAAC,UAAU,KAAI,CAAO,CAAC,KAAI,CAAE;EACtC,CAAC,CACH,CACF,CACA,KAAkC,eAAe,CAAC,CAClD,KACC,MACE,IAAG,CAAsC,CAAC,EACxC,QAAQ,CAAC,UAAU,WAAW,SAAS,KAAI,CAA4B,CAAC,GAAG,QAAQ,CAAC,CAAC,GACtF,CAAC,CACH,CACF,CACA,KAAY,WAAW,CAAC,CAAC;CAE5B,MAAM,QAAQ,MACZ,IAAG,CAAiB,CAAe,gBAAgB,CAAC;CAEtD,MAAM,SAAS,KAAI,CAAS,CAAC,KAA6B,KAAK;CAE/D,IAAI,IAAI,mBAAmB,UAAU;EACnC,MAAM,eAAe,MACnB,IAAG,CAAM,CAA+B,EACtC,WAAW,CACT,aACA,GAAkE,GAAG,IAExE,CAAC;EAEJ,OAAO,OACJ,KAA2B,YAAY,CAAC,CACxC,KACC,QAAmC;GACjC,MAAM,IAAI;GACV,gBAAgB;GAChB,IAAI,KAAI,CAAqB,CAAC,GAAG,GAAG;GACpC,MAAM,EACJ,KAAK,CACH,OACA,KAAI,CAAe,CAAC,KAAI;GAG5B,QAAQ;GACR,aAAa;GACd,CAAC,CACH,CAAC;CACN;CAEA,IAAI,IAAI,mBAAmB,WAAW;EACpC,MAAM,gBAAgB,MACpB,IAAG,CAAa,CAA+B,EAC7C,WAAW,CACT,aACA,GACE,OAAO,IAGZ,CAAC;EAEJ,OAAO,OACJ,KAA4B,aAAa,CAAC,CAC1C,KACC,QAAoC;GAClC,MAAM,IAAI;GACV,gBAAgB;GAChB,IAAI,KAAI,CAAsB,CAAC,GAAG,GAAG;GACrC,MAAM,EACJ,KAAK,CACH,OACA,KAAI,CAAgB,CAAC,KAAI;GAG7B,QAAQ;GACR,aAAa;GACd,CAAC,CACH,CAAC;CACN;CAEA,OAAO,OAAO,KACZ,QAAqC;EACnC,MAAM,IAAI;EACV,gBAAgB;EAChB,IAAI,KAAI,CAAuB,CAAC,GAAG,GAAG;EACtC,MAAM,EAAE,KAAK,CAAC,OAAO,KAAI,CAAiB,CAAC,KAAI,CAAE,EAAC;EAClD,QAAQ;EACR,aAAa;EACd,CAAC,CACH,CAAC;AACJ;;;AC3TA,MAAM,UACmC,SAErC,SACuD;CACvD,OAAO,UACL,MACA,KAAK,KAAK,KAAI,CAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE,CAAC;AAEzC;AAoBF,MAAa,eAQX,IACA,MACA,KACA,KACA,OACA,WAAW,QAC6B;CACxC,MAAM,UACJ,KAAI,CAAY,CACb,KACC,SACE,IACA,MACA,OAAuB,GAAG,CAAC,CAC5B,CACF,CACA,KACC,SAAiC,MAAM,KAAK,KAAK,OAAO,UAAU,KAAK,CAAC,CACzE,CAAC;CACN,WAAU,MACR,EAAE;EACA,YAAY,IAAI;EAChB,QAAQ;EACR,QAAQ,CACN,IACA,CACE,EACE,QAAQ,OAAO,KAAK;GAClB,GAAG,iBAA4E,aAAa,CAAC;GAC7F,GAAG,iBAAmF,YAAY,CAAC;GACpG,KAEH,GAAI,IAAI,mBAAmB,WACvB,CACE,EACE,MAAM;GAAE,WAAW;GAAS,WAAW;EAAgB,OAG3D;EAGT;;AAQL,MAAa,YAMX,IACA,MACA,KACA,UAEA,YACE,IACA,MACA;CAAE,MAAM;CAAK,gBAAgB;AAAM,GACnC,OACA,KAAK;AAST,MAAa,UAOX,IACA,MACA,KACA,OAIA,WAAW,OAEX,YACE,IACA,MACA;CAAE,MAAM;CAAK,gBAAgB;AAAQ,GACrC,QACA,OACA,QAAQ;;;AC5IZ,MAAM,aAEF,UAEa,UAA0C;CAEvD,OAAO,IACL,QAA6B,QAAQ,KAAI,CAAY,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,GAAI,GAAG,GAAG,GAAG,GACjF,KACA,KAAK,KAAK,CAAC;AAEf;AAGF,MAAa,aAOX,SACA,SAC+F;CAG/F,OAAO,MACL,IAAG,CAAM,CAAC,UAA2D,MAAM,OAAO,CAAC,CAAC;AAExF;AAEA,MAAa,YAOX,SACA,SAEA,UAA2B,SAAS,IAAI,CAAC,CAAW,IAAI;AAQ1D,MAAa,qBACX,MACE;CACF,OAAO,UAAsB,MAAK,GAAG,EAAE,CAAC,CAAC,GAAG;EAC1C,OAAO,CAAC,SAAS,OAAO;EACxB,QAAQ,CAAC,UAAU,QAAQ;EAC5B;AACH;AAEA,MAAa,oBACX,SAEA,kBAA2B,UAAmB,IAAI,CAAC;;;ACjErD,MAAa,qBACX,SAEA,kBAAsC,UACpC,IAAI,MAAM,KAAI,CAAsC,CAAC,GAAG,KAAK,CAAC,CAAC;AAGnE,MAAa,aAAoD,YAAgC;CAC/F,MAAM,OAAO;EACX,QAAQ,CAAC,UAAU,OAAO;EAC1B,SAAS,CAAC,WAAW,QAAQ;;CAI/B,MAAM,QAAQ,MAAU,KAAI,CAAY,CAAC,GAA2B,CAAC;CACrE,MAAM,UAAU,MAAU,WAAW,OAAO,OAAO,GAAG,KAAK,CAAC,CAAC;CAC7D,OAAO,KAAI,CAAe,CACvB,KACC,UAAqC,MAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAI,CAAE,GAAG,IAAI,CAAC,CACpE,CACA,KAA8B,SAAqC,QAAQ,IAAI,CAAC,CAAC,CACjF,KACC,kBAA4B,UAAS,KAAI,CAAM,CAAC,GAAkB,GAAG,MAAK,EAAG,CAAC,CAAC,KAAI,CAAE,CAAC,CACvF,CACA,KAAwB,UAAqC,MAAK,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACvF;;;AC1BA,MAAa,OAA0C,QAA4C;CACjG,UAAU,GAAG;CACb,SAAS,GAAG;CACZ,WAAW,GAAG;CACd,UAAU,GAAG;;AAEf,MAAa,gBAAsD;CACjE,UAAU;CACV,SAAS;CACT,WAAW;CACX,UAAU;;AAEZ,MAAM,MAAS,MAAS;AACxB,MAAM,oBAAuD,OAAM;AAEnE,MAAa,UACX,QACsB;CACtB,GAAG;CACH,WAAW,GAAG;CACd,UAAU,GAAG;;AAEf,MAAa,iBACX,MACG,YAAW;;;AC5BhB,MAAa,kBAQc,QACR,YAAwE;CACvF,OAAO,EACL,KAAK,GAAG,KAAK,QAAO;AAExB;;;ACdF,MAAM,SAAS,SAAQ;AAEvB,MAAa,MAAM,OAAO,KAAK;AAC/B,MAAa,MAAM,OAAO,KAAK;AAG/B,MAAa,OAAO,SAAQ;AAE5B,MAAa,MAAM,KAAc,KAAK;AACtC,MAAa,QAAQ,KAAgB,KAAK;AAC1C,MAAa,SAAS,KAAgB,MAAM;AAC5C,MAAa,MAAM,KAAa,KAAK;AACrC,MAAa,SAAS,KAAW,KAAK;AACtC,MAAa,OAAO,KAAa,MAAM;AACvC,MAAa,OAAO,KAAa,MAAM;AAiBvC,MAAa,QAAQ,SAAQ,CAA0G,CAAC,OAAO;AAC/I,MAAa,UAAU,SAAQ,CAAmG,CAAC,SAAS;;;AC/B5I,MAAa,SAAyB,UAA4C,EAChF,MAAK,MAAK,WAAU,CAAU,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE;;;ACF7D,MAAM,SAAS,SAAQ;AAQvB,MAAa,MAAM,OAAO,KAAK;AAC/B,MAAa,OAAO,OAAO,MAAM;;;ACFjC,MAAa,eAA8B,UACzC,aACE,kBAAkB,IAAI,OAAO,KAAI,CAAK,CAAC,KAAI,GAAI,GAAG,CAAC,GACnD,WAAU,CAAE;AAEhB,MAAa,mBAAqB;CAChC,MAAM,QAAQ,SAAa,KAAI,CAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,KAAI;CAChE,OAAO,QACL,MACE,GAAuC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CACtE;AAEL;;;AChBA,MAAa,UAAyB,WAAmD;CACvF,KAAK,QAAQ,MAAM,KAAK,CAAC;CACzB,OAAO,YAAe,KAAK;;;;ACuB7B,MAAa,YACX,GACA,IACA,MACA,SACiB;CACjB,IAAI,MAAM,IAAI,OAAO;CACrB,IAAI,OAAO,MAAM,UAAU,OAAO;CAClC,MAAM,QAAQ,QAAiC,QAAQ,KAAK,OAAO;CACnE,OAAO,OAAO,KAAK,EAAE,EAAE,GAAG,IAAO,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AACpD;AAaA,MAAM,WACJ,OACA,SAEA,IAA6B,QAAiC,OAAO,GAAG,GAAG,KAAK,IAAI;AA2FtF,MAAM,aAQJ,IACA,IACA,GAEA,YAOE;CAQF,MAAM,WAA6B,MAAK;CACxC,MAAM,MAAqB,KAAI;CAC/B,MAAM,SAAS,SACb,IAAI,GAAW,IAAI,CAAC,CAAC,GAAmC,EAAE,CAAC,CAAC,KAAI;CAClE,MAAM,aAAa,SACjB,QAA6B,MAAM,IAAI,GAAG,QAAQ;CACpD,MAAM,OAAoB,KAAI,CAAM,CAAC,GAAc,KAAK,CAAC,CAAC,KAAI;CAC9D,MAAM,UAA6B,MAAmB;EACpD,QAAQ,CACN,UACA,QACE,IAAI,GAAiB,QAAQ,CAAC,CAAC,GAAmC,EAAE,CAAC,CAAC,KAAI,GAC1E,GAAG;EAGP,OAAO,CACL,SACA,QACE,IAAI,GAAgB,OAAO,CAAC,CAAC,GAAmC,EAAE,CAAC,CAAC,KAAI,GACxE,GAAG;EAGP,SAAS,CAAC,WAAW,IAAI,GAAG,SAAS,CAAC,CAAC,KAAI,CAAE;EAC9C;CACD,MAAM,UAAa,SAAwC;EACzD,MAAM,MAAM,QAAkB,QAAQ,KAAK,OAAO;EAClD,IAAI,OAAO,MAAM,UAAU,OAAO,GAAG,CAAC;EACtC,OAAO,OAAc,GAAG,EAAE,EAAE,GAAG,IAAO,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC;CACvD;CACA,MAAM,SAAS,SAA2C;EAExD,MAAM,QAAQ,IAAG,CAAU,CAAC,OAAO,CAAC,CAAC,KAAI;EACzC,OAAO,KACL,EAAE,OAAO,CAAC,SAAS,UAAU,IAAI,CAAC,EAAC,GACnC,IACE,GAAsB,KAAK,CAAC,CAAC,QAAQ,GACrC,QAAQ,IAAI,GACZ,MAAyC;GACvC,OAAO;GACP,IAAI;GACJ,MAAM,MAA+C;IACnD,KAAK,CAAC,OAAO,OAA8B,IAAG,CAAK,CAAC,GAAG,CAAC,CAAC,GAAa,KAAK,CAAC,CAAC,KAAI,CAAE,CAAC;IACpF,OAAO,CAAC,SAAS,IAAG,CAAK,CAAC,GAAG,CAAC,CAAC,KAAI,CAAE;IACtC;GACF,CAAC,CACH;CAEL;CACA,MAAM,cAAc,MAAM,QAAQ;CAClC,MAAM,aAAa,MAAM,OAAO;CAGhC,MAAM,SAAyC,SAAY,IAAG,CAAY,CAAC,IAAI,CAAC,CAAC,KAAI;CACrF,MAAM,QAA6B,SACjC,IAAG,CAAkB,CAAC,IAAI,CAAC,CAAC,GAA2B,KAAK,CAAC,CAAC,KAAI;CACpE,MAAM,WAAgC,SACpC,IAAG,CAAkB,CAAC,IAAI,CAAC,CAAC,GAA6B,OAAO,CAAC,CAAC,KAAI;CACxE,MAAM,OAAO,MAAgE;EAC3E,OAAO,MAAM,SAAS;EACtB,IAAI;EACJ,MAAM,MAAwE;GAC5E,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC;GACtB,QAAQ,CAAC,UAAU,QAAQ,GAAG,CAAC;GAC/B,OAAO,CACL,SACA,MACE,MAAgF;IAC9E,OAAO,OAAwE;KAC7E,MAAM,MAAM,QAAQ;KACpB,IAAI;KACJ,OAAO,IAAI,CAAC;KACZ,MAAM,GAAwD,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;KACnF;IACD,IAAI;IACJ,MAAM,QAAQ,GAAG;IAClB,CAAC;GAGP;EACF;CACD,MAAM,YAAY,MAA8C;EAC9D,OAAO,MAAM,SAAS;EACtB,IAAI;EACJ,MAAM,IAAG,CAAkB,CAAC,IAAI,CAAC,CAAC,GAA2B,KAAK,CAAC,CAAC,KAAI;EACzE;CACD,MAAM,QAAQ,MAAgE;EAC5E,OAAO,OAA2C;GAChD,MAAM,MAAM,QAAQ;GACpB,IAAI;GACJ,MAAM,IACJ,QAAuD,KAAK,GAAG,GAAG,SAAS,CAAC;GAE/E;EACD,IAAI;EACJ,MAAM,MAAwE;GAC5E,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC;GACtB,QAAQ,CAAC,UAAU,GAAG;GACtB,OAAO,CAAC,SAAS,QAAQ,GAAG,CAAC;GAC9B;EACF;CACD,MAAM,QAAQ,KACZ;EACE,SAAS,CAAC,WAAW,WAAW;EAChC,QAAQ,CAAC,UAAU,UAAU;IAE/B,YAA4C,MAAM,KAAK,CAAC;CAE1D,OAAO,cACL,MACE,UACE,KAAK,IAAI,KAAK,GACd,KAAK,IAAI,OAAO,CAAC,CAClB,CACF;AAEL;AAGA,MAAM,WACJ,QACkD,MAAK;AAGzD,MAAM,YACJ,OAEA,MACE,MAAwC;CACtC,KAAK,CAAC,OAAO,EAAE;CACf,OAAO,CAAC,SAAS,MAAoC,EAAE,CAAC;CACzD,CAAC;AA6EN,MAAM,YAQJ,IACA,IAEA,KAEA,QAKE;CAoBF,MAAM,MAAuB,KAAI;CACjC,MAAM,WAA+C,KAAI,CAAK,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CACpF,MAAM,QAAQ,SAAkC,IAAI,GAAY,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI;CAC9F,MAAM,SAAuC,GAAe,MAC1D,aACE,aACE,MAA0B,EAAE,KAAK,CAAC,OAAO,GAAE,CAAK,EAAC,CAAE,GACnD,MAAuB,KAAK,IAAI,CAAC,CAAC,CAAC,GAErC,MAAuB,KAAK,IAAI,CAAC,CAAC,CAAC;CAEvC,MAAM,UACJ,KACA,OACuB;EAIvB,OAAO,MAAgB,KAAK,GAAG,QAAe,GAAG,CAAC;CACpD;CACA,MAAM,WACJ,KACA,QACuB,MAAe,KAAK,GAAG;CAEhD,MAAM,UACJ,KACA,QACA,KACA,SAEA,IACE,QAA+C,KAAK,MAA+B,EAAE,CAAC,GACtF,KACA,QAAyB,QAAQ,IAAI,CAAC;CAE1C,MAAM,UAAU,SAAoC;EAClD,MAAM,YACJ,KAAI,CAAkB,CAAC,GAAuB,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI;EAC9E,MAAM,YACJ,KAAI,CAAsB,CAAC,GAA2B,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI;EACtF,IAAI,CAAC,KAAK;GACR,MAAM,YACJ,KAAI,CAA4B,CAAC,GAAG,EAAE,CAAC,CAAC,GAAkB,IAAI,CAAC,CAAC,KAAI;GACtE,OAAO,QACL,KAAK,IAAI,GACT,OACE,IAAG,GACH,IAAG,GACH,MAAM,OAAO,IAAG,GAAO,GAAG,IAAI,KAC9B,QAAQ,IAAG,GAAO,IAAG,CAAK,CAAC,CAC5B;EAEL;EACA,MAAM,YAAqE;GAKzE,OAAO,QACL,KAAI,CAAK,CAAC,GAAU,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI,GAClD,IAAI,QAAc,GAAG,CAAC;EAE1B;EACA,OAAO,OACL,IAAG,GACH,IAAG,GACH,MAAM,OAAO,IAAG,GAAO,GAAG,IAAI,KAC9B,QAAQ,IAAG,GAAO,IAAG,CAAK,CAAC;CAE/B;CACA,MAAM,SAAS,SACb,IACE,GAAsB,IAAI,GAAY,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI,CAAE,CAAC,CAAC,MAAe,EAAE,CAAC,GAC1F,IAAI,IAAI,GACR,IAAI,GAAG,EAAE,CAAC,CAAC,GAA0B,SAAS,CAAC,CAAC,GAA2B,IAAI,CAAC,CAAC,KAAI,CAAE;CAE3F,MAAM,YAA2C,MAAgD;EAC/F,KAAK,CAAC,OAAO,GAAE,CAAE;EACjB,QAAQ,CAAC,UAAU,OAAO,QAAQ,CAAC;EACnC,OAAO,CAAC,SAAS,OAAO,OAAO,CAAC;EAChC,SAAS,CACP,WACA,MAA6B;GAC3B,QAAQ,CAAC,UAAU,MAAM,QAAQ,CAAC;GAClC,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC;GAChC;EAEJ;CAED,OAAO,cAAc,SAAS;AAChC;AAYA,MAAa,gBAQX,IACA,IACA,GACA,cACA,iBAKE;CAIF,MAAM,UACJ,SACA,KACA,QACE;EAGF,OAAO,KAAI,CAAM,CACd,KAAqB,UAAkC,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAC3E,KACC,SAAqE,EAAE,CAAC,CACzE,CACA,KAAkC,SAA+B,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CACnF,KAA2B,WAAU,CAAQ,CAAC,CAAC;CACpD;CACA,MAAM,OACJ,YAEA,OACE,SACA,iBAAiB,QAAQ,cAAwB,YAAY,GAC7D,iBAAiB,QAAQ,cAAwB,YAAY,CAAC;CAElE,IAAI,MAAM,IAAI,OAAO,IAAW,OAAO;CACvC,IAAI,iBAAiB,MAAM,OAAO,IAAO,QAAQ;CACjD,OAAO,IAAW,OAAO;AAC3B;;;AC1iBA,MAAa,WACX,GACA,MACA,SAAS,QAC8D;CAGvE,MAAM,QAAQ;EAAC;EAAQ;EAAQ;CAAO;CACtC,OAAO;EACL,OAAO,KAAI,CAA6B,CACrC,KACC,kBACE,MAAM;GACJ,KAAK,CAAC,OAAO,KAAI,CAAsB,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE;GACxD,MAAM,CAAC,QAAQ,KAAI,CAAsB,CAAC,KAAI,CAAE;GAChD,OAAO,CAAC,SAAS,KAAI,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI,CAAE;GACrD,CAAC,CACH,CACF,CACA,KACC,aACE,QACA,SACA,KAAK,CACN,CACF,CACA,KACC,kBACE,aACE,KAAI,CAA6B,CAAC,GAAG,MAAM,CAAC,CAAC,KAAI,GACjD,OACE;GACE,KAAK,KAAI,CAA6B,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI;GACvD,IAAI,KAAI,CAA6B,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;KAEtD,IAAI,CACL,CACF,CACF,CACF,CAAC;EACJ,MAA2B,MACzB,KAAI,CAA8B,CAC/B,KAA2B,SAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACnD,KACC,MACE,IAAG,CAAwB,CAAO,EAChC,KAAK,CACH,OACA,GACE,SACE,OACA,QACA,KAAI,CAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,GACxB,KAAI,CAAK,CAAC,GAAS,CAAC,CAAC,CAAC,GAAa,KAAK,CAAC,CAAC,KAAI,CAAE,CACjD,IAGN,CAAC,CACH,CAAC,CAAC,CAAC,CACL,CAAC;;AAEV;;;ACpCA,MAAa,gBAaX,EAAE,QAAQ,UACV,EAAE,MAAM,MAAM,SACd,IACA,IACA,GACA,cACA,iBACgE;CAGhE,MAAM,OAAOC,SACV,WAAW,KAAK,CAAC,CACjB,OAAO,KAAK,iBAAiBC,aAAI,KAAK,IAAIA,aAAI,IAAI,CAAC,CAAC,CACpD,OAAO,WAAW;CAIrB,MAAM,kBAAkB,MACtB,GACE,QACE,KAAI,CAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAA6B,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAI,GACnE,OAAmB,IAAI,IAAI,CAAC,CAAC,CAC9B;CAEL,OAAO,KAAI,CAAa,CACrB,KACC,kBAAmC,MAAyB,KAAK,IAAI,KAAI,CAAM,CAAC,KAAI,CAAE,CAAC,CAAC,CAAC,CAC1F,CACA,KACC,MACE,IAAG,CAAS,CAAC;EACX,KAAK,CAAC,OAAO,eAAe,QAAQ,CAAC;EACrC,KAAK,CAAC,OAAO,eAAe,OAAO,CAAC;EACrC,CAAC,CACH,CACF,CACA,KACC,eAAyF;EACvF;EACA,GAAG;EACH,QAAQ;GACN,SAAS,KAAI,CAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,MAAM;GACrD,OAAO,KAAI,CAAS,CAAC,GAAG,KAAK;;EAE/B,MAAM;EACN,UAAU,KAAI,CAAM,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;EAC7C,CAAC,CACH,CACA,KACC,eAQE;EACA;EACA,GAAG;EACH,QAAQ;GACN,SAAS,KAAI,CAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,MAAM;GACrD,OAAO,KAAI,CAAS,CAAC,GAAG,KAAK;;EAE/B,MAAM;EACN,UAAU,KAAI,CAAM,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;EAC7C,CAAC,CACH,CACA,KACC,kBAEI,MAIE;EAIF,MAAM,UACJ,MACA,QACwC;GAMxC,MAAM,OAAO,KAAI;GACjB,OAAO,IACL,QACE,KAAI,CAAkB,CAAC,GAAyB,IAAI,CAAC,CAAC,KAAI,GAC1D,GAAG,GAEL,KACA,MACE,UACE,KAAK,IAAI,KAAK,GAA4B,GAAG,CAAC,CAAC,GAAiB,QAAQ,CAAC,CAAC,KAAI,CAAE,GAChF,KACE,IACA,KAAK,GAAgC,IAAI,CAAC,CAAC,GAAyB,EAAE,CAAC,CAAC,KAAI,CAAE,CAC/E,CACF,CACF;EAEL;EACA,OAAO,MAAM,UAAU,OAAO,SAAS,GAAG,IAAI,OAAO,UAAU,GAAG;CACpE,CAAC,CACF,CACF,CACA,KACC,iBAAiB,OACb,mBAEI,SAIE;EAGF,MAAM,YAAiC,KAAI,CAAK,CAAC,GAC/C,SAAS,UAAU,WAAW,OAAO;EAMvC,MAAM,KAAK,cAAwB,YAAY,CAAC,CAAC,QAAgB,GAAG;EAapE,OATI,QACF,KAAI,CAAK,CAAC,GAAG,IAAI,CAAC,CAAC,KAAI,GACvB,MACE,UACE,KAAK,IAAK,UAA2B,GAAG,EAAE,CAAC,CAAC,KAAI,CAAE,GAClD,KAAK,IAAI,EAAE,CAAC,CACb,CAGE;CACT,CAAC,IAEH,KAAI,CAAyC,CAAC,MAAM,CACzD,CACA,KACC,aAAsC,IAAI,IAAI,GAAG,cAAc,YAAY,CAAC,CAC7E,CAAC;AACN;;;ACjMA,MAAa,cAYT,EAAE,QAAQ,UACV,EAAE,MAAM,MAAM,SACd,IACA,GACA,iBAGA,MAC2E;CAE3E,MAAM,OAAO,KAAI,CAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CACrC,MAAM,QAAQ,KAAI,CAAK,CAAC,GAAU,EAAE,CAAC,CAAC,GAAoB,KAAK,CAAC,CAAC,KAAI;CACrE,MAAM,WAAW,MAAM;CACvB,MAAM,aACJ,OAAO,MAAM,WAAW,QAAQ,OAAO,MAAM,IAAO,EAAE,EAAE,GAAG,KAAK;CAClE,OAAO,KAAI,CAAc,CACtB,KACC,eAAwD;EACtD;EACA,GAAG;EACH,QAAQ;GACN,OAAO;GACP,SAAS,KAAI,CAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,MAAM;;EAEvD,MAAM;EACN,UAAU,KAAI,CAAM,CACjB,KAAmB,KAAK,CAAC,CACzB,KAA0B,IAAI,CAAC,CAC/B,KAAkB,cAAc,KAAI,CAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,CAAE,CAAC,CAAC,CAAC;EAC7E,CAAC,CAAC,CAAC,CAAC,CACN,CACA,KAA4B,SAA2B,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3E,KACC,WACI,KAAI,CAAa,CAAC,SAClB,MACE,IAAG,CAAmB,CAAO,EAC3B,KAAK,CAAC,OAAO,GAAG,QAAQ,YAAY,IAAI,CAAC,CAAC,GAC3C,CAAC,CACH,CAAC,CAAC,CAAC,CACT,CAAC;AACN;;;AC5DF,MAAa,YACX,MAEA,QAAuC,KAAI,CAAoB,CAAC,GAAG,QAAQ,CAAC;;;ACP9E,MAAM,KAAK,MACT,aAAa,SAAS,GAAG,OAAO,CAAC,IAAI,MAAM,KAAK,EAAC,IAAK,SAAS,GAAG,OAAO,CAAC,IAAI,MAAM,KAAK,EAAC;AAE5F,MAAM,WAAW,MAAY,EAAE,QAAQ,+BAA+B,GAAG,MAAM,EAAE,CAAC,CAAC;AACnF,MAAM,QAAQ,MAAc,QAAQ,KAAK,UAAU,CAAC,CAAC;AAErD,MAAa,OAAO,GAAG,SACrB,QAAQ,oBACN,IAAI,KAAI,GACR,GAAG,KAAK,KAAI,MAAM,OAAO,MAAM,aAAa,EAAE,OAAO,IAAI,KAAK,OAAO,MAAM,WAAW,KAAK,CAAC,IAAI,CAAE,CAAC;;;ACNvG,MAAa,2BAAW,IAAI,IAAG;AAE/B,MAAa,cAAc,OACzB,YACA,WACA,OACE;CACF,MAAM,EAAE,MAAM,GAAG,YAAY,MAAM;CACnC,MAAM,MAAM,SAAS,IAAI,WAAW,cAAc,qBAAK,IAAI,IAAG;CAC9D,SAAS,IAAI,WAAW,gBAAgB,GAAG;CAC3C,MAAM,WAAW,GAAG,KAAK,UAAU,SAAS,EAAC,GAAI,KAAK,UAAU,OAAO;CACvE,IAAI,IAAI,IAAI,QAAQ,GAAG;EACrB,MAAM,IAAI,IAAI,QAAQ;EACtB;CACF;CACA,MAAM,UAAU,qBAAqB,YAAY,WAAW,EAAE;CAC9D,IAAI,IAAI,UAAU,OAAO;CACzB,MAAM;AACR;AACA,MAAM,uBAAuB,OAC3B,YACA,WACA,YACE;CAEF,WAA+C;CAC/C,OAAO,MAAM;EACX,IAAI;GACF,MAAM,WAAW,YAAY,WAAW,OAAO;GAC/C,WAA8C;EAChD,SAAS,GAAQ;GACf,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG;IAG9B,EAA2C,MAC7B,WAAW;IAIzB;GACF;GACA,IAAI,EAAE,QAAQ,OAAO;IAEnB,MAAM,IAAI,SAAQ,QAAO,WAAW,KAAK,GAAG,CAAC;IAC7C;GACF;GACA,WACyB;GAKzB,QAAQ,MAAM,wBAAwB,CAAC;GACvC,MAAM;EACR;EACA;CACF;AACF;AAEA,MAAa,mBAAmB,OAAO,IAAQ,mBAA0B;CACvE,IAAI,CAAE,MAAM,GAAG,gBAAgB,EAAE,MAAM,eAAc,GAAI,EAAE,UAAU,KAAI,CAAE,CAAC,CAAC,KAAI,GAC/E,MAAM,GAAG,iBAAiB,cAAc;AAE5C;;;AC/DA,MAAa,OACX,GACA,MACM,OAAO,YAAkB,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAgB,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAE3F,MAAa,SAA+B,EAAE,GAAG,KAAQ,GAAM,MAAc;CAC3E,OAAO,EAAE;CACT,OAAO;EAAE,GAAG;GAAI,IAAI;CAAC;AACvB;AACA,MAAa,WACX,YACE;CAEF,OAAO,IAAyB,UAAS,MAAK,EAAE,KAAI,CAAE;AACxD;AAYA,MAAa,QACX,YACwC;CAGxC,MAAM,WAAmD,OAAO,OAG9D,IAAwD,UAAU,GAAG,QAAO;EAK1E,OAJU,EAAE,KAAK,MACf,WAAU;GAAE;GAAK;EAAK,KACtB,UAAS,IAAI,MAAM,KAAK,CAEnB;CACT,CAAC,CAAC;CAEJ,OAAO,QAAQ,IAAoC,QAAQ,CAAC,CAAC,MAC1D,WAA0B;EACzB,IAAI,kBAAkB,OACpB,MAAM;OAEN,OAAO;CAEX,CAAC;AAEL;;;ACjDA,MAAa,cACX,gBACA,yBACA,SACA,cAC4C;CAC5C,MAAM,EAAE,OAAO,eAAe,QAAQ;CAEtC,IAAI,CAAC,YAAY,GAAG,KAAK,cAAc,KAAM,KAE3C,OAAO,wBAAwB,MAAM,2BAAyB;EAI5D,IAAI,uBAAuB,KAAM,KAC/B,OAAO;GAAE,OAAO;GAAwB;EAAG;EAI7C,OAAO,KAAK,OAAO;CACrB,CAAC;CAEH,OAAO,KAAK,OAAO;AACrB;;;ACtBA,MAAM,cAEF,QACA,WACA,eAEF,YACE,WAAW,QAAQ,WAAW,SAAS,SAAS;AAEpD,MAAM,oBAEF,SACA,QACA,WACA,gBAIG;CACH,MAAM,EAAE,OAAO,QAAQ;CACvB,MAAM,SAAS,MAAM,KAAI;CACzB,OAAO,QAAQ,OAAO,MAAM;CAC5B,OAAO,eAAgC;EACrC,SAAS,MAAiD,SAAS,KAAK,MAAM;EAC9E;EACA,QAAQ,WAAW,QAAQ,OAAO,MAAM,SAAS;EACjD;EACD;AACH;AAMF,MAAM,iBAEF,SACA,WACA,WAID,WAA8E;CAC7E,MAAM,EAAE,OAAO,QAAQ;CACvB,OAAO;EACL,MAAM,iBAAiB,SAAS,QAAQ,WAAW,KAAK;EACxD,MAAM,MAAM;EACZ,MAAM;GAAE;GAAK,OAAO,MAAM;GAAM,KAAK,MAAM,KAAM;EAAG;;AAExD;AAEF,MAAa,kBAAyE,WAOjC;CACnD,MAAM,EAAE,SAAS,WAAW,SAAS,MAAM,UAAU;CAErD,OAAO;EACL,YAAY,eAAe;GAAE,SAAS,QAAQ,OAAO;GAAG;GAAW;GAAQ;EAAK,CAAE;EAClF,MAAM,OAAO,OAAO,CAAC,CAAC,KAAK,cAAc,SAAS,WAAW,KAAK,CAAC;EACnE,OAAO,YAAW;GAChB,KAAK,MAAM,OAAO,SAChB,MAAM,QAAQ,IAAI,EAAE,MAAK;EAE7B;;AAEJ;;;ACxEA,MAAM,QAAQ,EAAE,QAAQ,MAAK;AAC7B,IAAI,UAAiC;AAIrC,MAAa,mBACX,UAC6E;CAC7E,MAAM,iBAAgB;EACpB,MAAM,UAAU,MAAM,KAAI,SAAQ,KAAI,CAAE;EACxC,MAAM,UAA8C,OAAO,YACzD,QAAQ,KAAK,QAAQ,UAAU,CAAC,OAAO,KAAK,GAAG,MAAM,CAAC,CAAC;EAEzD,OAAO,eAA2C;GAChD;GAEA,YAAW,QAAO;GAClB,OAAO,EACL,QAAQ,OAAO,WAAU;IACvB,IAAI,CAAC,MAAM,KAAK,KAAK;IACrB,IAAI,YAAY,MAAM;KACpB,aAAa,OAAO;KACpB,UAAU;IACZ;IACA,OAAO,KAAK,WAAU;KACpB,IAAI,CAAC,MAAM,KAAK,KAAK;KACrB,IAAI,CAAC,MAAM,QAAQ;MACjB,IAAI,YAAY,MAAM,aAAa,OAAO;MAC1C,UAAU,iBAAgB;OACxB,MAAM,SAAS;OACf,QAAQ,IAAI,QAAQ;MACtB,GAAG,GAAI;KACT;IACF,CAAC;GACH;GAEH;CACH;CACA,OAAO;AACT;;;ACxCA,IAAa,UAAb,MAAoB;CACV;CAER,YAAY,MAA+B;EACzC,KAAK,UAAU,OAAO,CAAC,IAAI,IAAI;CACjC;CAEA,IAAI,GAA2B;EAC7B,KAAK,QAAQ,KAAK,CAAC;CACrB;CAEA,SAAM;EACJ,MAAM,QAAQ,KAAK,QAAQ,QAAO,MAAK,CAAC;EACxC,IAAI,MAAM,WAAW,GACnB,OAAO,MAAM;EAEf,OAAO,gBAAgC,KAAK;CAC9C;CAEA,MAAM,IAAqC;EACzC,MAAM,MAAM,KAAK,OAAM;EACvB,OAAO,QAAQ,KAAK,EAAE;CACxB;;AAGF,MAAa,QAAgB,SAA2C;AAExE,MAAM,UAAU,OACd,IACA,OACkB;CAClB,OAAO,MAAM;EACX,MAAM,EAAE,MAAM,MAAM,GAAG,UAAU,GAAE;EACnC,MAAM,MAAM,MAAM,KAAK,MACrB,UAAS;GAAE,IAAI;GAAM;EAAI,KACzB,SAAQ;GAAE,IAAI;GAAO;EAAG,EAAY;EAEtC,IAAI,CAAC,IAAI,IAAI;GACX,QAAQ,MAAM,IAAI,GAAG;GACrB,QAAQ,KAAK,CAAC;EAChB;EACA,MAAM,EAAE,MAAM,SAAS,IAAI;EAC3B,IAAI,KAAK,IAAI,GAAG;GACd,MAAM,MAAK;GACX,MAAM,IAAI,MAAM,iBAAiB;EACnC;EACA,KAAK;CACP;AACF;;;ACbA,MAAM,SAAuD,EAC3D,SAAS,GACT,SAAS,QAKT,eAA+D,EAAE,SAAS;CAAE;CAAG;AAAC,EAAE,CAAE;AAEtF,MAAM,QAeJ,QACA,cACA,eACA,uBACA,cACkD;CAGlD,MAAM,EAAE,QAAQ,QAAQ,MAAM,OAAO,OAAO;CAC5C,MAAM,iBAAiB;EAAE,QAAQ;EAAQ,QAAQ;CAAM;CAEvD,MAAM,SAAuB,OAAO,OAAO,QAAQ,SAAS;EAAC;EAAQ,OAAO;EAAQ;CAAO;CAE3F,MAAM,iBAIF,SAAS,WAAW,gBAAgB,eAAe,IAAI,QAAQ,SAAS,CAAC;CAC7E,MAAM,oBAAoB,cAAc,cAAc,cAAc;CACpE,MAAM,OAAO,GAAG,KAAK,IAAG;CACxB,MAAM,MAAyB,EAAE,KAAK,IAAG;CACzC,MAAM,SAA6C;EAAE,GAAG;EAAM,GAAG;CAAG;CACpE,OAAO;EACL,SAAQ,YACN,QAAQ,cAAc,mBAAmB,SAAS,sBAAsB,GAAG,CAAC,CAAC;EAC/E,MACE,eACoC;GAEpC,MAAM,cAAc,aAClB;IAFsB,QAAQ;IAAQ,QAAQ;GAE9C,GACA,cACA,SACA,QACA,QACA,SAAS;GAEX,MAAM,cAAc,aAClB,gBACA,eACA,QACA,SACA,QACA,QACA,SAAS;GAEX,MAAM,sBAAsB,aAC1B,kBACE,aACE,KAAI,CAAU,CAAC,GAAG,MAAM,CAAC,CAAC,KAAI,GAC9B,OACE;IACE,GAAG,KAAI,CAAU,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI;IAClC,GAAG,KAAI,CAAU,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;MAElC,MAAM,CACP,CACF,GAEH,sBAAsB,KAAK;GAE7B,MAAM,eAAe,aAAa,aAAa,mBAAmB;GAClE,MAAM,eAAe,aAAa,aAAa,mBAAmB;GAClE,MAAM,aACJ,GACA,QACA,UAEA,EAAE,IACA;IACE,MAAK,UAAS,aAAa,QAAQ,MAAM,IAAI,KAAK,CAAC;IACnD,UAAU,MAAM;MAElB,YAAW;IACT,IAAI,oCAAoC,aAAa,KAAK,gBAAgB,GACvE,UAAU,OAAO,IAAG,MAAO,GAC7B;IACD,MAAM,YACJ,aAAa,MACb,GAAG,UAAU,OAAO,IAAG,MAAO,EAAC,GAC/B,EAAE,MAAM,UAAU,KAAK,OAAM,GAAG,KAAK,CAAE,CAAC,SAAS,QAAQ,EAAC,CAAE;IAE9D,IAAI,qCAAqC,cAAc,KAAK,gBAAgB,GACzE,UAAU,OAAO,IAAG,MAAO,GAC7B;IACD,MAAM,YACJ,cAAc,MACd,GAAG,UAAU,OAAO,IAAG,MAAO,EAAC,GAC/B,EAAE,MAAM,WAAW,KAAK,OAAM,GAAG,KAAK,CAAE,CAAC,SAAS,QAAQ,EAAC,CAAE;GAEjE,CAAC;GAEL,MAAM,UAAU,UAAU,MAAM,cAAc,UAAU;GACxD,MAAM,UAAU,UAAU,OAAO,cAAc,UAAU;GACzD,aAAa,MAAM;IAAE,SAAS,QAAO;IAAI,SAAS,QAAO;GAAE,CAAE;EAC/D;;AAEJ;AAqCA,MAAM,YAUF,GACA,eAGA,UAEA,EAAE,KAAK,QAEH,YAEA,EAAE,MAAM,QAEJ,YAEA,KACE,GACA,SACA,SACA,OACA,SAAS,CACV,CACJ;AAET,MAAa,WAET,OAEc,MACd,EAAE,OAAO,QACL,SAAyC;CACvC,OAAO,EAAE;CACT,IAAI,EAAE;CACN,QAAQ,EAAE;CACV,QAAQ,KAAI,CAAO,CAAC,GAAG,KAAK;CAC5B,MAAM,EAAE,WAAU,CAAE;CACpB,IAAI;CACL,IACD,SAAgC;CAC9B,IAAI;CACJ,OAAO,EAAE;CACT,IAAI,EAAE;CACN,QAAQ,EAAE;CACV,QAAQ,EAAE;CACV,MAAM,EAAE,WAAU,CAAE;CACpB,QAAQ,EAAE;CACX;AAET,MAAa,gBAET,OAEc,MACd,EAAE,OAAO,QACL,SACE;CACE,OAAO,EAAE;CACT,IAAI,EAAE;CACN,QAAQ,EAAE;CACV,QAAQ,KAAI,CAAM,CAAC,GAAG,KAAK;CAC3B,MAAM,EAAE,WAAU,CAAE;CACpB,IAAI;GAEN,IAAI,IAEN,SACE;CACE,IAAI;CACJ,OAAO,EAAE;CACT,IAAI,EAAE;CACN,QAAQ,EAAE;CACV,QAAQ,EAAE;CACV,MAAM,EAAE,WAAU,CAAE;CACpB,QAAQ,EAAE;GAEZ,IAAI;;;ACjRd,MAAM,YACJ,aACqD;CACrD,OAAO,UAAU,OAAO;CACxB,KAAK,MAAkB,OAAO;CAC9B,KAAK,MAAM,OAAO;;AAQpB,MAAa,cAGT,WAEA,SAA0C,KAAI,CAAS,CAAC,MAAM,CAAC;AAEnE,MAAa,gBACX,UAC+C;CAC/C,OAAO,kBAAkB,IAAI;CAC7B,KAAK,cAAc,IAAI;CACvB,KAAK,cAAc,IAAI;;;;ACTzB,MAAa,YACX,KACA,MACA,KACA,KACA,SACA,UAA4D,MAAK,MAClC;CAO/B,MAAM,SAEF,iBAAgD,MAAK,OAAM,EAAE,KAAK,EAAC,EAAG;CAC1E,MAAM,aAAa,qBAAkC,GAAG;CAExD,OAAO;EACL,WAAU,MACR,EAAqB;GACnB,YAAY;GACZ,QAAQ;GACR,QAAQ,CACN,QACA,CAAC,EAAE,MAAM;IAAE,WAAW;IAAS,WAAW;GAAgB,EAAE,CAAE;GAEjE;EACH,WAAwC;GACtC,MAAM,WAAW,IACf,aACE,MACA,MACE,UAA0B,SAAS;IACjC,WAAW,CAAC,aAAa,GAAG;IAC5B,WAAW,CAAC,aAAa,OAAO;IACjC,CAAC,CACH,CACF;GAGH,OAAO,KAAI,CAAK,CACb,KAAmB,cAAc,QAAQ,CAAC,CAAC,CAC3C,KACC,QAAkB;IAChB,MAAM;IACN,IAAI,KAAI,CAAS,CAAC,GAAG,KAAK;IAC1B,QAAQ;IACR,aAAa,uBAAwC,UAAU,QAAQ,UAAU;IACjF,gBAAgB;IACjB,CAAC,CACH,CAAC;EACN;;AAEJ;AAEA,MAAa,iBACX,KACA,QAC+B;CAG/B,MAAM,UAAU,SACd,MACsB,MAAiC,IAAU,CAAC,CAAC;CAGrE,OAAO,SAAoB,KAAK,KAAI,CAAK,CAAC,KAAI,GAAIJ,MAAI,KAAK,OAAO;AACpE;AAEA,MAAa,eACX,KACA,QACsC;CAGtC,MAAM,UAAU,SACd,MACsB,MAAiC,IAAU,CAAC,CAAC;CAErE,OAAO,SACL,KACA,cAA2B,KAAI,CAAY,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,CAAE,IAC9D,MACE,IACE,GAAuB,KAAI,CAAY,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,CAAE,CAAC,CAAC,GAAG,GAC/D,MACE,UAAsC,SAAS;EAC7C,WAAW,CAAC,aAAa,OAAO;EAChC,KAAK,CACH,OACA,cAAc,KAAI,CAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAmB,KAAK,CAAC,CAAC,KAAI,CAAE;EAE9E,WAAW,CAAC,aAAa,OAAO;EACjC,CAAC,GAEJ,CAAC,GAEL,KACA,OAAO;AAEX;AAEA,MAAa,WACX,QACuC,YAAY,KAAK,EAAE;AAE5D,MAAM,iBAAoC,SAA4B;;;AC9HtE,MAAa,aACX,IACA,YACA,OAMA,WAAW,MACX,QAAQ,KAAK,IAAG,MAEhB,OAA0C,EAAE,MAAM,YAAW;CAC3D,MAAM,MAAM;EACV,WAAW,KAAK;EAChB,UAAU;EACV,QAAQ;EACR,GAAI,YAAY,EAAE,aAAa,EAAE,OAAO,WAAU,EAAE;;CAEtD,IAAI,QAAQ,YAAY,GAAG;CAI3B,MAAM,SAAS,KAAK,IAAG;CACvB,OAAO,GAAG,QAAkC,GAAG,CAAC,CAC7C,MACC,WAAS;EACP,IAAI,WAAW,YAAY,KAAK,IAAG,IAAK,KAAK;EAC7C,IAAI,YAAY,YAAY,SAAS,KAAK;EAC1C,MAAM,IAAI;EACV,IACE,UACA,aACC,YACC,QACE,KAAK,UAAU,GAAG,CAAC,CAAC,WAClB,sBACA,KAAK,UAAU,EAAE,OAAO,aAAa,CAAC,CACvC,GAEL,QACA,QACA,KAAK,IAAG,IAAK,KAAK;EAEpB,OAAO;CACT,GACA,OAAM,QAAM;EACV,IAAI,OAAO,KAAK,GAAG;EACnB,QAAQ,MAAM,GAAG;EACjB,MAAM,IAAI,cAAa,CAAE,CAAC;EAC1B,MAAM,IAAI,MAAM,GAAG;CACrB,CAAC;AAEP,CAAC;;;ACxDH,MAAa,eAAwB,IAAuB,OAA+C;CACzG,IAAI,CAAC,IAAI,OAAO;CAChB,aAAY;EACV,MAAM,EAAE,MAAM,MAAM,UAAU,GAAE;EAEhC,OAAO;GACL,MAAMK,KAAE,MAAM,EAAE,MAAM,GAAG,WAAW;IAAE,MAAM,YAAY,MAAM,EAAE;IAAG,GAAG;GAAG,EAAG;GAC5E,aAAa,GAAE,GAAI,KAAI;GACvB,OAAO,YAAW;IAChB,MAAM,GAAE;IACR,MAAM,MAAK;GACb;;CAEJ;AACF;;;ACAA,MAAM,SAAS,OAAe,IAAI,SAAc,MAAK,WAAW,GAAG,EAAE,CAAC;AAEtE,MAAM,qBAAqB,KAAK,OAAM,GAAG,UAAW,qBAAmB;AAEvE,MAAa,sBAAsB,OAAO,OAA8B;CAItE,QAAO,MAFS,GAAG,MACQ,CAAO,CAAC,QAAsC,EAAE,cAAc,EAAC,CAAE,GACxE;AACtB;AAEA,eAAe,mBAAmB,SAAkB;CAIlD,QAAO,MAHc,QAAQ,QAE1B,EAAE,kBAAkB,EAAC,CAAE,GACZ,SAAS,qBAAqB,MAAM;AACpD;AAEA,eAAsB,oBACpB,IACA,SACA,EAAE,SAAS,GAAG,YAAY,QAAoD,IAAE;CAEhF,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO;CACpC,MAAM,WAAW,KAAK,IAAG,IAAK;CAE9B,OAAO,MAAM;EACX,MAAM,SAAS,MAAM,mBAAmB,OAAO;EAC/C,IAAI,UAAU,OAAO,KAAK,OAAO,KAAK,GAAG;EAEzC,IAAI,KAAK,IAAG,IAAK,UACf,MAAM,IAAI,MAAM,kEAAkE;EAEpF,MAAM,MAAM,MAAM;CACpB;AACF;AAEA,gBAAuB,UAAU,IAAM;CACrC,IAAI,SAAS,MAAM,oBAAoB,EAAE;CACzC,MAAM,gBAAgB;CAEtB,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,WAAuB,UAAU;CAEpE,OAAO,MAAM;EACX,MAAM,SAAS,KAAK,KAClB;GACE,IAAI,EAAE,KAAK,OAAM;GACjB,KAAK,CACH;IACE,IAAI,OAAO,IAAI,GAAG,UAAS,mCAAoC;IAC/D,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,EAAC;MAEvB;IACE,IAAI;IACJ,IAAI;IACJ,cAAc,EACZ,YAAY;KACV,IAAI,OAAO,IAAI,GAAG,UAAS,mCAAoC;KAC/D,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,EAAC;;;KAM/B;GACE,UAAU;GACV,WAAW;GACX,iBAAiB;GAClB;EAGH,IAAI;GACF,WAAW,MAAM,QAAQ,QACvB,KAAK,MAAM,OAAO,KAAK,OAAO,MAAO,KAAK,EAAE,cAA+B,CAAC,IAAI,GAAG;IACjF,IAAI,KAAK,KAAK;IACd,IAAI,IAAI,OAAO,OAAO,SAAS,IAAI,GAAG;KACpC,MAAM,SAAS,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;KACzC,OAAO,OAAO,KAAK;KACnB,MAAM;MAAE;MAAQ;KAAG;IACrB,OAAO;KAEL,IAAI,IAAI,EAAE,UAAU,GAClB,MAAM,IAAI,MAAM,mCAAmC,KAAK,UAAU,GAAG,GAAG;KAE1E,MAAM,gBAAgB;KACtB,MAAM,OAAO,IAAI,EAAE;KACnB,KAAK,MAAM,YAAY,MACrB,IAAK;MAAC;MAAK;MAAK;KAAG,CAAW,CAAC,SAAS,QAAQ,GAC9C,cAAc,KAAK,GAAG,OAAO,KAAK,KAAK,SAA0B,CAAC;UAC7D,IAAI,SAAS,WAAW,GAAG,GAChC,cAAc,KAAK,SAAS,MAAM,CAAC,CAAC;KAGxC,MAAM;MAAE,QAAQ,IAAI,IAAI,aAAa;MAAG;KAAG;IAC7C;GACF;EAEJ,SAAS,GAAG;GACV,IAAI,oDAAoD;GACxD,QAAQ,MAAM,CAAC;GACf,SAAS,MAAM,oBAAoB,EAAE;GACrC,MAAM;EAER,UAAU;GACR,IAAI,kBAAkB;GACtB,MAAM,OAAO,MAAK,CAAE,CAAC,YAAW,CAAE,CAAC;EACrC;EAEA,MAAM,MAAM,aAAa;CAC3B;AACF;AAEA,MAAM,2BAAW,IAAI,IAAG;AAYxB,IAAI,UAAU;AAEd,MAAM,oBAAsB;CAC1B,IAAI,gBAAiC,CAAE;CAEvC,OAAO;EAAE,aADS,SAAW,MAAM,UAAU,CACpC;EAAS;CAAO;AAC3B;AAEA,MAAM,OAAO,OAAO,OAAU;CAC5B,IAAI,qBAAqB;CACzB,IAAI,SAAS,YAAW;CACxB,IAAI,QAAwB;CAC5B,MAAM,MAAM,YAAW;EACrB,WAAW,MAAM,SAAS,UAAU,EAAE,GAAG;GACvC,IAAI,OAAO,OAAO,SAAS,GAAG;GAC9B,QAAQ,SAAS,QAAQ,CAAC,GAAG,OAAO,KAAK,IAAI;GAC7C,OAAO,QAAO;EAChB;CACF;CACA,IAAG;CACH,MAAM,OAAO,mBAAe;EAC1B,OAAO,MAAM;GACX,MAAM,OAAO;GACb,MAAM,IAAI;GACV,QAAQ;GACR,SAAS,YAAW;GACpB,MAAM;EACR;CACF;CACA,WAAW,MAAM,UAAU,KAAI,GAAI;EACjC,IAAI,CAAC,QAAQ;GACX,IAAI,0CAA0C;GAC9C,KAAK,MAAM,KAAK,SAAS,OAAM,GAC7B,KAAK,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAM,CAAE,GACjC,GAAG,IAAI;GAGX;EACF;EACA,KAAK,MAAM,EAAE,QAAQ,SAAS,QAAQ;GACpC,MAAM,IAAI,SAAS,IAAI,IAAI,EAAE;GAC7B,IAAI,CAAC,GAAG;GACR,KAAK,MAAM,EAAE,IAAI,MAAM,KAAK,WAAW,CAAC,GAAG,EAAE,OAAM,CAAE,GACnD,IAAI,CAAC,SAAS,IAAI,OAAO,MAAO,QAAQ,OAAO,OAAQ,KAAK,MAAK,MAAK,OAAO,IAAI,CAAC,CAAC,IAAI;IACrF,GAAG,GAAG;IACN,IAAG;GACL;EAEJ;CACF;AACF;AAEA,MAAM,YACJ,MACA,MACA,OACA,OACE;CACF,MAAM,KAAK,KAAK;CAChB,IAAI,IAAI,SAAS,IAAI,EAAE;CACvB,IAAI,CAAC,GAAG,SAAS,IAAI,IAAK,oBAAI,IAAI,IAAG,CAAG;CACxC,MAAM,KAAK,OAAO,WAAU;CAC5B,MAAM,YAAW;EACf,EAAG,OAAO,EAAE;EACZ,IAAI,EAAG,SAAS,GAAG,SAAS,OAAO,EAAE;CACvC;CACA,EAAE,IAAI,IAAI;EAAE;EAAI;EAAM;EAAO;CAAG,CAAE;CAClC,IAAI,CAAC,SAAS;EACZ,UAAU;EACV,KAAK,KAAK,EAAE,EAAE;CAChB;CACA,OAAO;AACT;AAOA,IAAI,iBAAuC;AAE3C,MAAa,kBAAkB,OAC7B,EAAE,YAAY,YAAY,GAAG,WAAW,KACxC,eACE;CACF,MAAM,EAAE,OAAO,WAAW;CAC1B,OAAO,mBAAmB,QAAQ,KAC/B,MAAM,GAAG,gBAAgB,IAAI,EAAE,UAAU,KAAI,CAAE,CAAC,CAAC,QAAO,GAAI,KAC3D,MACE,KAAK,GACF,WAAW,EAAE,IAAI,CAAC,CAClB,WAAW,EAAE,WAAW,aAAY,EAAE,GAAI,CAAC,EAAE,MAAM,EAAE,WAAW,iBAAgB,EAAE,CAAE,CAAC,CAAC,CAC5F,CACF,CAAC,WAAU,CAAE,CAAC;CAEf,MAAM,aAA2C;EAAE,GAAI,IAAI,iBAAkD,IAAG,MAAK,CAAC,IAAI;EAAK,WAAW;CAAC;CAE3I,IAAI,SAAS,YAAW;CACxB,SAAS,YAAY,IAAI,OAAO,KAAK,UAAU,IAAI,MAAM,IAAG,QAAM;EAChE,IAAI,YAAY,mBAAmB,GAAG;EACtC,OAAO,QAAQ,GAAG;CACpB,CAAC;CAED,OAAO;EACL,SAAS,YAAW;GAClB,MAAM,MAAM,MAAM,OAAO;GAEzB,MAAM,QAAQ,KAAK,IAAG;GACtB,IAAI,KAAK,MAAM,oBAAoB,WAAW,EAAE,IAAI,IAAI,EAAE;GAC1D,IAAI,YAAY,oBAAoB,KAAK,IAAG,IAAK,KAAK;GACtD,OAAO,OAAO;EAChB;EACA,OAAO,YAAW,CAAE;;AAExB;;;ACzOA,MAAa,UAKT;CACF,aAAa,GAAG,SAAS,CACvB,EAAE,WAAW,GAAG,IAAI,GACpB;EAAC,OAAO,EAAE,eAAc;EAAqB;EAAM;CAAG;CAExD,aAAa,GAAG,SAAS,CACvB,EAAE,WAAW,GAAG,IAAI,GACpB;EAAC,OAAO,EAAE,eAAc;EAAqB;EAAM;CAAG;;;;ACZ1D,MAAM,mBAAmB,kBAAsE;CAC7F,QAAQ,IAAI,SAAS,cAAc,IAAI,KAAK,OAAO,OAAO,CAAC;AAC7D;AACA,MAAM,WACH,IAAc,6BACE,GAAG,SAAwC;CAC1D,MAAM,aAAa,wBAAqC,IAAI,IAAI;CAChE,OAAO,cAAe,EAAE,MAAK,UAAS,YAAW,MAAK,EAAE,IAAI,KAAK,CAAC,EAAC;AACrE;AACF,MAAM,OAAkC,IAAc,MACpD,EAAE,WAAW,IACT,UACsB,MAAkC,WAAU,CAAU,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,EAAC,CAAE;AACrG,MAAMC,WAAiC,IAAI,MAAO,EAAE,WAAW,KAAI,MAAK,EAAE,EAAE,EAAG,IAAI,IAAI,IAAI,CAAC;AAC5F,MAAa,OAAiB,QAAQ,QAAQ,gBAAgBA,OAAK,CAAC;AACpE,MAAa,OAAiB,QAAQ,QAAQ,gBAAgB,GAAG,CAAC;AAClE,MAAa,MAAgB,QAAQ,OAAO,gBAAgBA,OAAK,CAAC;;;ACvBlE,MAAa,YAAY,OAAkB,KAAK,OAAM,GAAG,UAAW;CAAE,GAAG,GAAG,OAAO;CAAI,GAAG;AAAC,CAAE;AAE7F,MAAa,kBACX,MACA,UACE;CAIF,MAAM,EAAE,YAAY,WAAW,KAAK,UAAU;CAC9C,MAAM,eAAe,cAAc,UACjC,OAA0D,YAAY;EACpE,WAAW,CAAC,aAAa,CAAC;EAC1B,KAAK,CAAC,OAAO,CAAC;EACf,CAAC;CAGJ,MAAM,iCAA6D,cAAc,OAAO,OACtF,iBAAgE,aAAa,GAAG,MAC7E,MAAM,MAAM,EAAE,WAAW,GAAG,IAAK,KAAI,CAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAC5E;CAEH,MAAM,YAAY,iCAAiC,KAAK,KAAK,GAAG,8BAA8B,IAAI;CAClG,MAAM,eACJ,QACA,YAAY,UACgC;EAC5C,MAAM,YAAY,KAChB,SACI,KAAI,CAAS,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,MAAM,SAAS,OAAO,EAAE,CAAC,CAAC,IAC5D,KAAI,CAAK,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,IAAmB,IAAI,CAAC,GAC1D,SAAS,OAAO,SAAS,MAAM,KAAK,GACpC,YAAY,MAAM,SAAS;EAE7B,MAAM,KAAK,KAAI,CAAW,CACvB,KAAK,QAAQ,SAAS,CAA6B;EACtD,OAAQ,eAAe,GAAG,KAAK,YAAY,IAAI;CACjD;CACA,OAAO;EAAE;EAAa;CAAS;AACjC;;;ACAA,MAAa,cAA4B;AACzC,MAAMC,cAMJ,MACA,OACA,YACA,OAAO,OACP,OACA,QAAoC,OAC6B;CAGjE,MAAM,EAAE,YAAY,YAAY,UAAU;CAE1C,MAAM,EAAE,aAAa,cAAc,eAAe,MAAM,KAAK;CAE7D,MAAM,KAAK,WAAW,EAAE,IACtB,OAAO,WAAW;CAEpB,MAAM,OAAOJ,SACV,WAAW,KAAK,CAAC,CACjB,wBAAO,IAAI,MAAK,GAAG,QAAQ,EAAE,CAAC,CAC9B,OAAO,WAAW;CACrB,IAAI,CAAC,YAAY,aAAa,YAAY,cAAc;MACnD,IAAI,YAAY,eAAe,MAAM,MAAM,IAAI,MAAM,cAAc,WAAU,cAAe;CAEjG,MAAM,OAAO,GAAG,WAAiB,QAAQ;CACzC,MAAM,qBAAqB,GAAG,WAAsB,OAAO,MAAM,aAAa,WAAW;CAEzF,MAAM,MAAM;CACZ,MAAM,OACJ,YACA,UACsC;EAKtC,MAAM,eAAe,YAAW;GAC9B,MAAM,mBAAmB,KAAI,CAAE,CAAC,MAAM,IAAI;GAC1C,IACE,+BACA,YACA,OAAO,mBAAmB,eAAc,UAAW;GAErD,IACE,QACA,CAAC,GAAI,SAAS,IAAI,mBAAmB,cAAc,CAAC,EAAE,KAAI,KAAM,EAAG,GACnE,gCAAgC;GAElC,SAAS,OAAO,mBAAmB,cAAc;EACnD;EACA,MAAM,QAAQ,YAAY,QAAQ,IAAI,CAAC,aAAY,GAAI,KAAK,UAAU,EAAE,KAAK,WAAU,CAAE,CAAC,CAAC;EAE3F,MAAM,YAAY,MAAiC,OAAgC;GACjF,OAAO,mBAAmB;IAAE;IAAM,MAAM,KAAI;IAAI;GAAK,IAAK,EAAE;EAC9D;EACA,MAAM,YACH,MAA0B,SAC1B,MAAkB,OAAe,QAAsC;GACtE,MAAM,SAAS,MAAM,EAAE;GACvB;GACA,MAAM;IAAE;IAAK,OAAO,GAAG,WAAU,MAAO,WAAW,eAAc,IAAK;GAAO;;EAEjF,MAAM,OAAO,SAAS,IAAI,GAAG;EAE7B,MAAM,OAAe;GACnB,OAAO,MAAM;GACb,iBAAiB,WAAW,IAAI,IAAI;GACpC,YAAY,WAAW,IAAI,KAAK;GAChC,OAAO,KAAK,OAAO,IAAI,KAAI,CAAE,CAAC,CAAC,IAAG;GAClC,SAAS;GACT,UAAU,WAAW,UAClB,OAAiB;IAChB,YAAY,EAAE,WAAW;IACzB,QAAQ,EAAE;IACV,QAAQ,EAAE;KACV;;EAKN,MAAM,cAAc,QAAQ,QAAQ,KAAK,OAAO,sBAAsB,CAAC;EACvE,MAAM,OAAW,SAAS,KAAK;EAG/B,MAAM,QAAQ,YAAiB;GAC7B,IACE,oBACA,YACA,OAAO,mBAAmB,eAAc,2EAA4E;GAEtH,MAAM,mBAAmB,WACvB,EAAE,SAAS,KAAI,GACf,EAAE,MAAM;IAAE,SAAS;IAAO,OAAO;GAAI,EAAE,CAAE;GAE3C,IAAI,yBAAyB,UAAU;GAEvC,OAAO,KAAK,OAAO,iBAAiB;EACtC;EAEA,MAAM,cACJ,QAAQ,IAAI,CACV,KAAK,QAAQ;GAAE,KAAK;GAAY;GAAM,KAAK;EAAI,CAAE,GACjD,KAAK,QAAQ,EAAE,KAAK,WAAU,CAAE,EACjC,CAAC,CAAC,MAAK,OACN,KACE,QAAQ,EAAE,GACV,GAAG,KACC,sCAAsC,GAAG,EAAE,CAAC,OAC5C,GAAG,KACD,oBACA,aAAa,CACpB;EAEL,MAAM,WACH,CAAC,MAAM,YACR,YAAiB;GACf,MAAM,iBAAiB,OACrB,SACE;IACF,IAAI,CAAC,KAAK,MAAM;IAChB,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,QAAQ,MAAM,KAAK,KAAK;IAC1D,MAAM,EAAE,YAAY,QAAQ,WAAW;KACrC,YAAY,GAAG,WAAc,CAAC;KAC9B,QAAQ;KACR,QAAQ;;IAEV,MAAM,CAAC,QAAQ,OAAO,QAAQ,OAAO,CAAC,YAAY,MAAM;IACxD,IAAI,YAAY,OAAO,mBAAmB,eAAc,YAAa,GAAG,GAAG;IAC3E,MAAM,QAAQ,IAAI,CAAC,aAAY,GAAI,MAAM,CAAC;IAC1C,IAAI,iBAAiB,OAAO,mBAAmB,eAAc,YAAa,GAAG,GAAG;GAClF;GACA,IAAI,CAAC,MAAM;IACT,IAAI,sBAAsB,YAAY,IAAI;IAC1C,MAAM,eAAe,UAAU,EAAE,KAAI,CAAE;GACzC;GACA,IAAI,kBAAkB;GAEtB,MAAM,YACJ,oBACA,EAAE,QAAQ,EAAC,GACX;IACE,yBAAyB,EAAE,QAAQ,KAAI;IACvC,MAAM,YAAY,KAAI;IACvB;GAGH,MAAM,YACJ,oBACA,EAAE,SAAS,EAAC,GACZ;IACE,yBAAyB,EAAE,SAAS,KAAI;IACxC,MAAM,aAAa,KAAI;IACxB;GAGH,MAAM,YACJ,oBACA;IAAE,SAAS;IAAG,OAAO;IAAG,QAAQ;GAAC,GACjC;IACE,yBAAyB;KAAE,SAAS;KAAM,OAAO;KAAM,QAAQ;IAAI;IACnE,MAAM,mBAAmB,KAAI;IAC9B;GAGH,MAAM,YACJ,oBACA;IAAE,SAAS;IAAG,OAAO;GAAC,GACtB;IACE,yBAAyB;KAAE,SAAS;KAAM,OAAO;IAAI;IACrD,MAAM,sBAAsB,KAAI;IACjC;GAGH,MAAM,YACJ,oBACA,EAAE,SAAS,EAAC,GACZ;IACE,yBAAyB;KAAE,SAAS;KAAM,OAAO;KAAM,QAAQ;IAAI;IACnE,MAAM,mBAAmB,KAAI;IAC9B;GAEH,MAAM,iBAAiB,IAAI,IAAI;GAC/B,MAAM,GAAG,QAAQ;IACf,SAAS;IACT,8BAA8B,EAAE,SAAS,KAAI;IAC9C;GACD,MAAM,YACJ,YACA,EAAE,WAAW,EAAC,GACd,YACI;IACE,yBAAyB,UAAU,IAAI,KAAI,CAAE;IAC7C,MAAM,oBAAoB,KAAI;OAEhC,EAAE;GAER,MAAM,QAAO;GAEb,MAAM,QAAO;GACb,OAAO,SAAS,EAAE,CAAC,CAAC,YAAW;IAE7B,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,GAAI,CAAC;IACtD,OAAO,KAAK,MAAM,IAAI,GAAG,2BAA2B;GACtD,GAAG,oCAAoC;EACzC;EAGF,MAAM,SAAS,WAAkD,YAAiB;GAChF,MAAM,aAAwC,GAC5C,QAAQ,KAAI,CAAK,CAAC,GAAG,WAAW,CAAC,CAAC,KAAI,GAAI,GAAG,CAAC,CAC/C,CAAC,GAAG;GACL,MAAM,QAAQ,QAAQ,IAAW,YAAY,KAAK,IAAI;GAEtD,MAAM,aAA2C,cAC/C,MAAsB;IACpB,OAAO,CAAC,SAAS,SAAS,IAAI,OAAO,KAAI,CAAK,CAAC,KAAI,GAAI,GAAG,IAAI,KAAI,CAAK,CAAC,KAAI,CAAE;IAC9E,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC;IAC9B,KAAK,CAAC,OAAO,KAAI,CAAS,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE;IAC5C,CAAC;GAGJ,MAAM,eAAe,YAAY,MAAM,CAAC,CACrC,KAAK,UAAU,CAAC,CAChB,KACC,QAA8C;IAC5C,MAAM;IACN,IAAI,KAAI,CAAa,CAAC,GAAG,KAAK;IAC9B,QAAQ;IACR,MAAM,EACJ,KAAK,CAAC,OAAO,KAAI,CAAW,CAAC,KAAI,CAAE;IAErC,aAAa,KAAI,CAA+B,CAAC,KAC/C,cACE,IACE,GAAuC,KAAI,CAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,CAAE,CAAC,CAC3E,IAAG,CAAW,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,CAAE,GAE1C,KAAI,CAAa,CAAC,KAAI,GACtB,aAAa,KAAI,CAAa,CAAC,KAAI,GAAI,IAAG,CAAW,CAAC,KAAK,CAAC,CAAC,KAAI,CAAE,CAAC,CACrE,CACF,CACF,CAAC;IACF,gBAAgB;IACjB,CAAC,CACH,CAAC;GAEJ,MAAM,SAAS,MAAM,WAAU;GAE/B,MAAM,IAAI,MAAM,UAAiB,IAAI,aAAY,MAC/C,EAAE;IAAE,MAAM;IAAY,OAAO;GAAY,CAAE,CAAC;GAE9C,MAAM,QAAQ,KAAK,IAAG;GACtB,MAAM,MAAM,MAAM,mBAAmB,WAAW;IAAE,SAAS;IAAM,OAAO;IAAM,QAAQ;GAAI,CAAE;GAC5F,IACE,4CACA,KAAK,IAAG,IAAK,OACb,KACA,OAAO,mBAAmB,eAAc,4DAA6D;GAEvG,OAAO,KAAK,MAAM;IAAE,QAAQ;IAAG,IAAI,QAAQ;IAAI;GAAM,CAAE,GAAG,6BACxD,OAAO,MAAK,CAAE;EAElB;EAMA,MAAM,mBAA+B,gBAAgB,MAAM,UAAU;EACrE,MAAM,SACH,SACD,YAAiB;GACf,MAAM,EAAE,QAAQ,IAAI,WAAW;GAC/B,MAAM,QAAQ,KAAK,IAAG;GAEtB,IAAI,YAAY,YAAY,sBAAsB,KAAK,IAAG,IAAK,KAAK;GACpE,MAAM,QAAQ,OAAO;GACrB,MAAM,SAAS,WAAW,IAAI,KAAK;GACnC,MAAM,KAAK,UAAU,EAAE,KAAK,WAAU,GAAI,EAAE,MAAM,EAAE,KAAK,EAAC,EAAE,GAAI,EAAE,QAAQ,KAAI,CAAE;GAEhF,MAAM,UAAU,OAAO,QAAO;GAC9B,MAAM,YAAY,MAAM,UACtB,IACA,aACA,MACE,EAAmC;IACjC,MAAM;IACN,OAAO,KAAI,CAAwB,CAChC,KAAK,QAAQ,KAAI,CAAwB,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,IAAa,IAAI,CAAC,CAAC,CAAC,CAAC,CACjF,KACC,MACE,IAAG,CAA6B,CAAC,EAC/B,QAAQ,CACN,UACA,GAAG,QAAQ,KAAI,CAAwB,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,GAAI,GAAG,CAAC,IAEpE,CAA0C,CAC5C,CACF,CACA,KAAK,MAAM,KAAK,CAAC,CACjB,KAAK,MAAM,CAAC,CAAC;IACjB,GACH,OACA,KAAK;GAEP,OAAO,KACL,MAAM;IAAE,IAAI,OAAO,OAAO;IAAe;IAAW;IAAQ;IAAS;GAAK,CAAE,GAC5E,gCAAgC;EAEpC;EAGF,MAAM,SAAS,MAAS,YAAiB;GACvC,IACE,YACA,sCAAsC,mBAAmB,eAAc,8CAA+C;GAExH,MAAM,mBAAmB,WAAW;IAAE,SAAS;IAAM,OAAO;GAAI,CAAE;GAClE,IAAI,iCAAiC;GACrC,OAAO,KAAK,MAAM,CAAC,GAAG,6BAA6B;EACrD;EAUA,MAAM,SAAS,MAAS,YAAiB;GACvC,IACE,+BACA,OAAO,mBAAmB,eAAc,kGAAmG;GAE7I,MAAM,QAAQ,KAAK,IAAG;GACtB,MAAM,mBAAmB,WAAW,EAAE,SAAS,KAAI,GAAI,CACrD,EACE,MAAM;IACJ,SAAS;IACT,OAAO;IACP,QAAQ;OAGb;GACD,IAAI,gCAAgC,KAAK,IAAG,IAAK,KAAK;GACtD,OAAO,KAAK,MAAM,CAAC,GAAG,eAAe;EACvC;EAGA,MAAM,SAAS,MAAS,YAAiB;GACvC,MAAM,QAAQ,KAAK,IAAG;GACtB,MAAM,QAA4B,EAChC,MAAM;IACJ,IAAI,EAAE;IACN,KAAK;;GAGT,IAAI,EAAE,OAAO,MAAM,OAAO;IAAE,GAAG,MAAM;IAAM;GAAI;GAC/C,MAAM,KAAK,UAAU,EAAE,KAAK,WAAU,GAAI,OAAO,EAAE,QAAQ,KAAI,CAAE;GACjE,IACE,kBACA,KAAK,IAAG,IAAK,OACb,OAAO,KAAK,eAAc,uBAAwB,WAAU,QAC5D,OACA,qBAAqB;GAEvB,OAAO,MAAM,CAAC;EAChB;EAEA,MAAM,SAAS,MAAgB;GAC7B,OAAO,SAAS,EAAE,UAAU,OAAO,UAAU,CAAC,OAE1C,EAAE,QAAQ,MAAK,QACb,MACI,KAAK,MAAM;IAAE,KAAK;IAAY,IAAI,EAAE;GAAE,CAAE,GAAG,SAAS,IACpD,MAAM;IAAE,GAAG;IAAG,SAAS,EAAE,OAAO,QAAO;GAAE,CAAE,CAAC,GAEpD,iBAAiB;EAErB;EACA,OAAO,OACH,eAAe,QAAQ,QAAQ,KAAK,MAAM,IAAI,GAAG,2BAA2B,CAAC,CAAC,IAC9E;CACN;CACA,MAAM,YAAY,KAAI,CAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAW,IAAI,CAAC;CACrE,OAAO;EACL,SAAQ,MACN,EAAwB;GACtB,MAAM;GACN,OAAO,QAAQ,SAAS;GACxB,MAAM,SAAS,MAAM,GAAG;GACzB;EACH,KAAK;;AAET;AASA,MAAa,WACX,MAGA,YACA,OAAO,OACP,UAEA,MACE,UAASI,WAAS,MAAM,OAAO,YAAY,MAAM,OAAO,KAAK,KAAK,GAClE,WAAU,GACV,aACA,UAAU;;;ACzbd,MAAMA,cAMJ,MACA,OACA,YACA,UAC+D;CAC/D,MAAM,OAAOJ,SACV,WAAW,KAAK,CAAC,CACjB,wBAAO,IAAI,MAAK,GAAG,QAAQ,EAAE,CAAC,CAC9B,OAAO,WAAW;CACrB,IAAI,CAAC,YAAY,aAAa,YAAY,cAAc;MACnD,IAAI,YAAY,eAAe,MAAM,MAAM,IAAI,MAAM,yBAAyB;CAEnF,MAAM,EAAE,YAAY,YAAY,WAAW,KAAK,UAAU;CAE1D,MAAM,iCACJ,cACA,OAAO,OACL,iBAAgE,aAAa,GAAG,MAC7E,MAAM,MAAM,EAAE,WAAW,GAAG,IAAK,KAAI,CAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAC5E;CAEL,MAAM,YAAY,iCACd,KAAK,KAAK,GAAG,8BAA8B,IAC3C;CAEJ,MAAM,MAAM;CACZ,MAAM,KAAK,WAAW,EAAE,IACtB,OAAO,WAAW;CACpB,MAAM,OAAO,GAAG,WAAiB,QAAQ;CAIzC,MAAM,eACJ,cACA,UACE,OAA2C,YAAY;EACrD,WAAW,CAAC,aAAa,CAAC;EAC1B,KAAK,CAAC,OAAO,CAAC;EACf,CAAC;CAEN,MAAM,aAAa,KAAI,CAAK,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,IAAmB,IAAI,CAAC;CAEzE,MAAM,UAAU,WAAiD;EAC/D,MAAM,YAAkC,KACtC,UAAU,KAAI,CAAS,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,OAAO,SAAS,OAAO,EAAE,CAAC,CAAC,GACvE,WACA,YACA,SAAS,MAAM,KAAK,CAAC;EAEvB,MAAM,KAAK,KAAI,CAAW,CAAC,KAAK,QAAQ,SAAS,CAAmC;EACpF,QAAQ,eAAe,GAAG,KAAK,YAAY,IAAI,IAAI,KAAsB,KAAK;CAChF;CAEA,MAAM,OACJ,eACsC;EAKtC,MAAM,QAAQ,YAAW,CAAE;EAC3B,MAAM,YAAY,MAAiC,OAAgC;GACjF,OAAO,mBAAmB;IAAE;IAAM,MAAM,KAAI;IAAI;GAAK,IAAK,EAAE;EAC9D;EACA,MAAM,QAAQ,MAAkB,OAAe,QAAsC;GACnF,MAAM,SAAS,MAAM,EAAE;GACvB,MAAM;GACN,MAAM;IAAE;IAAK;GAAK;;EAGpB,MAAM,OAAe;GACZ;GACP,iBAAiB,WAAW,IAAI,IAAI;GACpC,YAAY,WAAW,IAAI,KAAK;GAChC,OAAO,KAAK,OAAO,IAAI,KAAI,CAAE,CAAC,CAAC,IAAG;GAClC,SAAS;GACT,UAAU,WAAW,UAClB,OAAiB;IAChB,YAAY,EAAE,WAAW;IACzB,QAAQ,EAAE;IACV,QAAQ,EAAE;KACV;;EAKN,MAAM,cAAc,QAAQ,QAAQ,KAAK,OAAO,iBAAiB,CAAC;EAClE,MAAM,OAAW,SAAS,KAAK;EAG/B,MAAM,QAAQ,YAAiB;GAC7B,IAAI,kBAAkB;GACtB,MAAM,iBAAiB,IAAI,IAAI;GAC/B,MAAM,GAAG,QAAQ;IACf,SAAS;IACT,8BAA8B,EAAE,SAAS,KAAI;IAC9C;GAED,MAAM,YACJ,YACA,EAAE,WAAW,EAAC,GACd;IACE,yBAAyB,EAAE,WAAW,EAAE,KAAK,KAAI,EAAE;IACnD,MAAM,eAAe,KAAK,OAAM,GAAG,KAAK,CAAE,CAAC,SAAS,QAAQ;IAC7D;GAGH,IAAI,kBAAkB;IAAE;IAAY;GAAI,CAAE;GAC1C,MAAM,KAAK,MAAM,QAAQ,IAAI,CAC3B,KAAK,QAAQ;IAAE,KAAK;IAAY;GAAI,CAAE,GACtC,KAAK,QAAQ,EAAE,KAAK,WAAU,CAAE,EACjC;GACD,IAAI,mBAAmB;IAAE;IAAY;GAAE,CAAE;GACzC,OAAO,KAAK,QAAQ,EAAE,GAAG,iBAAiB;EAC5C;EACA,MAAM,WACH,CAAC,MAAM,YACR,YAAiB;GACf,MAAM,iBAAiB,OACrB,SACE;IACF,IAAI,CAAC,KAAK,MAAM;IAChB,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,QAAQ,MAAM,KAAK,KAAK;IAC1D,MAAM,EAAE,YAAY,QAAQ,WAAW;KACrC,YAAY,GAAG,WAAc,CAAC;KAC9B,QAAQ;KACR,QAAQ;;IAEV,MAAM,CAAC,QAAQ,OAAO,QAAQ,OAAO,CAAC,YAAY,MAAM;IACxD,IAAI,YAAY,GAAG,GAAG;IACtB,MAAM;IACN,IAAI,iBAAiB,GAAG,GAAG;GAC7B;GACA,IAAI,UAAU,CAAC,MAAM,MAAM,eAAe,MAAM;GAChD,OAAO;IACL,MAAM,SAAS,YAAW;KACxB,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,GAAI,CAAC;KACtD,OAAO,KAAK,MAAM,IAAI,GAAG,2BAA2B;IACtD,CAAC;IACD,MAAM;IACN,MAAM;KAAE,OAAO;KAAsC,KAAK;IAAS;;EAEvE;EAIF,MAAM,mBAA+B,gBAAgB,MAAM,UAAU;EACrE,MAAM,SAAS,WAAkD,YAAiB;GAChF,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC,KAAK,WAAW,IAAI,WAAW,IAAI,CAAC,CAAC,CAAC;GACjE,MAAM,SAAS,MAAM,WAAU;GAE/B,MAAM,UAAU,OAAO,QAAO;GAC9B,MAAM,YAAY,MAAM,UAAmB,IAAI,aAAY,MACzD,EAAoB;IAClB,MAAM;IACN,OAAO;IACR,CAAC;GAGJ,OAAO,KACL,MAAM;IAAE;IAAW,IAAI,UAAU,OAAO;IAAe;IAAQ;GAAO,CAAE,GACxE,uBACM,OAAO,MAAK,CAAE;EAExB;EAUA,MAAM,SAAS,MAAS,YAAiB;GACvC,MAAM,KAAK,UAAU,EAAE,KAAK,WAAU,GAAI,EAAE,MAAM;IAAE,IAAI,EAAE;IAAI;GAAI,EAAE,GAAI,EAAE,QAAQ,KAAI,CAAE;GACxF,OAAO,MAAM,CAAC;EAChB;EAEA,MAAM,SAAS,MAAgB;GAC7B,OAAO;IACL,MAAM,EAAE,UAAU,OAAO;IACzB,MAAM;KAAE,KAAK;KAAW,OAAO;IAAiB;IAChD,MAAM,eACJ,EAAE,QAAQ,MAAK,QACb,MACI,KAAK,MAAM;KAAE,KAAK;KAAY,IAAI,EAAE;IAAE,CAAE,GAAG,SAAS,IACpD,MAAM;KAAE,GAAG;KAAG,SAAS,EAAE,OAAO,QAAO;IAAE,CAAE,CAAC,CACjD;;EAGP;EACA,OAAO;CACT;CACA,OAAO,EACL,KAAK;AAET;AAQA,MAAM,kBAAqB,EAAE,KAAK,KAAI,CAAiB,CAAC,OAAM;AAC9D,MAAa,QACX,MACA,YACA,QAAoC,OAEpC,MACE,UAASI,WAAS,MAAM,MAAM,KAAK,YAAY,KAAK,GACpD,EAAE,KAAK,KAAI,CAAkC,CAAC,OAAM,IACnD,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,GAAG,CAAC,EAAC,IACtD,QAAQ;;;AC9OZ,MAAM,YAMJ,MACA,OACA,UACwB;CAExB,MAAM,EAAE,gBAAgB,eAAe,MAAM,KAAK;CAClD,MAAM,EAAE,eAAe;CACvB,QACE,eACqC;EACrC,MAAM,QAAiC,MAAM,IAAc,IAAI;EAC/D,MAAM,SAAS,YAAY,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;EACpE,QAAO,MACL,EAAoB;GAClB,MAAM;GACN,OAAO,KAAI,CAAW,CAAC;GACvB,MAAM;GACP;CACL;AACF;AAEA,MAAa,UACX,MACA,QAAoC,OAEpC,MACE,UAAS,SAAS,MAAM,OAAO,KAAK,GACpC,WAAU,GACV,aACA,UAAU","names":["id","concat","assertNotNull","crypto","str","n","first","executes"],"ignoreList":[],"sources":["../lib/expression/expr-base.ts","../lib/expression/arith.ts","../lib/utils/json.ts","../lib/utils/map-object.ts","../lib/expression/val.ts","../lib/expression/logic.ts","../lib/field/field.ts","../lib/accumulators/index.ts","../lib/aggregate/prefix.ts","../lib/expression/concat.ts","../lib/expression/array.ts","../lib/aggregate/raws.ts","../lib/aggregate/mongo-stages.ts","../lib/aggregate/group/utils/sub-group.ts","../lib/expression/date.ts","../lib/expression/range.ts","../lib/update/updater.ts","../lib/utils/coll.ts","../lib/aggregate/out.ts","../lib/aggregate/$merge.ts","../lib/aggregate/group/utils/sub-merge.ts","../lib/aggregate/group/$group-merge.ts","../lib/aggregate/set/$replace-with-each.ts","../lib/aggregate/set/$set-delta.ts","../lib/utils/guard.ts","../lib/predicate/utils.ts","../lib/predicate/$eq.ts","../lib/predicate/$expr.ts","../lib/predicate/$in.ts","../lib/aggregate/match/$match-delta.ts","../lib/aggregate/match/$match.ts","../lib/aggregate/unwind/$unwind-delta.ts","../lib/aggregate/unwind/index.ts","../lib/aggregate/lookup/$lookup-delta.ts","../lib/aggregate/lookup/$lookup-raw.ts","../lib/utils/before.ts","../lib/utils/log.ts","../lib/utils/db-indexes.ts","../lib/utils/merge/utils.ts","../lib/utils/merge/next-winner.ts","../lib/utils/merge/merge.ts","../lib/utils/merge/combiners.ts","../lib/machine.ts","../lib/aggregate/lookup/index.ts","../lib/aggregate/set/$set.ts","../lib/aggregate/$upsert.ts","../lib/stream/aggregate.ts","../lib/utils/tear-down.ts","../lib/watch.ts","../lib/boot/boot-utils.ts","../lib/query/logic.ts","../lib/boot/first-stages.ts","../lib/boot/boot.ts","../lib/boot/boot-simpl.ts","../lib/boot/single.ts"],"sourcesContent":["import type { rawItem } from '../../types'\nimport type { BoolExpr, Expr, ExprRaw } from '../types'\n\nexport const asExprRaw = <T, Doc, Ctx>(raw: rawItem) => ({ get: () => raw }) as ExprRaw<T, Doc, Ctx>\nexport const asExpr = <T, Doc, Ctx = unknown>(r: Pick<Expr<T, Doc, Ctx>, 'raw'>) =>\n r as Expr<T, Doc, Ctx>\n\nexport const asBoolExpr = <D1, D2, Ctx = unknown>(r: Pick<BoolExpr<D1, D2, Ctx>, 'raw'>) =>\n r as BoolExpr<D1, D2, Ctx>\n","import type { N } from '../..';\nimport type { Expr } from '../types'\nimport { asExpr, asExprRaw } from './expr-base'\n\nexport const max = <D, C>(...expr: Expr<number, D, C>[]) =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $max: expr.map(e => e.raw(f).get()) }),\n })\nexport const min = <D, C>(...expr: Expr<number, D, C>[]) =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $min: expr.map(e => e.raw(f).get()) }),\n })\n \nexport const lt: {\n <D, C>(...expr: [Expr<Date, D, C>, Expr<Date, D, C>]): Expr<boolean, D, C>\n <D, C>(...expr: [Expr<number, D, C>, Expr<number, D, C>]): Expr<boolean, D, C>\n} = <D, C>(...expr: [Expr<number | Date, D, C>, Expr<number | Date, D, C>]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $lt: expr.map(e => e.raw(f).get()) }),\n })\nexport const gt: {\n <D, C>(...expr: [Expr<Date, D, C>, Expr<Date, D, C>]): Expr<boolean, D, C>\n <D, C>(...expr: [Expr<number, D, C>, Expr<number, D, C>]): Expr<boolean, D, C>\n} = <D, C>(...expr: [Expr<number | Date, D, C>, Expr<number | Date, D, C>]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $gt: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const lte: {\n <D, C>(...expr: [Expr<Date | N, D, C>, Expr<Date | N, D, C>]): Expr<boolean, D, C>\n <D, C>(...expr: [Expr<number | N, D, C>, Expr<number | N, D, C>]): Expr<boolean, D, C>\n} = <D, C>(...expr: [Expr<number | Date | N, D, C>, Expr<number | Date | N, D, C>]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $lte: expr.map(e => e.raw(f).get()) }),\n })\nexport const gte: {\n <D, C>(...expr: [Expr<Date | N, D, C>, Expr<Date | N, D, C>]): Expr<boolean, D, C>\n <D, C>(...expr: [Expr<number | N, D, C>, Expr<number | N, D, C>]): Expr<boolean, D, C>\n} = <D, C>(...expr: [Expr<number | Date | N, D, C>, Expr<number | Date | N, D, C>]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $gte: expr.map(e => e.raw(f).get()) }),\n })\n\ntype Num = number | null | undefined\n\nexport function subtract<D, C>(\n ...expr: [Expr<number, D, C>, Expr<number, D, C>]\n): Expr<number, D, C>\nexport function subtract<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C>\n\nexport function subtract<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $subtract: expr.map(e => e.raw(f).get()) }),\n })\n}\n\nexport function add<D, C>(...expr: [Expr<number, D, C>, Expr<number, D, C>]): Expr<number, D, C>\nexport function add<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C>\n\nexport function add<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $add: expr.map(e => e.raw(f).get()) }),\n })\n}\n\nexport function divide<D, C>(...expr: [Expr<number, D, C>, Expr<number, D, C>]): Expr<number, D, C>\nexport function divide<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C>\n\nexport function divide<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $divide: expr.map(e => e.raw(f).get()) }),\n })\n}\n\nexport function multiply<D, C>(\n ...expr: [Expr<number, D, C>, Expr<number, D, C>]\n): Expr<number, D, C>\nexport function multiply<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C>\nexport function multiply<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $multiply: expr.map(e => e.raw(f).get()) }),\n })\n}\n\nexport function floor<D, C>(expr: Expr<number, D, C>): Expr<number, D, C>\nexport function floor<D, C>(expr: Expr<Num, D, C>): Expr<Num, D, C>\nexport function floor<D, C>(expr: Expr<Num, D, C>): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $floor: expr.raw(f).get() }),\n })\n}\n\nexport function ceil<D, C>(expr: Expr<number, D, C>): Expr<number, D, C>\nexport function ceil<D, C>(expr: Expr<Num, D, C>): Expr<Num, D, C>\nexport function ceil<D, C>(expr: Expr<Num, D, C>): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $ceil: expr.raw(f).get() }),\n })\n}\n","import type { AsLiteral, Rec } from '../../types'\n\nexport const safeNarrow = <V>() => {\n return <T>(x: T & V) => x\n}\nexport const id = <T>(x: T) => x\nexport const defined = <T>(x: T | undefined | null): x is T => x != null\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const noop = () => {}\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const anoop = async () => {}\n\nexport const asRec = <K extends string, T>(x: Record<K, T>) => x as Rec<K, T>\n\nexport const map1 = <K extends string, Im>(k: AsLiteral<K>, to: Im) => {\n const k2: K = k\n return { [k]: [k2, to] } as { readonly [P in K]: [P, Im] } & { readonly [_: string]: [K, Im] }\n}\n","import type { App, Dict, HKT, I, IdHKT, Omit, RORec, StrKey } from '../../types'\nimport { id } from './json'\n\n\nexport type ExactPart<T, F extends HKT<T[StrKey<T>]>> = MapOPart<T, MappedHKT<T, F>>\n\nexport type ExactPart1<T, F extends HKT<StrKey<T>>> = {\n readonly [K in StrKey<T>]: App<F, K>\n}\n\ntype s = string\n\nexport type ExactKeys<K extends string> = Exact<RORec<K, 1>, IdHKT>\n\nexport type MapO<T, F extends HKT<K>, K extends StrKey<T> = StrKey<T>> = MapOPart<T, F, K> & {\n readonly [P: string]: readonly [K, unknown]\n}\n\nexport type MapK<K extends s, F extends HKT<K>> = MapO<RORec<K>, F>\n\nexport type MapOPart<T, F extends HKT<K>, K extends keyof T = StrKey<T>> = {\n readonly [P in K]: readonly [P, App<F, P & string>]\n}\nexport type MapKPart1<T, F extends HKT<K>, K extends StrKey<T> = StrKey<T>> = {\n readonly [P in K]: App<F, P>\n}\n\nexport type Exact<T, F extends HKT<T[StrKey<T>]>> = MapO<T, MappedHKT<T, F>>\n\nexport interface MappedHKT<T, F extends HKT<T[StrKey<T>]>> extends HKT<StrKey<T>> {\n readonly out: App<F, T[I<StrKey<T>, this>]>\n}\n\nexport const mapExactToObject0 = <T, F extends HKT<K>, G extends HKT<K>, K extends StrKey<T> = StrKey<T>>(\n x: MapO<T, F, K>,\n f: <P extends K>(v: App<F, P>, k: P) => App<G, P>,\n): MapKPart1<T, G, K> => {\n const filter = <T extends Dict<{ 0: unknown }>, V extends T>(x: readonly Entry<T>[]) =>\n x.filter((x): x is Entry<V> => x[0] === x[1][0])\n const matched = filter<MapO<T, F, K>, MapOPart<T, F, K>>(Object.entries(x))\n return Object.fromEntries<MapKPart1<T, G, K>, 0>(\n matched.map<K, MapOPart<T, F, K>, MapKPart1<T, G, K>, 2>(([k, v]) => [k, f(v[1], k)]),\n )\n}\n\nexport const mapExactToObject1 = <K extends string, F extends HKT<K>, G extends HKT<K>>(\n x: MapK<K, F>,\n f: <P extends K>(v: App<F, P>, k: P) => App<G, P>,\n): MapKPart1<RORec<K>, G> => mapExactToObject0<RORec<K>, F, G>(x, f)\n\nexport interface WithKey1<K extends string, G extends HKT<K>> extends HKT<K> {\n readonly out: readonly [I<K, this>, App<G, I<K, this>>]\n}\n\nexport const mapExact0 = <T, F extends HKT<StrKey<T>>, G extends HKT<StrKey<T>>>(\n x: MapO<T, F>,\n f: <P extends StrKey<T>>(v: App<F, P>, k: P) => App<G, P>,\n): MapO<T, G> => mapExactToObject0<T, F, WithKey1<StrKey<T>, G>>(x, (v, k) => [k, f(v, k)])\n\nexport const mapExact1 = <K extends s, F extends HKT<K>, G extends HKT<K>>(\n x: MapK<K, F>,\n f: <P extends K>(v: App<F, P>, k: P) => App<G, P>,\n): MapK<K, G> => mapExactToObject1<K, F, WithKey1<K, G>>(x, (v, k) => [k, f(v, k)])\n\nexport const mapExactToObject = <T, F extends HKT<T[StrKey<T>]>, G extends HKT<StrKey<T>>>(\n x: Exact<T, F>,\n f: <P extends StrKey<T>>(v: App<F, T[P]>, k: P) => App<G, P>,\n): ExactPart1<T, G> => mapExactToObject0<T, MappedHKT<T, F>, G>(x, f)\n\ninterface WithKey<T, G extends HKT<T[StrKey<T>]>> extends HKT<StrKey<T>> {\n readonly out: readonly [I<StrKey<T>, this>, App<G, T[I<StrKey<T>, this>]>]\n}\n\nexport const mapExact = <T, F extends HKT<T[StrKey<T>]>, G extends HKT<T[StrKey<T>]>>(\n x: Exact<T, F>,\n f: <P extends StrKey<T>>(v: App<F, T[P]>, k: P) => App<G, T[P]>,\n): Exact<T, G> => mapExactToObject<T, F, WithKey<T, G>>(x, (v, k) => [k, f(v, k)])\n\ntype Dom<T, V> = HKT<T[StrKey<T>] | V[StrKey<V>]>\nexport const spread = <T, V, F extends Dom<T, V>, EK extends symbol = never, EE = unknown, No extends keyof V = never>(\n a: Exact<Omit<T, No>, F>,\n b: Exact<V, F>,\n) => ({ ...a, ...mapExact(b, id) }) as Exact<V & Omit<T, keyof V> & Record<EK, EE>, F>\n\nexport interface MergeHKT<T, V, F1 extends HKT<StrKey<Omit<T, No>>>, F2 extends HKT<StrKey<V>>, No extends keyof V = never,>\n extends HKT<StrKey<V & Omit<T, No>>> {\n readonly out: I<StrKey<V & Omit<T, No>>, this> extends StrKey<V>\n ? App<F2, I<StrKey<V>, this>>\n : App<F1, I<StrKey<Omit<T, No>>, this>>\n}\n\nexport const spread0 = <\n T,\n V,\n F1 extends HKT<StrKey<Omit<T, No>>>,\n F2 extends HKT<StrKey<V>>,\n E = unknown,\n No extends keyof V = never,\n>(\n a: MapO<Omit<T, No>, F1>,\n b: MapO<V, F2>,\n) =>\n ({ ...a, ...mapExact0(b, id) }) as MapO<\n V & Omit<T, No> & Pick<E, symbol & keyof E>,\n MergeHKT<T, V, F1, F2, No>\n >\n","import type { Timestamp } from '../../types'\nimport type { Arr, ConstHKT, N, O, StrKey, jsonItem, notObj, rawItem } from '../../types'\nimport type { Expr } from '../types'\nimport { asExpr, asExprRaw } from './expr-base'\nimport type { ExprHKT, ExprsExact } from './concat'\nimport { mapExactToObject } from '../utils/map-object'\n\nexport const val = <T extends rawItem>(val: T): Expr<T, unknown> =>\n asExpr({\n raw: () =>\n asExprRaw<T, unknown, unknown>(\n (val && typeof val === 'object' && !(val instanceof Date)) ||\n (typeof val === 'string' && val[0] === '$')\n ? { $literal: val }\n : val,\n ),\n })\n\nexport const current: Expr<Timestamp, unknown> = asExpr({\n raw: () => asExprRaw<Timestamp, unknown, unknown>('$$CLUSTER_TIME'),\n})\nexport const $let = <T, D, C, V extends object>(\n vars: ExprsExact<V, D, C>,\n inExpr: Expr<T, D, C & V>,\n) =>\n asExpr<T, D, C>({\n raw: f =>\n asExprRaw({\n $let: {\n vars: mapExactToObject<V, ExprHKT<D, C>, ConstHKT<rawItem>>(vars, v => v.raw(f).get()),\n in: inExpr.raw(f).get(),\n },\n }),\n })\n\nexport const nil = val(null)\n\nexport const $getField: {\n <T, K extends StrKey<T>, D, C = unknown>(expr: Expr<T, D, C>, field: K): Expr<T[K], D, C>\n <T, K extends StrKey<T>, D, C = unknown>(\n expr: Expr<T | N, D, C>,\n field: K,\n ): Expr<T[K] | null, D, C>\n} = <T, K extends StrKey<T>, D, C = unknown>(expr: Expr<T | N, D, C>, field: K) =>\n asExpr<T[K] | null, D, C>({\n raw: f =>\n asExprRaw({\n $getField: {\n field: field,\n input: expr.raw(f).get(),\n },\n }),\n })\n\nexport type AddO<T> = T extends notObj ? T : T extends Array<infer U> ? Arr<AddO<U>> : O<{[K in keyof T]: AddO<T[K]>}> \n\nexport const func = <T extends jsonItem, A extends readonly jsonItem[], D, C = unknown>(\n f: (...args: A) => T,\n ...args: { [X in keyof A]: Expr<AddO<A[X]>, D, C> }\n) =>\n asExpr<AddO<T>, D, C>({\n raw: field =>\n asExprRaw({\n $function: {\n body: f.toString(),\n args: args.map(x => x.raw(field).get()),\n lang: 'js',\n },\n }),\n })\n\nexport const rand = function () {\n const s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n return Array(17)\n .fill(0)\n .map(() => s[Math.floor(Math.random() * 62)])\n .join('')\n}\nexport const $rand = func(rand)\n","import type { App, HKT, O, RawObj, U, Undef, jsonItem, rawItem } from '../../types'\nimport type { Field } from '../field'\nimport type { BoolExpr, Expr } from '../types'\nimport { safeNarrow } from '../utils/json'\nimport { asBoolExpr, asExpr, asExprRaw } from './expr-base'\nimport { nil, val } from './val'\n\nexport const ite = (<T, D1, D2, C>(\n cond: BoolExpr<D1, D2, C>,\n then: Expr<T, D1 | D2, C>,\n orelse: Expr<T, D2 | D2, C>,\n) =>\n asExpr<T, D1 | D2, C>({\n raw: <DeltaD extends O, I extends U, Ctx>(f: Field<DeltaD, D1 | D2 | Undef<I>, Ctx>) =>\n asExprRaw<T, DeltaD, C & Ctx>({\n $cond: {\n if: cond.raw(f).get(),\n then: then.raw(f as Field<DeltaD, D1>).get(),\n else: orelse.raw(f as Field<DeltaD, D2>).get(),\n },\n }),\n })) as {\n <T, D, C = unknown>(\n cond: Expr<unknown, D, C>,\n then: Expr<T, D, C>,\n orelse: Expr<T, D, C>,\n ): Expr<T, D, C>\n <T, R1, R2, F extends HKT<R1 | R2>, C = unknown>(\n cond: BoolExpr<App<F, R1>, App<F, R2>, C>,\n then: Expr<T, App<F, R1>, C>,\n orelse: Expr<T, App<F, R2>, C>,\n ): Expr<T, App<F, R1 | R2>, C>\n}\n\nexport const and = <D, C = unknown>(...expr: Expr<boolean, D, C>[]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $and: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const or = <D, C = unknown>(...expr: Expr<boolean, D, C>[]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $or: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const not = <D, C = unknown>(expr: Expr<boolean, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $not: expr.raw(f).get() }),\n })\n\nexport const eq =\n <T, D, C = unknown>(a: Expr<T, D, C>) =>\n (b: Expr<T, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $eq: [a.raw(f).get(), b.raw(f).get()] }),\n })\n\nexport const sub = <T, D, Ctx, P extends O>(a: Expr<T, D, Ctx>, f: Field<P, D, Ctx>) =>\n asExpr<T, P, Ctx>({\n raw: <DeltaD extends O, I extends undefined, C = unknown>(g: Field<DeltaD, P | Undef<I>, C>) =>\n asExprRaw<T | I, DeltaD, Ctx & C>(a.raw(g.with<P, D, I, Ctx, 2>(f)).get()),\n })\n\nexport const eqTyped = <\n T1 extends Dom,\n T2 extends Dom,\n F extends HKT<Dom>,\n C = unknown,\n Dom = jsonItem,\n>(\n a: Expr<T1 | T2, App<F, T1 | T2>, C>,\n b: Expr<T1, App<F, T1 | T2>, C>,\n): BoolExpr<App<F, T1>, App<F, T2>, C> =>\n asBoolExpr({\n raw: <DeltaD extends O>(f: Field<DeltaD, App<F, T1> | App<F, T2>>) =>\n asExprRaw<never, DeltaD, C>({ $eq: [a.raw(f).get(), b.raw(f).get()] }),\n })\n\nexport const ne =\n <T, D, C = unknown>(a: Expr<T, D, C>) =>\n <K>(b: Expr<K, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $ne: [a.raw(f).get(), b.raw(f).get()] }),\n })\n\nexport const notNull = <T, D, C>(a: Expr<T, D, C>) => ne($ifNull(a, nil))(nil)\n\nexport const $ifNull: {\n <R, D, C = unknown>(\n ...expr: [...Expr<R | null | undefined, D, C>[], Expr<R, D, C>]\n ): Expr<R, D, C>\n <R, D, C = unknown>(\n ...expr: [Expr<R, D, C>, ...Expr<R | null | undefined, D, C>[]]\n ): Expr<R, D, C>\n} = <R, D, C>(...expr: [...Expr<R | null | undefined, D, C>[]]) =>\n asExpr<R, D, C>({\n raw: f => asExprRaw({ $ifNull: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const exprMapVal = <K extends string, T extends Partial<Record<K, rawItem>>, D, C>(\n expr: Expr<K, D, C>,\n map: { readonly [P in K]: Expr<T[P], D, C> },\n or?: Expr<T[K], D, C>,\n) =>\n asExpr<T[K & keyof T], D, C>({\n raw: f =>\n asExprRaw({\n $switch: {\n branches: Object.entries(map).map(([k, v]) =>\n safeNarrow<RawObj>()({\n case: { $eq: [expr.raw(f).get(), { $literal: k }] },\n then: v.raw(f).get(),\n }),\n ),\n ...(or && { default: or.raw(f).get() }),\n },\n }),\n })\n\nexport const mapVal = <K extends string, T extends Partial<Record<K, rawItem>>, D, C>(\n expr: Expr<K, D, C>,\n map: T,\n or: T[K & keyof T],\n): Expr<T[K & keyof T], D, C> =>\n exprMapVal<K, T, D, C>(\n expr,\n Object.fromEntries<{ readonly [P in K]: Expr<T[P], D, C> }>(\n Object.entries(map as Pick<T, K>).map(([k, v]) => [k, val(v)]),\n ),\n val(or),\n )\n\nexport const setField = <K extends string, T, V, D, C>({\n field,\n input,\n value,\n}: {\n field: Expr<K, D, C>\n input: Expr<T, D, C>\n value: Expr<V, D, C>\n}) =>\n asExpr<T & Record<K, V>, D, C>({\n raw: f =>\n asExprRaw({\n $setField: {\n field: field.raw(f).get(),\n input: input.raw(f).get(),\n value: value.raw(f).get(),\n },\n }),\n })\n","import type { Arr, AsLiteral, N, O, RORec, StrKey, U, Undef } from '../../types'\nimport { asExpr, asExprRaw } from '../expression/expr-base'\nimport type { Expr, ExprRaw, Query } from '../types'\nimport type { Predicate } from '../types/predicate'\nimport { id } from '../utils/json'\n\ntype Concat = <P, R, V, C, C2>(f1: Field<P, R, C>, f2: Field<R, V, C2>) => Field<P, V, C & C2>\n\nexport class Field<in R, out V, in C = unknown> {\n has<R extends O>(this: Field<R, V>, p: Predicate<V>): Query<R, C>\n has<R extends O, V>(this: Field<R, Arr<V>>, p: Predicate<V>): Query<R, C>\n has<R extends O>(this: Field<R, V | Arr<V>>, p: Predicate<V | Arr<V>>): Query<R, C> {\n return { raw: f => ({ [f.with(this).str()]: p.raw }) }\n }\n private constructor(\n private field: string,\n private raw: (x: string) => string,\n private concat: Concat,\n ) {}\n static root = <T extends O>() => {\n const concat: Concat = (f1, f2) =>\n new Field([f1.field, f2.field].filter(id).join('.'), f1.raw, f1.concat)\n return new Field<T, T>('', s => (s ? `$${s}` : '$$ROOT'), concat)\n }\n static ctx =\n <T>() =>\n <K extends string>(k: K) => {\n const concat: Concat = (_, f2) => new Field(f2.field, f2.raw, f2.concat)\n return new Field<unknown, T, RORec<K, T>>(k, s => `$$${s}`, concat)\n }\n public of<V, K extends keyof V, _ extends 0 = 0>(\n this: Field<R, Arr<V>, C>,\n k: AsLiteral<K>,\n ): Field<R, Arr<V[K]>, C>\n public of<V, K extends keyof V, _ extends 1 = 1>(this: Field<R, O<V>, C>, k: K): Field<R, V[K], C>\n public of<V, K extends keyof V, I extends N = never, _ extends 2 = 2>(\n this: Field<R, Arr<V> | Undef<I>, C>,\n k: K,\n ): Field<R, Arr<V[K]> | I, C>\n public of<V, K extends keyof V, I extends N = never, _ extends 3 = 3>(\n this: Field<R, O<V> | Undef<I>, C>,\n k: K,\n ): Field<R, V[K] | I, C>\n\n public of<K extends StrKey<V>>(k: K): Field<R, V[K] | Arr<V[K]> | N, C> {\n return new Field([this.field, k].filter(id).join('.'), this.raw, this.concat)\n }\n\n public with<V, W, C2 = unknown, _ extends 0 = 0>(\n this: Field<R, O<V>, C>,\n k: Field<O<V>, W, C2>,\n ): Field<R, W, C & C2>\n public with<V, W, C2 = unknown, _ extends 1 = 1>(\n this: Field<R, Arr<V>, C>,\n k: Field<O<V>, Arr<W> | O<W>, C2>,\n ): Field<R, Arr<W>, C & C2>\n public with<V, W, I extends N = never, C2 = unknown, _ extends 2 = 2>(\n this: Field<R, O<V> | Undef<I>, C>,\n k: Field<O<V>, W, C2>,\n ): Field<R, W | I, C & C2>\n public with<V, W, I extends N = never, C2 = unknown, _ extends 3 = 3>(\n this: Field<R, Arr<V> | Undef<I>, C>,\n k: Field<O<V>, Arr<W> | O<W>, C2>,\n ): Field<R, Arr<W> | I, C & C2>\n public with<W>(k: Field<O<V>, W, C>): Field<R, W, C> {\n return k.concat<R, O<V>, W, C, C>(this as Field<R, O<V>, C>, k)\n }\n\n str(this: Field<R, V>) {\n return this.field\n }\n private exprRaw(): ExprRaw<V, R, C> {\n return asExprRaw(this.raw(this.field))\n }\n expr<R, V, C = unknown>(this: Field<R, V, C>): Expr<V, R, C>\n expr<R extends O, V, Ctx = unknown>(this: Field<R, V, Ctx>): Expr<V, R, Ctx> {\n return asExpr<V, R, Ctx>({\n raw: <DeltaD extends O, I extends U, C = unknown>(\n f: Field<DeltaD, R | Undef<I>, C>,\n ): ExprRaw<V | I, DeltaD, Ctx & C> => f.with<R, V, I, Ctx, 2>(this).exprRaw(),\n })\n }\n}\n\nexport const { root, ctx } = Field\n","import type { AppMap, ConstHKT, N, O, PRRec, RawObj, rawItem } from '../../types'\nimport { add, subtract } from '../expression/arith'\nimport type { ExprHKT } from '../expression/concat'\nimport { $ifNull, ite, sub } from '../expression/logic'\nimport { func, val, type AddO } from '../expression/val'\nimport { root } from '../field'\nimport type { Accumulator, AccumulatorRaw, DeltaAccumulator, Expr, Part } from '../types'\n\ntype AddOs<A extends readonly unknown[]> = {[K in keyof A]: AddO<A[K]>}\ntype PushSides<V> = { 0: V[]; 1: V[] }\ntype PushDict<V> = PRRec<string, PushSides<V>>\n\nconst asAccumulator = <T, V, C = unknown>(x: RawObj) => x as AccumulatorRaw<T, V, C>\n\nconst $sum_ = <D extends O, C = unknown>(\n expr: Expr<number | N, D, C>,\n): Accumulator<D, number, C> => ({ raw: f => asAccumulator({ $sum: expr.raw(f).get() }) })\nexport const $sum = <D extends O, C = unknown>(\n expr: Expr<number | N, D, C>,\n): DeltaAccumulator<D, number, C> => ({\n group: $sum_(\n ite(\n root<Part<D>>().of('deleted').expr(),\n val(0),\n ite(\n root<Part<D>>().of('old').expr(),\n subtract(val(0), $ifNull(sub(expr, root<Part<D>>().of('v')), val(0))),\n sub(expr, root<Part<D>>().of('v')),\n ),\n ),\n ),\n merge: (x, y) => add($ifNull(x, val(0)), y),\n})\n\nconst $accumulator_ = <D, T, Ctx, A extends readonly unknown[]>(\n init: () => T,\n accumulateArgs: AppMap<ExprHKT<D, Ctx>, AddOs<A>>,\n accumulate: (a: T, ...args: A) => T,\n merge: (...args: [T, T]) => T,\n): Accumulator<D, AddO<T>, Ctx> => {\n return {\n raw: f =>\n asAccumulator({\n $accumulator: {\n init: init.toString(),\n initArgs: [],\n accumulate: accumulate.toString(),\n accumulateArgs: accumulateArgs.map<AddOs<A>, ExprHKT<D, Ctx>, ConstHKT<rawItem>, 1>(e =>\n e.raw(f).get(),\n ),\n merge: merge.toString(),\n lang: 'js',\n },\n }),\n }\n}\n\nexport const $accumulator = <D, T, Ctx, A extends readonly unknown[]>(\n init: () => T,\n accumulateArgs: AppMap<ExprHKT<Part<D>, Ctx>, AddOs<A>>,\n accumulate: (a: T, ...args: A) => T,\n merge: (...args: [T | N, T]) => T,\n): DeltaAccumulator<D, AddO<T>, Ctx> => ({\n group: $accumulator_(init, accumulateArgs, accumulate, merge),\n merge: <D, C>(a: Expr<AddO<T> | N, D, C>, b: Expr<AddO<T>, D, C>): Expr<AddO<T>, D, C> =>\n func<T, [T | N, T], D, C>(merge, a, b),\n})\n\nexport const $countDict = <D extends O, K extends string = string, C = unknown>(\n expr: Expr<AddO<K>, D, C>,\n): DeltaAccumulator<D, AddO<PRRec<K, number>>, C> =>\n $accumulator<D, PRRec<K, number>, C, [K, boolean, true | N]>(\n function () {\n return {}\n },\n [\n sub(expr, root<Part<D>>().of('v')),\n root<Part<D>>().of('old').expr(),\n root<Part<D>>().of('deleted').expr(),\n ],\n function (a, k, old, deleted) {\n if (deleted) return a\n let y = (a[k] || 0) + (old ? -1 : 1)\n return y ? (a[k] = y) : delete a[k], a\n },\n function (a, b) {\n return Object.keys(b).reduce<PRRec<K, number>>((a, k) => {\n let y = (a[k] || 0) + b[k]!\n return y ? (a[k] = y) : delete a[k], a\n }, a || {})\n },\n )\nexport const $countDictArray = <D extends O, K extends string = string, C = unknown>(\n expr: Expr<AddO<K[]>, D, C>,\n): DeltaAccumulator<D, AddO<PRRec<K, number>>, C> =>\n $accumulator<D, PRRec<K, number>, C, [K[], boolean, true | N]>(\n function () {\n return {}\n },\n [\n sub(expr, root<Part<D>>().of('v')),\n root<Part<D>>().of('old').expr(),\n root<Part<D>>().of('deleted').expr(),\n ],\n function (a, keys, old, deleted) {\n if (deleted) return a\n keys.forEach(k => {\n const y = (a[k] || 0) + (old ? -1 : 1)\n if (y) a[k] = y\n else delete a[k]\n })\n return a\n },\n function (a, b) {\n return Object.keys(b).reduce<PRRec<K, number>>((a, k) => {\n let y = (a[k] || 0) + b[k]!\n return y ? (a[k] = y) : delete a[k], a\n }, a || {})\n },\n )\nexport const $pushDict = <D extends O, V, C = unknown>(\n key: Expr<string, D, C>,\n value: Expr<AddO<V>, D, C>,\n) =>\n // '1' => 'old'\n $accumulator<D, PushDict<V>, C, [string, V, boolean, true | N]>(\n function () {\n return {}\n },\n [\n sub(key, root<Part<D>>().of('v')),\n sub(value, root<Part<D>>().of('v')),\n root<Part<D>>().of('old').expr(),\n root<Part<D>>().of('deleted').expr(),\n ],\n function (ra, k, v, old, deleted) {\n if (deleted) return ra\n let a: PRRec<string, PushSides<V>> = { ...ra }\n //@ts-ignore\n const equal = (a, b) => {\n if (!a || !b) return a === b\n if (a instanceof Date) return b instanceof Date && a.getTime() === b.getTime()\n if ([a, b].some(a => Object.getPrototypeOf(a) != Object.prototype)) return a.valueOf() === b.valueOf()\n const keys = Object.keys(a)\n //@ts-ignore\n return keys.length === Object.keys(b).length && keys.every(k => equal(a[k], b[k]))\n }\n const delta = (a[k] ||= { 0: [], 1: [] }),\n addR = delta[old ? 1 : 0],\n rmR = delta[old ? 0 : 1],\n idx = rmR.findIndex(x => equal(x, v))\n if (idx !== -1) rmR.splice(idx, 1)\n else addR.push(v)\n return a\n },\n function (acc: PushDict<V> | N, b: PushDict<V>): PushDict<V> {\n return Object.keys(b).reduce<PushDict<V>>((a, k) => {\n return Object.entries({ ...b[k] }).reduce<PushDict<V>>(\n (a, [p, v]) =>\n v!.reduce<PushDict<V>>((a, v) => {\n //@ts-ignore\n const equal = (a, b) => {\n if ([a, b].some(a => !a || typeof a != 'object')) return a === b\n const keys = Object.keys(a)\n //@ts-ignore\n return keys.length === Object.keys(b).length && keys.every(k => equal(a[k], b[k]))\n }\n const delta = (a[k] ||= { 0: [], 1: [] }),\n addR = delta[p],\n rmR = delta[+p ? 0 : 1],\n idx = rmR.findIndex(x => equal(x, v))\n if (idx !== -1) rmR.splice(idx, 1)\n else addR.push(v)\n return a\n }, a),\n a,\n )\n }, acc || {})\n },\n )\n\nexport const $keys = <D extends O, K extends string = string, C = unknown>(\n expr: Expr<AddO<PRRec<K, number>>, D, C>,\n): Expr<AddO<K[]>, D, C> =>\n func<K[], [PRRec<K, number>], D, C>(function (obj) {\n return Object.keys(obj) as K[]\n }, expr)\n\nexport const $entries = <D extends O, V, C = unknown>(\n expr: Expr<AddO<PushDict<V>>, D, C>,\n): Expr<AddO<{ k: string; v: V }[]>, D, C> =>\n func<{ k: string; v: V }[], [PushDict<V>], D, C>(function (obj) {\n return Object.entries({ ...obj }).flatMap(([k, v]) => (v as PushSides<V>)[0].map(v => ({ k, v })))\n }, expr)\n","import type { App, HKT, O2, O3, O } from '../../types'\nimport type { Delta, DeltaStages, FRawStages, RawStages, Stream, TStages } from '../types'\nimport type { Equal } from '../utils/guard'\n\ntype n = number\nexport const asStages = <Q, T extends Q, V extends Q, C = unknown, M extends n = n>(\n x: RawStages<Q, T, V, C, M>,\n): RawStages<Q, T, V, C, M> => x\n\nexport const same = <\n T extends Dom,\n V extends Dom,\n F extends HKT<Dom, Q>,\n Dom = unknown,\n Q = unknown,\n C = unknown,\n M extends n = n,\n>(\n _: Equal<Dom, T, V>,\n) => asStages<Q, App<F, T>, App<F, V>, C, M>([])\n\nexport const concatStages = <Q, T extends Q, V extends Q, W extends Q, C, M extends n = n>(\n part1: RawStages<Q, T, V, C, M>,\n part2: RawStages<Q, V, W, C, M>,\n): RawStages<Q, T, W, C, M> => asStages([...part1, ...part2])\n\nexport const concatFStages =\n <Q, T extends Q & O, V extends Q & O, W extends Q & O, C, M extends n = n>(\n part1: FRawStages<Q, T, V, C, M>,\n part2: FRawStages<Q, V, W, C, M>,\n ): FRawStages<Q, T, W, C, M> =>\n f =>\n concatStages(part1(f), part2(f))\n\nexport const concatDelta = <Q extends O, T extends Q, V extends Q, W extends Q>(\n part1: DeltaStages<Q, T, V>,\n part2: DeltaStages<Q, V, W>,\n): DeltaStages<Q, T, W> => ({\n delta: concatStages(part1.delta, part2.delta),\n raw: f => concatStages(part1.raw(f), part2.raw(f)),\n})\n\nexport type Concat<out Q, in T extends Q, out V extends Q, in out C, in out M extends n = n> = {\n with: <Q2, W extends Q2>(extra: RawStages<Q | Q2, V, W, C, M>) => Concat<Q | Q2, T, W, C, M>\n stages: RawStages<Q, T, V, C, M>\n}\ntype FConcat<out Q, in T extends Q & O, out V extends Q & O, in out C, in out M extends n = n> = {\n with: <Q2, W extends Q2 & O>(extra: FRawStages<Q | Q2, V, W, C, M>) => FConcat<Q | Q2, T, W, C, M>\n stages: FRawStages<Q, T, V, C, M>\n}\nexport type DeltaPipe<Q extends O, T extends Q, F extends HKT<O2>, G extends HKT<O3>> = {\n with: <Q2 extends O, V extends Q2>(\n map: (a: Stream<Q, T, F, G>) => Stream<Q | Q2, V, F, G>,\n ) => DeltaPipe<Q | Q2, V, F, G>\n then: <Q2 extends O, V extends Q2>(next: App<G, [Q2 | T, T, V]>) => DeltaPipe<Q | Q2, V, F, G>\n get: () => App<F, [Q, T]>\n}\n\nexport const pipe = <Q extends O, S extends Q, T extends Q, F extends HKT<O2>, G extends HKT<O3>>(\n stream: Stream<Q, S, F, G>,\n s: App<G, [Q, S, T]>,\n concat: <Q extends O, T extends Q, V extends Q, W extends Q>(\n part1: App<G, [Q, T, V]>,\n part2: App<G, [Q, V, W]>,\n ) => App<G, [Q, T, W]>,\n empty: <T extends Q>() => App<G, [Q, T, T]>,\n) => {\n const acc: DeltaPipe<Q, T, F, G> = {\n with: <Q2 extends O, V extends Q2>(\n map: (a: Stream<Q, T, F, G>) => Stream<Q | Q2, V, F, G>,\n ): DeltaPipe<Q | Q2, V, F, G> =>\n pipe<Q | Q2, V, V, F, G>(\n map(i => stream(concat(s, i))),\n empty(),\n concat,\n empty,\n ),\n then: <Q2 extends O, V extends Q2>(next: App<G, [T | Q2, T, V]>): DeltaPipe<Q | Q2, V, F, G> =>\n pipe<Q | Q2, S, V, F, G>(stream, concat(s, next), concat, empty),\n get: () => stream(s),\n }\n return acc\n}\nconst concat = <Q, T extends Q, V extends Q, C = unknown, M extends n = n>(\n stages: RawStages<Q, T, V, C, M>,\n): Concat<Q, T, V, C, M> => ({\n with: extra => concat(concatStages(stages, extra)),\n stages,\n})\nconst fconcat = <Q, T extends Q & O, V extends Q & O, C = unknown, M extends n = n>(\n stages: FRawStages<Q, T, V, C, M>,\n): FConcat<Q, T, V, C, M> => ({\n with: extra => fconcat(concatFStages(stages, extra)),\n stages,\n})\n\ntype Link = <T, C = unknown, M extends n = n>() => Concat<T, T, T, C, M>\ntype FLink = <T extends O, C = unknown, M extends n = n>() => FConcat<T, T, T, C, M>\n\nexport const link: Link = () => ({\n with: extra => concat(extra),\n stages: asStages([]),\n})\n\nexport const flink: FLink = () => ({\n with: extra => fconcat(extra),\n stages: () => asStages([]),\n})\n\nexport const emptyDelta = <T extends O>() => ({\n delta: link<Delta<T>>().stages,\n raw: <F extends HKT<O>>() => link<App<F, T>>().stages,\n})\n\nexport const concatTStages = <S, Q, B extends Q, T extends Q, V extends Q>(\n { coll, exec, input }: TStages<S, Q, B, T>,\n stages: RawStages<Q, T, V>,\n): TStages<S, Q, B, V> => ({ coll, input, exec: concatStages(exec, stages) })\n","import type {\n App,\n ConstHKT,\n HKT,\n I,\n IdHKT,\n N,\n O,\n Omit,\n RawObj,\n RORec,\n StrKey,\n U,\n Undef,\n rawItem,\n} from '../../types'\nimport type { Field } from '../field'\nimport type { Expr } from '../types'\nimport { safeNarrow } from '../utils/json'\nimport {\n mapExactToObject,\n spread,\n type Exact,\n type ExactPart,\n type MapO,\n type MergeHKT,\n spread0,\n} from '../utils/map-object'\nimport { asExpr, asExprRaw } from './expr-base'\nimport { val } from './val'\n\nexport const concat: {\n <D, C>(...expr: Expr<string, D, C>[]): Expr<string, D, C>\n <D, C>(...expr: Expr<string | N, D, C>[]): Expr<string | N, D, C>\n} = <D, C>(...expr: Expr<string | N, D, C>[]) =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $concat: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const $substr = <D, C>(\n expr: Expr<string, D, C>,\n start: Expr<number, D, C>,\n length: Expr<number, D, C>,\n) =>\n asExpr<string, D, C>({\n raw: f =>\n asExprRaw({\n $substrCP: [expr.raw(f).get(), start.raw(f).get(), length.raw(f).get()],\n }),\n })\nexport const padLeft = <D, C>(expr: Expr<string, D, C>, pad: string) =>\n asExpr<string, D, C>({\n raw: f =>\n asExprRaw({\n $let: {\n vars: {\n x: {\n $concat: [{ $literal: pad }, expr.raw(f).get()],\n },\n },\n in: { $substrCP: ['$$x', { $subtract: [{ $strLenCP: '$$x' }, pad.length] }, pad.length] },\n },\n }),\n })\nexport const regex = <D, C>(\n expr: Expr<string, D, C>,\n regex: Expr<string, D, C>,\n options?: Expr<string, D, C>,\n) =>\n asExpr<boolean, D, C>({\n raw: f =>\n asExprRaw({\n $regexMatch: {\n input: expr.raw(f).get(),\n regex: regex.raw(f).get(),\n options: options?.raw(f).get(),\n },\n }),\n })\nexport const str = <D, C>(expr: Expr<unknown, D, C>) =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $toString: expr.raw(f).get() }),\n })\nexport const toInt = <D, C>(expr: Expr<unknown, D, C>) =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $toInt: expr.raw(f).get() }),\n })\n\nexport const fieldM = <\n M extends RORec<Dom, Ref>,\n T extends RORec<Ref, unknown>,\n D,\n Dom extends string = StrKey<M>,\n Ref extends string = StrKey<T>,\n C = unknown,\n>(\n expr: { readonly [K in Ref]: Expr<T[K], D, C> },\n m: Pick<M, Dom>,\n) =>\n asExpr<O<{ readonly [K in Dom]: T[M[K]] }>, D, C>({\n raw: <DeltaD extends O, I extends U, Ctx>(f: Field<DeltaD, D | Undef<I>, Ctx>) =>\n asExprRaw<O<{ readonly [K in Dom]: T[M[K]] }>, DeltaD, C>(\n Object.fromEntries(\n Object.entries(m).flatMap(<K extends Dom>([dom, ref]: readonly [K, M[K]]) =>\n expr[ref] ? [[dom, expr[ref].raw(f).get()]] : [],\n ),\n ),\n ),\n })\n\nexport type Exprs<out T, in D, in C = unknown> = {\n readonly [K in StrKey<T>]: Expr<T[K], D, C>\n}\ntype MergeExactArgs<T1, T2, F extends HKT<T1[StrKey<T1>] | T2[StrKey<T2>]>> = readonly [\n Exact<Omit<T1, keyof T2>, F>,\n Exact<T2, F>,\n]\nexport const mergeExact = <T1, T2, F extends HKT<T1[StrKey<T1>] | T2[StrKey<T2>]>, EK extends symbol = never, EE = unknown>(\n ...[exprsExact1, exprsExact2]: MergeExactArgs<T1, T2, F>\n): Exact<T2 & Omit<T1, keyof T2> & Record<EK, EE>, F> =>\n spread<T1, T2, F, EK, EE, keyof T2>(exprsExact1, exprsExact2)\n\nexport type MergeMapOArgs<\n T1,\n T2,\n F1 extends HKT<StrKey<Omit<T1, StrKey<T2>>>>,\n F2 extends HKT<StrKey<T2>>,\n> = readonly [MapO<Omit<T1, StrKey<T2>>, F1>, MapO<T2, F2>]\nexport const mergeExact0 = <\n T1,\n T2,\n F1 extends HKT<StrKey<Omit<T1, StrKey<T2>>>>,\n F2 extends HKT<StrKey<T2>>,\n E = unknown,\n>(\n ...[exprsExact1, exprsExact2]: MergeMapOArgs<T1, T2, F1, F2>\n): MapO<\n T2 & Omit<T1, StrKey<T2>> & Pick<E, symbol & keyof E>,\n MergeHKT<T1, T2, F1, F2, StrKey<T2>>\n> => spread0<T1, T2, F1, F2, E, StrKey<T2>>(exprsExact1, exprsExact2)\n\nexport const mergeExpr = <T1, T2, D, C = unknown, EK extends symbol = never, EE = unknown>(\n ...exprs: MergeExactArgs<T1, T2, ExprHKT<D, C>>\n): ExprsExact<T2 & Omit<T1, keyof T2> & Record<EK, EE>, D, C> =>\n mergeExact<T1, T2, ExprHKT<D, C>, EK, EE>(...exprs)\n\nexport type ExprsPart<T, D, C> = ExactPart<T, ExprHKT<D, C>>\nexport interface ExprHKT<D, C = unknown, F extends HKT = IdHKT> extends HKT<unknown> {\n readonly out: Expr<App<F, I<unknown, this>>, D, C>\n}\n\nexport type ExprsExact<T, D, C = unknown, F extends HKT = IdHKT> = Exact<T, ExprHKT<D, C, F>>\nexport interface ExprsExactHKT<E, D, C = unknown, F extends HKT = IdHKT> extends HKT {\n readonly out: ExprsExact<E & I<unknown, this>, D, C, F>\n}\n\nexport const fieldF =\n <F extends HKT>() =>\n <T extends object, D, C = unknown>(exprs: ExprsExact<T, D, C, F>) =>\n Object.keys(exprs).length\n ? asExpr<O<{ [K in keyof T]: App<F, T[K]> }>, D, C>({\n raw: f =>\n asExprRaw(\n mapExactToObject<T, ExprHKT<D, C>, ConstHKT<rawItem>>(exprs, e => e.raw(f).get()),\n ),\n })\n : asExpr<O<{ [K in keyof T]: App<F, T[K]> }>, D, C>(\n val(safeNarrow<RawObj>()({})),\n )\nexport const field: <T extends object, D, C = unknown>(\n exprs: ExprsExact<T, D, C>,\n) => Expr<O<T>, D, C> = fieldF<IdHKT>()\n","import type { App, Arr, HKT, N, O, RORec, Rec, notArr } from '../../types'\nimport { ctx } from '../field'\nimport type { Expr } from '../types'\nimport { gte, add } from './arith'\nimport { field } from './concat'\nimport { asBoolExpr, asExpr, asExprRaw } from './expr-base'\nimport { eq, ite } from './logic'\nimport { $let, val } from './val'\n\nexport const size = <T, D, C>(expr: Expr<Arr<T>, D, C>) =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $size: expr.raw(f).get() }),\n })\n\nexport const filterDefined = <T, D, C = unknown>(expr: Expr<Arr<T | N>, D, C>) =>\n filter({\n expr,\n as: 'x',\n cond: ctx()('x').expr(),\n }) as Expr<Arr<T>, D, C>\n\nexport const filter = <T, D, K extends string, C = unknown>({\n as,\n cond,\n expr,\n limit,\n}: {\n expr: Expr<Arr<T>, D, C>\n as: K\n cond: Expr<unknown, D, C & RORec<K, T>>\n limit?: Expr<number, D, C>\n}) =>\n asExpr<Arr<T>, D, C>({\n raw: f =>\n asExprRaw({\n $filter: {\n input: expr.raw(f).get(),\n as,\n cond: cond.raw(f).get(),\n ...(limit ? { limit: limit.raw(f).get() } : {}),\n },\n }),\n })\nexport const sortArray = <T, D, C, K extends keyof T>({\n sortBy,\n expr,\n order,\n}: {\n expr: Expr<Arr<T>, D, C>\n sortBy: K\n order?: 1 | -1\n}) =>\n asExpr<Arr<T>, D, C>({ \n raw: f =>\n asExprRaw({ $sortArray: { input: expr.raw(f).get(), sortBy: { [sortBy]: order ?? -1 } } }),\n })\n\nexport const isArray = <T extends notArr, D, C, F extends HKT<T | Arr<T>>>(\n expr: Expr<T | Arr<T>, D & (App<F, T> | App<F, Arr<T>>), C>,\n) =>\n asBoolExpr<D & App<F, Arr<T>>, D & App<F, T>, C>({\n raw: f => asExprRaw<never, unknown, C>({ $isArray: expr.raw(f).get() }),\n })\n\nexport const inArray = <T, D, C>(item: Expr<T, D, C>, expr: Expr<Arr<T>, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $in: [item.raw(f).get(), expr.raw(f).get()] }),\n })\n\nexport const array = <T, D, C = unknown>(...exprs: Expr<T, D, C>[]) =>\n asExpr<Arr<T>, D, C>({\n raw: f => asExprRaw(exprs.map(x => x.raw(f).get())),\n })\n\nexport const concatArray = <T, D, C>(...exprs: Expr<Arr<T>, D, C>[]) =>\n asExpr<Arr<T>, D, C>({\n raw: f => asExprRaw({ $concatArrays: exprs.map(x => x.raw(f).get()) }),\n })\n\nexport const first = <T, D, C>(expr: Expr<Arr<T>, D, C>) =>\n asExpr<T | null, D, C>({\n raw: f => asExprRaw({ $first: expr.raw(f).get() }),\n })\nexport const firstSure = first as <T, D, C>(expr: Expr<Arr<T>, D, C>) => Expr<T, D, C>\nexport const last = <T, D, C>(expr: Expr<Arr<T>, D, C>) =>\n asExpr<T | null, D, C>({\n raw: f => asExprRaw({ $last: expr.raw(f).get() }),\n })\n\nexport type NullToOBJ<N extends null> = N extends null ? O : N\n\nexport const mergeObjects = <T1, T2, D, C = unknown, N extends null = never>(\n ...exprs: readonly [Expr<T1 | N, D, C>, ...[...Expr<T1 | T2 | N, D, C>[], Expr<T2, D, C>]]\n) =>\n asExpr<(T1 | NullToOBJ<N>) & T2, D, C>({\n raw: f => asExprRaw({ $mergeObjects: exprs.map(x => x.raw(f).get()) }),\n })\n\nexport const anyElementTrue = <D, C = unknown>(expr: Expr<Arr<boolean>, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $anyElementTrue: expr.raw(f).get() }),\n })\n\ntype Reduce<T, V> = RORec<'value', V> & RORec<'this', T>\nexport const $reduce = <T, V, D, C>(\n input: Expr<Arr<T>, D, C>,\n initialValue: Expr<V, D, C>,\n inExpr: Expr<V, D, C & Reduce<T, V>>,\n) =>\n asExpr<V, D, C>({\n raw: f =>\n asExprRaw({\n $reduce: {\n input: input.raw(f).get(),\n initialValue: initialValue.raw(f).get(),\n in: inExpr.raw(f).get(),\n },\n }),\n })\n\nconst indexOfArray = <T, D, C>(array: Expr<Arr<T>, D, C>, item: Expr<T, D, C>) =>\n asExpr<number, D, C>({\n raw: f =>\n asExprRaw({\n $indexOfArray: [array.raw(f).get(), item.raw(f).get()],\n }),\n })\ntype DiffArr<T> = Rec<'out' | 'except', Arr<T>>\nexport const slice = <T, D, C>(\n array: Expr<Arr<T>, D, C>,\n start: Expr<number, D, C>,\n end: Expr<number, D, C>,\n) =>\n asExpr<Arr<T>, D, C>({\n raw: f =>\n asExprRaw({\n $slice: [array.raw(f).get(), start.raw(f).get(), end.raw(f).get()],\n }),\n })\nexport const except = <T, D, C>(a: Expr<Arr<T>, D, C>, b: Expr<Arr<T>, D, C>) => {\n type C1 = C & Reduce<T, DiffArr<T>>\n type C2 = C1 & RORec<'indexInExcept', number>\n const value = ctx<DiffArr<T>>()('value')\n const out = value.of('out').expr()\n const except = value.of('except').expr()\n const curr = ctx<T>()('this').expr()\n const indexInExcept = ctx<number>()('indexInExcept').expr()\n return $let<Arr<T>, D, C, RORec<'res', DiffArr<T>>>(\n {\n res: [\n 'res',\n $reduce<T, DiffArr<T>, D, C>(\n a,\n field({ out: ['out', array<T, D>()], except: ['except', b] }),\n $let<DiffArr<T>, D, C1, RORec<'indexInExcept', number>>(\n {\n indexInExcept: ['indexInExcept', indexOfArray<T, D, C1>(except, curr)],\n },\n ite<DiffArr<T>, D, C2>(\n gte(indexInExcept, val(0)),\n field({\n out: ['out', out],\n except: [\n 'except',\n concatArray<T, D, C2>(\n ite<Arr<T>, D, C2>(\n eq(indexInExcept)(val(0)),\n array<T, D>(),\n slice<T, D, C2>(except, val(0), indexInExcept),\n ),\n slice<T, D, C2>(except, add(indexInExcept, val(1)), size(except)),\n ),\n ],\n }),\n field({\n out: ['out', concatArray<T, D, Reduce<T, DiffArr<T>>>(out, array(curr))],\n except: ['except', except],\n }),\n ),\n ),\n ),\n ],\n },\n ctx<DiffArr<T>>()('res').of('out').expr(),\n )\n}\n","import type {\n App,\n Arr,\n ConstHKT,\n HKT,\n IdHKT,\n O,\n RORec,\n RawObj,\n Rec,\n StrKey,\n rawItem,\n} from '../../types'\nimport type { ExprHKT, ExprsExact } from '../expression/concat'\nimport { root, type Field } from '../field'\nimport type {\n AccumulatorHKT,\n Accumulators,\n Expr,\n FRawStages,\n LookupArgs,\n Query,\n RawStages,\n} from '../types'\nimport type { Updater } from '../update/updater'\nimport { id } from '../utils/json'\nimport { mapExactToObject, type ExactKeys } from '../utils/map-object'\nimport { asStages } from './prefix'\n\ntype s = string\nexport const $match1 =\n <T extends O, C = unknown>(query?: Query<T, C>): FRawStages<T, T, T, C> =>\n f =>\n asStages(query ? [{ $match: query.raw(f<T>()) }] : [])\n\nexport const $set1 =\n <Q, T extends Q & O, V extends Q & O, C = unknown>(\n updater: Updater<T, T, V, C>,\n ): FRawStages<Q, T, V, C, 1> =>\n f =>\n asStages([\n {\n $set: Object.fromEntries(\n updater.raw(f<T>()).map(([k, v]) => [\n f<T>()\n .of(k.slice(1) as keyof T)\n .str(),\n v,\n ]),\n ),\n },\n ])\n\nexport const $project1 = <T extends O, K extends StrKey<T>>(\n projection: ExactKeys<K>,\n): RawStages<T, T, T, unknown, 1> =>\n asStages([\n {\n $project: mapExactToObject<RORec<K, 1>, IdHKT, ConstHKT<1>>(projection, () => 1),\n },\n ])\n\nexport const $replaceWith1 =\n <T extends O, V extends O, C = unknown>(expr: Expr<V, T, C>): FRawStages<O, T, V, C, 1> =>\n f => {\n const parts = f<T>().str().split('.').filter(id)\n return asStages([\n { $replaceWith: parts.reduce((v, k) => ({ [k]: v }), expr.raw(f<T>()).get()) },\n ])\n }\n\nexport const $unwind1 =\n <T extends O, K extends s, R, Null extends null = never>(\n k: K,\n includeNull?: Null,\n ): FRawStages<T, T & Rec<K, Arr<R>>, T & Rec<K, R | Null>> =>\n f => {\n const path = `$${f<Rec<K, Arr<R>>>().of(k).str()}`\n return asStages([\n { $unwind: includeNull === null ? { path, preserveNullAndEmptyArrays: true } : path },\n ])\n }\n\nexport const $group1 =\n <T extends O, ID, V extends O, C>(id: Expr<ID, T, C>, args: Accumulators<T, V, C>) =>\n <F extends HKT<O, O>>(\n f: <T extends O>() => Field<App<F, T>, T>,\n ): RawStages<O, App<F, T>, Rec<'_id', ID> & V, C, 1> =>\n asStages([\n {\n $group: {\n _id: id.raw(f()).get(),\n ...mapExactToObject<V, AccumulatorHKT<T, C>, ConstHKT<RawObj>>(args, v => v.raw(f<T>())),\n },\n },\n ])\n\nexport const $documents1 =\n <Q extends O, T extends Q & O, C>(docs: Expr<Arr<T>, unknown, C>) =>\n <F extends HKT<O, O>>(\n f: <T extends O>() => Field<App<F, T>, T>,\n ): RawStages<unknown, null, App<F, T>, C, 1> =>\n asStages([{ $documents: docs.raw(f<never>()).get() }])\n\nexport const rawVars = <T, Ctx, C, V extends O>(\n vars: ExprsExact<Ctx, T, C>,\n f: Field<V, T, unknown>,\n) => mapExactToObject<Ctx, ExprHKT<T, C>, ConstHKT<rawItem>>(vars, v => v.raw(f).get())\n\nexport const $simpleLookup1 =\n <T extends O, U extends O, R, K extends s, Ctx, C = unknown, S = string>(\n args: LookupArgs<T, U, R, K, Ctx, C, S>,\n ): FRawStages<T, T, T & Rec<K, Arr<U>>, C, 1> =>\n f => {\n const { coll, k, vars, fields, ...etc } = args\n const letVars = rawVars(vars, f<T>())\n return asStages([\n {\n $lookup: {\n ...(coll && { from: coll.collectionName }),\n ...(fields && {\n localField: f<T>().with(fields.local).str(),\n foreignField: root<R & O>().with(fields.foreign).str(),\n }),\n as: f<Rec<K, Arr<U>>>().of(k).str(),\n ...(Object.keys(letVars).length > 0 && { let: letVars }),\n ...etc,\n },\n },\n ])\n }\n","import type { Arr, IdHKT, O, Rec } from '../../types'\nimport { root } from '../field'\nimport type { Accumulators, Expr, LookupArgs, Query, RawStages } from '../types'\nimport type { Updater } from '../update/updater'\nimport {\n $documents1,\n $group1,\n $match1,\n $project1,\n $replaceWith1,\n $set1,\n $simpleLookup1,\n $unwind1,\n} from './raws'\nexport * from './raws'\n\ntype s = string\n\nexport const $match_ = <T extends O, C = unknown>(\n query?: Query<T, C>,\n): RawStages<O<T>, T, T, C> => $match1(query)<IdHKT<O>>(root)\n\nexport const $set_ = <Q, T extends Q & O, V extends Q & O, C = unknown>(\n updater: Updater<T, T, V, C>,\n): RawStages<O<Q>, T, V, C, 1> => $set1<Q, T, V, C>(updater)<IdHKT<O>>(root)\n\nexport const $replaceWith_ = <T extends O, V extends O, C = unknown>(\n expr: Expr<V, T, C>,\n): RawStages<O, T, V, C, 1> => $replaceWith1(expr)<IdHKT<O>>(root)\n\nexport const $unwind_ = <T extends O, K extends s, U, Null extends null = never>(\n k: K,\n includeNull?: Null,\n): RawStages<O<T>, T & Rec<K, Arr<U>>, T & Rec<K, Null | U>> =>\n $unwind1<T, K, U, Null>(k, includeNull)<IdHKT<O>>(root)\n\nexport const $group_ =\n <V extends O>() =>\n <ID, T extends O, C = unknown>(\n id: Expr<ID, T, C>,\n args: Accumulators<T, V, C>,\n ): RawStages<O, T, Rec<'_id', ID> & V, C, 1> =>\n $group1<T, ID, V, C>(id, args)<IdHKT<O>>(root)\n\nexport const $documents_ = <T extends O, C>(docs: Expr<Arr<T>, unknown, C>) =>\n $documents1(docs)<IdHKT<O>>(root)\n\nexport const $project_ = $project1\n\nexport const $simpleLookup_ = <\n T extends O,\n U extends O,\n R,\n K extends s,\n Ctx,\n C = unknown,\n S = string,\n>(\n args: LookupArgs<T, U, R, K, Ctx, C, S>,\n): RawStages<O<T>, T, T & Rec<K, Arr<U>>, C, 1> => $simpleLookup1(args)<IdHKT<O>>(root)\n","import type { Arr, ID, O, RORec, Rec, RecHKT } from '../../../../types'\nimport { array, filterDefined } from '../../../expression/array'\nimport { field, type ExprHKT, type ExprsExact } from '../../../expression/concat'\nimport { eqTyped, ite, sub } from '../../../expression/logic'\nimport { $getField, nil, val } from '../../../expression/val'\nimport { root } from '../../../field'\nimport type { AccumulatorHKT, After, Deleted, DeletedFlags, Delta, Expr, Part as AccPart, RawStages } from '../../../types'\nimport type { DeltaAccumulatorHKT, DeltaAccumulators } from '../../../types/accumulator'\nimport { mapExact } from '../../../utils/map-object'\nimport { $group_, $replaceWith_, $unwind_ } from '../../mongo-stages'\nimport { link } from '../../prefix'\n\nexport type WithItem<V, Grp> = Rec<'_id', Grp> & Rec<'item', O<V>>\n\nexport const subGroup = <T extends O, Grp, V extends O, GID extends string>(\n id: Expr<Grp, T>,\n args: DeltaAccumulators<T, V>,\n addGrp: <D extends Rec<'_id', Grp>>(src: ExprsExact<V, D>) => ExprsExact<RORec<GID, Grp> & V, D>,\n): RawStages<unknown, Delta<T>, Rec<GID, Grp> & V> => {\n type Extra = ID & Deleted\n type Part = AccPart<T>\n type AfterKeep = Rec<'after', T> & Extra\n type BeforeKeep = Rec<'before', T> & Extra\n type GrpId = Rec<'_id', Grp>\n type WithGrpId = GrpId & V\n type HasItem = WithGrpId\n\n const part = filterDefined<Part, Delta<T>>(\n array<Part | null, Delta<T>>(\n ite<Part | null, null, T, RecHKT<'after', unknown, Extra>>(\n eqTyped<null, T, RecHKT<'after', unknown, Extra>>(root<After<T>>().of('after').expr(), nil),\n nil,\n field<Part, AfterKeep>({\n v: ['v', root<AfterKeep>().of('after').expr()],\n old: ['old', val(false)],\n deleted: [\n 'deleted',\n root<AfterKeep>()\n .of<Deleted, 'deleted', null>('deleted')\n .of<DeletedFlags, 'after', null>('after')\n .expr(),\n ],\n }),\n ),\n ite<Part | null, null, T, RecHKT<'before', unknown, Extra>>(\n eqTyped<null, T, RecHKT<'before', unknown, Extra>>(\n root<Rec<'before', T | null> & Extra>().of('before').expr(),\n nil,\n ),\n nil,\n field<Part, BeforeKeep>({\n v: ['v', root<BeforeKeep>().of('before').expr()],\n old: ['old', val(true)],\n deleted: [\n 'deleted',\n root<BeforeKeep>()\n .of<Deleted, 'deleted', null>('deleted')\n .of<DeletedFlags, 'before', null>('before')\n .expr(),\n ],\n }),\n ),\n ),\n )\n\n const replaceWith = <X extends O, A extends O>(expr: Expr<X, A>) => $replaceWith_(expr)\n\n return link<Delta<T>, unknown>()\n .with<unknown, Rec<'part', Arr<Part>>>(\n $replaceWith_(\n field({\n part: ['part', part],\n }),\n ),\n )\n .with<unknown, Rec<'part', Part>>($unwind_<O, 'part', Part>('part'))\n .with<unknown, Part>($replaceWith_(root<Rec<'part', Part>>().of('part').expr()))\n .with<unknown, WithGrpId>(\n $group_<V>()(\n sub(id, root<Part>().of('v')),\n mapExact<V, DeltaAccumulatorHKT<T>, AccumulatorHKT<Part>>(args, v => v.group),\n ),\n )\n .with<unknown, Rec<GID, Grp> & V>(\n replaceWith(\n field(\n addGrp<Rec<'_id', Grp> & HasItem>(\n mapExact<V, DeltaAccumulatorHKT<T>, ExprHKT<WithGrpId>>(args, (_, k) =>\n $getField(root<HasItem>().expr(), k),\n ),\n ),\n ),\n ),\n ).stages\n}\n","import type { Arr } from '../../types'\nimport type { Expr } from '../types'\nimport { asExpr, asExprRaw } from './expr-base'\n\nexport const dayAndMonthPart = <D, C>(date: Expr<Date, D, C>): Expr<string, D, C> =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%m-%d' } }),\n })\nexport const now = <D, C>(): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f => asExprRaw('$$NOW'),\n })\nexport const monthPart = <D, C>(date: Expr<Date, D, C>): Expr<string, D, C> =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%m' } }),\n })\nexport const weekPart = <D, C>(date: Expr<Date, D, C>): Expr<string, D, C> =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%U' } }),\n })\nexport const year = <D, C>(date: Expr<Date, D, C>): Expr<number, D, C> =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $year: date.raw(f).get() }),\n })\nexport const dateAdd = <D, C>(\n date: Expr<Date, D, C>,\n amount: Expr<number, D, C>,\n unit: Expr<'year' | 'week' | 'month' | 'day' | 'hour' | 'minute' | 'second', D, C>,\n): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f =>\n asExprRaw({\n $dateAdd: {\n startDate: date.raw(f).get(),\n unit: unit.raw(f).get(),\n amount: amount.raw(f).get(),\n },\n }),\n })\n\nexport const maxDate = <D, C>(expr: Expr<Arr<Date>, D, C>): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f => asExprRaw({ $max: expr.raw(f).get() }),\n })\n\nexport const minDate = <D, C>(expr: Expr<Arr<Date>, D, C>): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f => asExprRaw({ $min: expr.raw(f).get() }),\n })\nexport const datePart = <D, C>(date: Expr<Date, D, C>): Expr<string, D, C> =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%m-%d' } }),\n })\nexport const startOf = <D, C>(\n startDate: Expr<Date, D, C>,\n freq: Expr<'week' | 'day' | 'month' | 'year', D, C>,\n offset: Expr<number, D, C>,\n): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f =>\n asExprRaw({\n $let: {\n vars: { d: startDate.raw(f).get(), f: freq.raw(f).get(), i: offset.raw(f).get() },\n in: {\n $switch: {\n branches: [\n {\n case: { $eq: ['$$f', 'week'] },\n then: {\n $dateFromParts: {\n isoWeekYear: { $isoWeekYear: '$$d' },\n isoWeek: {\n $add: [\n { $isoWeek: '$$d' },\n {\n $cond: {\n if: {\n $lt: ['$$i', { $isoDayOfWeek: '$$d' }],\n },\n then: 1,\n else: 0,\n },\n },\n ],\n },\n isoDayOfWeek: '$$i', // 1 is default = monday\n },\n },\n },\n {\n case: { $eq: ['$$f', 'month'] },\n then: {\n $dateFromParts: {\n year: { $year: '$$d' },\n month: {\n $add: [\n { $month: '$$d' },\n {\n $cond: {\n if: {\n $lt: ['$$i', { $dayOfMonth: '$$d' }],\n },\n then: 1,\n else: 0,\n },\n },\n ],\n },\n day: '$$i', // 1 is default = 1\n },\n },\n },\n {\n case: { $eq: ['$$f', 'year'] },\n then: {\n $dateFromParts: {\n year: {\n $add: [\n { $year: '$$d' },\n {\n $cond: {\n if: {\n $or: [\n {\n $lt: [{ $floor: { $divide: ['$$i', 100] } }, { $month: '$$d' }],\n },\n {\n $and: [\n {\n $eq: [\n { $floor: { $divide: ['$$i', 100] } },\n { $month: '$$d' },\n ],\n },\n {\n $lt: [{ $mod: ['$$i', 100] }, { $dayOfMonth: '$$d' }],\n },\n ],\n },\n ],\n },\n then: 1,\n else: 0,\n },\n },\n ],\n },\n month: { $floor: { $divide: ['$$i', 100] } }, // 101 is default = 1\n day: { $mod: ['$$i', 100] }, // 101 is default = 1\n },\n },\n },\n ],\n default: {\n $dateFromParts: {\n year: { $year: '$$d' },\n month: { $month: '$$d' },\n day: { $add: [{ $dayOfMonth: '$$d' }, '$$i'] }, // 0 default = 0\n },\n },\n },\n },\n },\n }),\n })\n\nexport const dateDiff = <D, C>({\n end,\n unit,\n start,\n}: {\n start: Expr<Date, D, C>\n end: Expr<Date, D, C>\n unit: Expr<'week' | 'day' | 'month' | 'year', D, C>\n}): Expr<number, D, C> =>\n asExpr<number, D, C>({\n raw: f =>\n asExprRaw({\n $let: {\n vars: {\n f: unit.raw(f).get(),\n end: end.raw(f).get(),\n start: start.raw(f).get(),\n },\n in: {\n $let: {\n vars: {\n diff: {\n $dateDiff: {\n startDate: '$$start',\n endDate: '$$end',\n unit: '$$f',\n },\n },\n },\n in: {\n $switch: {\n branches: [\n {\n case: { $eq: ['$$f', 'month'] },\n then: {\n $cond: {\n if: {\n $lte: [{ $dayOfMonth: '$$start' }, { $dayOfMonth: '$$end' }],\n },\n then: '$$diff',\n else: { $subtract: ['$$diff', 1] },\n },\n },\n },\n {\n case: { $eq: ['$$f', 'week'] },\n then: {\n $cond: {\n if: {\n $lte: [{ $isoDayOfWeek: '$$start' }, { $isoDayOfWeek: '$$end' }],\n },\n then: '$$diff',\n else: { $subtract: ['$$diff', 1] },\n },\n },\n },\n {\n case: { $eq: ['$$f', 'year'] },\n then: {\n $cond: {\n if: {\n $or: [\n {\n $lt: [{ $month: '$$start' }, { $month: '$$end' }],\n },\n {\n $and: [\n {\n $eq: [{ $month: '$$start' }, { $month: '$$end' }],\n },\n {\n $lte: [{ $dayOfMonth: '$$start' }, { $dayOfMonth: '$$end' }],\n },\n ],\n },\n ],\n },\n then: '$$diff',\n else: { $subtract: ['$$diff', 1] },\n },\n },\n },\n ],\n default: '$$diff',\n },\n },\n },\n },\n },\n }),\n })\n\nexport const mapFromPlainDateTime = <D, C>({\n plainDate,\n timezone,\n}: {\n plainDate: Expr<Date, D, C>\n timezone: Expr<string, D, C>\n}): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f =>\n asExprRaw({\n $dateFromString: {\n dateString: {\n $dateToString: { date: plainDate.raw(f).get(), timezone: 'GMT' },\n },\n timezone: timezone.raw(f).get(),\n },\n }),\n })\n\nexport const mapToPlainDateTime = <D, C>(\n date: Expr<Date, D, C>,\n timezone: Expr<string, D, C>,\n): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f =>\n asExprRaw({\n $dateFromString: {\n $dateToString: {\n date: date.raw(f).get(),\n timezone: timezone.raw(f).get(),\n },\n },\n }),\n })\n","import type { Arr, RORec } from '../../types'\nimport { ctx, Field } from '../field'\nimport type { Expr } from '../types'\nimport { asExpr, asExprRaw } from './expr-base'\n\n// exclusif\nexport const range = <D, C>(\n start: Expr<number, D, C>,\n end: Expr<number, D, C>,\n step?: Expr<number, D, C>,\n) =>\n asExpr<Arr<number>, D, C>({\n raw: f =>\n asExprRaw({ $range: [start.raw(f).get(), end.raw(f).get(), step?.raw(f).get() ?? 1] }),\n })\n\nexport const $map0 = <K extends string, T, R, D, C>({\n as,\n expr,\n input,\n}: {\n input: Expr<Arr<T>, D, C>\n as: K\n expr: Expr<R, D, RORec<K, T> & C>\n}) =>\n asExpr<Arr<R>, D, C>({\n raw: f =>\n asExprRaw({\n $map: {\n input: input.raw(f).get(),\n as,\n in: expr.raw(f).get(),\n },\n }),\n })\nexport const $map1 = <T, R, D, C>(\n ex: Expr<Arr<T>, D, C>,\n map: (i: Field<unknown, T, RORec<'item', T>>) => Expr<R, D, RORec<'item', T> & C>,\n) => $map0({ input: ex, as: 'item', expr: map(ctx<T>()('item')) })\nexport const $map = <T, R, D, C = unknown>(\n ex: Expr<Arr<T>, D, C>,\n map: (i: Expr<T, D, RORec<'item', T>>) => Expr<R, D, RORec<'item', T> & C>,\n) => $map1(ex, i => map(i.expr()))\n","import type { Arr, Exclude, HKT, I, N, O, StrKey, Type, notArr, rawItem } from '../../types'\nimport { Field } from '../field'\nimport type { Expr } from '../types'\nimport { mapExactToObject0, type MapO } from '../utils/map-object'\n\ntype Omit<T, K extends keyof any> = T extends T ? Pick<T, Exclude<keyof T, K>> : never\n\ndeclare const Updater: unique symbol\nexport type Updater<in R, in T, out V, in C = unknown> = {\n [Type]?(x: typeof Updater, r: R, t: T, c: C): V\n readonly raw: <D extends O>(f: Field<D, R | N>) => readonly (readonly [string, rawItem])[]\n}\n\nexport const subUpdater = <P extends O, D, T, V, Ctx>(\n a: Updater<D, T, V, Ctx>,\n f: Field<P, D>,\n): Updater<P, T, V, Ctx> => ({ raw: <R extends O>(g: Field<R, P | N>) => a.raw(g.with(f)) })\n\nexport interface UpdaterHKT<R, Old, V, C, K extends keyof Old = keyof Old, V2 extends V = V>\n extends UpdaterQHKT<R, Old, V2, StrKey<V>, C, K> {}\n\nexport interface UpdaterQHKT<R, Old, V, KV extends StrKey<V>, C, K extends keyof Old = keyof Old>\n extends HKT<KV> {\n readonly out: Updater<R, Get<Old, I<KV, this>, K>, V[I<KV, this>], C>\n}\n\nexport type Get<T, P extends string, K extends keyof T = never> = P extends K\n ? T[P] // help typescript to make a decision\n : P extends keyof T\n ? T[P]\n : undefined\n\nconst rawSet =\n <R, Old extends notArr, C, V, K extends keyof Old, KV extends StrKey<V>>(\n fields: MapO<V, UpdaterQHKT<R, Old, V, KV, C, K>, KV>,\n ) =>\n <D extends O>(f: Field<D, R | N, unknown>): readonly (readonly [string, rawItem])[] => {\n type U = UpdaterQHKT<R, Old, V, KV, C, K>\n return Object.entries(mapExactToObject0<V, U, U, KV>(fields, v => v)).flatMap(([k, v]) =>\n v.raw(f).map(([l, v]) => [`.${k}${l}`, v]),\n )\n }\n\nexport const set =\n <V>() =>\n <R, Old extends notArr, C = unknown, K extends keyof Old = never>(\n fields: MapO<V, UpdaterHKT<R, Old, V, C, K>>,\n ): Updater<R, Old, O & Omit<Old, StrKey<V>> & V, C> &\n Updater<R, Arr<Old>, Arr<Omit<Old, StrKey<V>> & V>, C> => ({\n raw: rawSet(fields),\n })\n\nexport const setQ = <VV, Q extends O>() => {\n type V = Omit<VV, StrKey<Q>>\n type KV = Exclude<StrKey<VV>, StrKey<Q>>\n return <R extends Q, C = unknown, K extends keyof R = never>(\n fields: MapO<V, UpdaterQHKT<R, R, VV, KV, C, K>, KV>,\n ): Updater<R, R, Q & Omit<R, StrKey<VV>> & V, C> => ({\n raw: rawSet<R, R, C, VV, K, KV>(fields),\n })\n}\nexport const weaken = <R, T, V, C = unknown>(\n updater: Updater<R, T, V, C>,\n): Updater<R | null, T | N, V | null, C> => ({ raw: f => updater.raw(f) })\n\nexport const to = <R, V, C = unknown, T = unknown>(expr: Expr<V, R, C>): Updater<R, T, V, C> => ({\n raw: f => [['', expr.raw(f).get()]],\n})\nexport const items = <R, T, V, C = unknown>(x: Updater<R, T, V, C>) =>\n x as {} as Updater<R, Arr<T>, Arr<V>, C>\n","import type { RawObj, ReadonlyCollection, WriteonlyCollection } from '../../types'\nimport { safeNarrow } from './json';\n\nexport const dbcoll = (x: ReadonlyCollection<unknown> | WriteonlyCollection<never>) => safeNarrow<RawObj>()({\n db: x.dbName,\n coll: x.collectionName,\n})\n","import type { O, RWCollection, ReadonlyCollection, Replace, jsonItem } from '../../types'\nimport type { ExprsExact } from '../expression/concat'\nimport { root, type Field } from '../field'\nimport type { RawStages } from '../types'\nimport { dbcoll } from '../utils/coll'\nimport { asStages } from './prefix'\nimport { rawVars } from './raws'\n\nexport type MergeInto<T extends O, Out extends O, E = unknown> =\n | { whenNotMatched: 'insert'; into: RWCollection<T, Out> & E }\n | { whenNotMatched: 'discard' | 'fail'; into: ReadonlyCollection<Out> & E }\n\n// whenNotMatched == 'insert' || whenMatched == 'replace' => Out extends T\n// whenMatched == 'merge' => Out extends T | into: WriteonlyCollection<Out>\n// whenMatched == 'merge' => Out extends T | into: WriteonlyCollection<Out>\nexport type MergeArgs<T extends O, Out extends O, Ctx, In extends O> = {\n on: Field<T, jsonItem> & Field<Out, jsonItem>\n} & MergeInto<T, Out> &\n (\n | ({ stages?: never } & (\n | { whenMatched: 'keepExisting' | 'fail' }\n | {\n whenMatched: 'replace'\n into: RWCollection<T, Out>\n }\n | {\n whenMatched: 'merge'\n into: RWCollection<Replace<Out, T>, Out>\n }\n ))\n | {\n stages: true\n into: RWCollection<In, Out>\n whenMatched: RawStages<unknown, Out, In, { new: T }>\n }\n | {\n stages: 'ctx'\n vars: ExprsExact<Ctx, T>\n into: RWCollection<In, Out>\n whenMatched: RawStages<unknown, Out, In, Ctx>\n }\n )\n\nexport const $merge_ = <T extends O, Out extends O = T, Ctx = unknown, In extends O = Out>({\n into,\n on,\n whenNotMatched,\n ...notMatched\n}: MergeArgs<T, Out, Ctx, In>) =>\n asStages<unknown, T, 'out'>([\n {\n $merge: {\n into: dbcoll(into),\n on: on.str(),\n ...(whenNotMatched && { whenNotMatched }),\n ...(notMatched.stages && {\n whenMatched: notMatched.whenMatched,\n ...(notMatched.stages === 'ctx' && { let: rawVars(notMatched.vars, root<T>()) }),\n }),\n },\n },\n ])\nexport const $merge2 = <T extends O, Out extends O = T, Ctx = unknown, In extends O = Out>(\n args: MergeArgs<T, Out, Ctx, In>,\n) => $merge_<T, Out, Ctx, In>(args)\n","import type {\n ConstHKT,\n Filter,\n HKT,\n I,\n IdHKT,\n Omit,\n Exclude,\n OPick,\n RWCollection,\n Timestamp,\n WriteonlyCollection,\n} from '../../types'\nimport type { doc, ID, N, O, rawItem, Rec, Replace, RORec, StrKey } from '../../types/json'\nimport { mergeObjects, ne } from '../expression'\nimport { field, type ExprHKT, type ExprsExact } from '../expression/concat'\nimport { $ifNull, and, eq, eqTyped, ite, sub } from '../expression/logic'\nimport { current, nil, val } from '../expression/val'\nimport { ctx, Field, root } from '../field'\nimport type {\n Before,\n DeletedAt,\n Delta,\n Expr,\n IsDeleted,\n Model,\n RawStages,\n StreamRunnerParam,\n TeardownRecord,\n TS,\n} from '../types'\nimport { set, to } from '../update'\nimport { id } from '../utils/json'\nimport { mapExact, mapExactToObject, spread, type Exact, type MappedHKT } from '../utils/map-object'\nimport { $replaceWith_, $set_ } from './mongo-stages'\nimport { $merge_ } from './out'\nimport { link } from './prefix'\n\ntype OutInputE<T, E, A = T | null> = ID & Rec<'after', A> & E\ntype Allowed<K extends string> = Exclude<K, keyof (TS & ID)>\n\nexport type Patch<V, KK extends StrKey<V> = StrKey<V>> = (\n | (OPick<V, Allowed<KK>> & ID)\n | (Rec<Allowed<KK>, N> & ID)\n) &\n TS\ntype TakeDoc<V, E = ID, KK extends StrKey<V> = StrKey<V>> = OPick<V, Allowed<KK>> & E\ntype ND = { readonly deletedAt?: null }\n\ntype SafeE<E> = Omit<E, `$${string}` | keyof ID>\n\ntype Args<P, Out> = [added: Expr<P, unknown, { new: P }>, old: Expr<Out, Out>]\ntype Result<P> = Expr<P, unknown, { new: P }>\ntype Update<P, Out> = (...args: Args<P, Out>) => Result<P>\ntype UpdateF<P, Out> = <K extends keyof IsDeleted>(\n ...args: Args<Replace<P, RORec<K, Timestamp>>, Out>\n) => Result<Replace<P, RORec<K, Timestamp>>>\n\nexport const getSubsetMatchForExt = <\n Out extends Model,\n P extends O & ID & TS,\n E extends Record<keyof E, rawItem>,\n>(\n ext: Exact<E, IdHKT>,\n): null | Expr<boolean, Rec<'old' | 'merged', Out | Replace<Out, P>>> => {\n type OldAndMerged = Rec<'old' | 'merged', Out | Replace<Out, P>>\n const extObj: Record<StrKey<E>, Expr<boolean, OldAndMerged>> = mapExactToObject<\n E,\n IdHKT,\n ConstHKT<Expr<boolean, OldAndMerged>>\n >(ext, (v, k) => {\n return eq<unknown, OldAndMerged>(\n root<OldAndMerged>()\n .of('old')\n .of(k as never)\n .expr() as Expr<unknown, OldAndMerged>,\n )(val(v))\n })\n const checks = Object.values<Expr<boolean, OldAndMerged>>(extObj)\n return checks.length ? (checks.length === 1 ? checks[0]! : and(...checks)) : null\n}\n\nexport const getWhenMatchedForMerge = <\n Out extends Model,\n P extends O & ID & TS,\n K extends keyof IsDeleted,\n>(\n whenNotMatched: 'discard' | 'fail' | 'insert',\n update: Update<Replace<P, RORec<K, Timestamp>>, Out>,\n canWrite: Expr<boolean, Rec<'old' | 'merged', Out | Replace<Out, P>>> | null,\n): RawStages<O, Out, Out | Replace<Out, P>, RORec<'new', Replace<P, RORec<K, Timestamp>>>> => {\n const orNull = <T, C>(e: Expr<Timestamp | N, T, C>) =>\n whenNotMatched === 'discard' ? $ifNull(e, nil) : e\n type PP = Replace<P, RORec<K, Timestamp>>\n\n type Merged = Replace<Out, P>\n type OldAndMerged = Rec<'old' | 'merged', Out | Merged>\n\n const newOrOld: Field<O<DeletedAt>, O<DeletedAt>, RORec<'new', O<DeletedAt>>> = whenNotMatched ===\n 'insert'\n ? ctx<O<DeletedAt>>()('new')\n : root<O<DeletedAt>>()\n const deletedAt = orNull(newOrOld.of('deletedAt').expr()) as Expr<\n Timestamp | N,\n Out,\n { new: PP }\n >\n const merged = mergeObjects<Out, PP | O<DeletedAt>, Out, { new: PP }>(\n root<Out>().expr(),\n update(ctx<PP>()('new').expr(), root<Out>().expr()),\n field<O<DeletedAt>, Out, { new: PP }>({\n deletedAt: ['deletedAt', deletedAt],\n }),\n ) as Expr<Replace<Out, P>, Out, { new: PP }>\n return link<Out, { new: PP }>()\n .with(\n $replaceWith_<Out, OldAndMerged, { new: PP }>(\n field<OldAndMerged, Out, { new: PP }>({\n old: ['old', root<Out>().expr()],\n merged: ['merged', merged],\n }),\n ),\n )\n .with(getWhenMatched<Out, P>(whenNotMatched, canWrite)).stages\n}\n export const getWhenMatched = <Out extends Model, P extends O & ID & TS>(\n whenNotMatched: 'discard' | 'fail' | 'insert',\n canWrite: Expr<boolean, Rec<'old' | 'merged', Out | Replace<Out, P>>> | null,\n): RawStages<O, Rec<'old' | 'merged', Out | Replace<Out, P>>, Out | Replace<Out, P>> => {\n const orNull = <T, C>(e: Expr<Timestamp | N, T, C>) =>\n whenNotMatched === 'discard' ? $ifNull(e, nil) : e\n\n type Merged = Replace<Out, P>\n type OldAndMerged = Rec<'old' | 'merged', Out | Merged>\n const preMergeOld: Expr<Out | Merged, OldAndMerged> = mergeObjects<\n Out | Merged,\n O<DeletedAt>,\n OldAndMerged\n >(\n root<OldAndMerged>().of('old').expr(),\n field<O<DeletedAt> & TS, OldAndMerged>({\n deletedAt: ['deletedAt', orNull(root<OldAndMerged>().of('old').of('deletedAt').expr())],\n touchedAt: ['touchedAt', root<OldAndMerged>().of('merged').of('touchedAt').expr()],\n }),\n )\n\n const diff = ne<Out | Merged, OldAndMerged>(preMergeOld)(root<OldAndMerged>().of('merged').expr())\n const useNew = canWrite ? and(diff, canWrite) : diff\n\n return link<OldAndMerged>().with(\n $replaceWith_<OldAndMerged, Out | Replace<Out, P>>(\n ite(useNew, root<OldAndMerged>().of('merged').expr(), root<OldAndMerged>().of('old').expr()),\n ),\n ).stages\n}\n\ntype MergeCollection<V extends O, Out extends Model> =\n | {\n coll: RWCollection<Out | Replace<Out, Patch<V>> | Replace<Patch<V>, IsDeleted>, Out>\n whenNotMatched: 'discard'\n }\n | {\n coll: RWCollection<Out | Replace<Out, Patch<V>>, Out>\n whenNotMatched: 'fail'\n }\ntype MergeUpdate<V, Out> = UpdateF<\n ((OPick<V, Allowed<StrKey<V>>> & ID) | (Rec<Allowed<StrKey<V>>, N> & ID)) & TS,\n Out\n>\n\nconst $mergeX = <\n V extends O,\n Out extends Model,\n Source extends O,\n SourcePart extends doc,\n EEE extends { [K in StrKey<EEE>]: rawItem },\n Intermediate extends O = Source,\n>(\n out: MergeCollection<V, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, SourcePart>,\n f: Field<Intermediate, SourcePart>,\n map: (x: Expr<Patch<V>, Intermediate>) => Expr<Patch<V>, Source>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n update: MergeUpdate<V, Out>,\n): StreamRunnerParam<Source, 'out'> => {\n type EE = SafeE<EEE>\n type E = Omit<EE, keyof (ND & TS)>\n type K = Allowed<StrKey<V>>\n type T = OPick<V, K> & ID\n type P = (T | (Rec<K, N> & ID)) & TS\n type In1 = Out | Replace<Out, P> | Replace<P, IsDeleted>\n type In2 = Out | Replace<Out, P>\n const patch: ExprsExact<OPick<V, K>, Intermediate> = mapExact<\n OPick<V, K>,\n ExprHKT<SourcePart>,\n ExprHKT<Intermediate>\n >(keys, <P extends StrKey<OPick<V, K>>>(v: Expr<OPick<V, K>[P], SourcePart>) => {\n return $ifNull<OPick<V, K>[P], Intermediate, unknown>(sub(v, f), nil)\n })\n interface EqHKT<Dom = unknown> extends HKT<Dom> {\n readonly out: Record<'$eq', I<Dom, this>>\n }\n const filter: {\n readonly [K in StrKey<E>]: Record<'$eq', E[K]>\n } = mapExactToObject<E, IdHKT, MappedHKT<E, EqHKT>>(ext, v => ({ $eq: v }))\n const sameSubset = getSubsetMatchForExt<Out, P, E>(ext)\n\n const setDeleted = out.whenNotMatched === 'discard'\n\n const replacer: Expr<Patch<V>, Source> = map(\n field<T & TS, Intermediate>(\n spread<Pick<V, K>, ID & TS, ExprHKT<Intermediate>, keyof O, O[keyof O]>(patch, {\n _id: ['_id', f.of('_id').expr()],\n touchedAt: ['touchedAt', current],\n }),\n ),\n )\n\n const sss: RawStages<unknown, P, 'out'> = setDeleted\n ? link<P>()\n .with<O, Replace<P, IsDeleted>>(\n $set_<O, P, Replace<P, IsDeleted>>(\n set<IsDeleted>()({\n deletedAt: ['deletedAt', to<P, Timestamp>(current)],\n }),\n ),\n )\n .with(\n $merge_<Replace<P, IsDeleted>, Out, unknown, In1>({\n into: out.coll,\n on: root<doc>().of('_id'),\n whenNotMatched: 'insert',\n stages: true,\n whenMatched: getWhenMatchedForMerge<Out, P, keyof IsDeleted>(\n out.whenNotMatched,\n update,\n sameSubset,\n ),\n }),\n ).stages\n : link<P>().with(\n $merge_<P, Out, unknown, In2>({\n into: out.coll,\n on: root<doc>().of('_id'),\n whenNotMatched: 'fail',\n stages: true,\n whenMatched: getWhenMatchedForMerge<Out, P, never>(\n out.whenNotMatched,\n update,\n sameSubset,\n ),\n }),\n ).stages\n\n const teardown = <W>(coll: WriteonlyCollection<W>): TeardownRecord<W, 'updateMany'> => ({\n collection: coll,\n method: 'updateMany',\n params: [\n filter as Filter<W>,\n [\n {\n $unset: Object.keys(\n mapExactToObject<TakeDoc<V, unknown>, IdHKT, ConstHKT<1>>(keys, () => 1),\n ),\n },\n ],\n ],\n })\n return {\n raw: (first: boolean): RawStages<unknown, Source, 'out'> =>\n link<Source>().with<unknown, P>($replaceWith_<Source, P>(replacer)).with<unknown, 'out'>(sss)\n .stages,\n teardown: c => c(teardown(out.coll)),\n }\n}\n\nexport const $mergeId =\n <V extends O>() =>\n <\n SourcePart extends doc,\n Out extends Model,\n E = unknown,\n EEE extends { [K in keyof EEE]: rawItem } = {},\n >(\n out: MergeCollection<V, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, SourcePart>,\n id: Expr<string, OutInputE<TakeDoc<V>, E, null>>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<OutInputE<SourcePart, E>, 'out'> => {\n type OutInput<T, A = T | null> = OutInputE<T, E, A>\n interface AfterHKT<T> extends HKT {\n readonly out: OutInput<T> & RORec<'after', I<unknown, this>>\n }\n type KK = StrKey<V>\n type K = Allowed<KK>\n type T = TakeDoc<V>\n type Patch = (T | (Rec<K, N> & ID)) & TS\n\n type Source = OutInputE<SourcePart, E>\n type Intermediate = OutInputE<0, E, SourcePart>\n\n return $mergeX<V, Out, Source, SourcePart, EEE, Intermediate>(\n out,\n keys,\n root<Intermediate>().of('after'),\n or => {\n return ite<Patch, null, SourcePart, AfterHKT<SourcePart>>(\n eqTyped<null, SourcePart, AfterHKT<SourcePart>>(\n root<OutInput<SourcePart>>().of('after').expr(),\n nil,\n ),\n field<RORec<K, N> & ID & TS, OutInput<T, null>>(\n spread<RORec<K, N>, ID & TS, ExprHKT<OutInput<T, null>>>(\n mapExact<OPick<V, Allowed<KK>>, IdHKT, ConstHKT<Expr<null, unknown>>>(\n keys,\n () => nil,\n ),\n {\n _id: ['_id', id],\n touchedAt: ['touchedAt', current],\n },\n ),\n ),\n or,\n )\n },\n ext,\n update,\n )\n }\n\nexport const $simpleMergePart =\n <V extends O>() =>\n <Source extends doc, Out extends Model, EEE extends { [K in StrKey<EEE>]: rawItem }>(\n out: MergeCollection<V, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, Source>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<Source, 'out'> =>\n $mergeX<V, Out, Source, Source, EEE>(out, keys, root(), id, ext, update)\n\nexport const $simpleMerge =\n <V extends O>() =>\n <Source extends doc, Out extends Model>(\n out: RWCollection<Out | Replace<Out, Patch<V>> | Replace<Patch<V>, IsDeleted>, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, Source>,\n whenNotMatched: 'fail' | 'discard' = 'fail',\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<Source, 'out'> =>\n $mergeX<V, Out, Source, Source, {}>({ coll: out, whenNotMatched }, keys, root(), id, {}, update)\n\nexport const $mergePart =\n <V extends O>() =>\n <Out extends Model, SourcePart extends doc, EEE extends { [K in keyof EEE]: rawItem }>(\n out: RWCollection<Out | Replace<Out, Patch<V>>, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, SourcePart>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<Delta<SourcePart>, 'out'> => {\n type Doc = Rec<'before', (doc & SourcePart) | null>\n return $mergeId<V>()<SourcePart, Out, Before<SourcePart | null>, EEE>(\n { coll: out, whenNotMatched: 'fail' },\n keys,\n assertNotNull(\n root<Doc>().of<Doc, 'before', 1>('before').of<doc & SourcePart, '_id', null>('_id').expr(),\n ),\n ext,\n update,\n )\n }\nexport const $merge =\n <V extends O>() =>\n <Out extends Model, SourcePart extends doc>(\n out: RWCollection<Out | Replace<Out, Patch<V>>, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, SourcePart>,\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<Delta<SourcePart>, 'out'> =>\n $mergePart<V>()<Out, SourcePart, {}>(out, keys, {}, update)\n\nconst assertNotNull = <T, D, C>(expr: Expr<T | N, D, C>) => expr as Expr<T, D, C>\n","import { getWhenMatched } from '../../$merge'\nimport type {\n App,\n AsLiteral,\n HKT,\n ID,\n O,\n RWCollection,\n RORec,\n Rec,\n Replace,\n notArr,\n Omit,\n Exclude,\n} from '../../../../types'\nimport { concat, field, type ExprHKT, type ExprsExact } from '../../../expression/concat'\nimport { $rand, current, nil, val } from '../../../expression/val'\nimport { ctx, root } from '../../../field'\nimport type { DeletedAt, Expr, IsDeleted, Model, RawStages, TS } from '../../../types'\nimport type { DeltaAccumulatorHKT, DeltaAccumulators } from '../../../types/accumulator'\nimport { set, subUpdater, to, type Get, type Updater, type UpdaterHKT } from '../../../update/updater'\nimport { map1 } from '../../../utils/json'\nimport { mapExact0, spread0, type MapO, type MappedHKT, type MergeHKT } from '../../../utils/map-object'\nimport { $replaceWith_, $set_ } from '../../mongo-stages'\nimport { $merge_ } from '../../out'\nimport { link } from '../../prefix'\n\ntype GI<GG> = Exclude<GG, keyof TS>\nexport type IdAndTsKeys = keyof (TS & ID)\n\n// TS & ID & V_Grp & Extra\ntype V<VV, GG extends string> = Omit<VV, IdAndTsKeys | GI<GG>>\nexport type Prepare<Grp, GG extends string> = TS & ID & Rec<GI<GG>, Grp>\ntype Par<T> = { [P in keyof T]?: T[P] | null }\n\nexport type Loose<Grp, VV, GG extends string> = Prepare<Grp, GG> & Par<V<VV, GG>> & DeletedAt\nexport type Strict<Grp, VV, GG extends string, EE> = Prepare<Grp, GG> &\n V<VV, GG> &\n Omit<EE, IdAndTsKeys | GI<GG> | keyof V<VV, GG>>\nexport type V_Grp<VV, GG extends string, Grp> = Rec<GI<GG>, Grp> & V<VV, GG>\nexport type Extra<EE, VV, GG extends string> = Omit<EE, IdAndTsKeys | GI<GG> | keyof V<VV, GG>>\n\ntype OrReplace<T, V> = T | Replace<T, V>\ntype ND = { readonly deletedAt?: null }\n\ntype StrictReady<Grp extends notArr, VV extends O, GG extends string, EE> = TS &\n ID &\n V_Grp<VV, GG, Grp> &\n Extra<EE, VV, GG>\ntype InsertReady<Grp extends notArr, VV extends O, GG extends string, EE> = Replace<\n StrictReady<Grp, VV, GG, EE>,\n ND\n>\ntype DiscardReady<Grp extends notArr, VV extends O, GG extends string, EE> = Replace<\n StrictReady<Grp, VV, GG, EE>,\n IsDeleted\n>\ntype MatchedReady<Out, VV extends O, GG extends string, EE> = Replace<\n Out,\n Replace<V<VV, GG>, Extra<EE, VV, GG>> & Model\n>\ntype MatchedIn<Out, VV extends O, GG extends string, EE> = Out | MatchedReady<Out, VV, GG, EE>\n\nexport type MergedInput<Out, VV, Grp, GG extends string, EE> = OrReplace<\n Replace<Replace<Out, V<VV, GG>>, Extra<EE, VV, GG>> & Model,\n TS & ID & V_Grp<VV, GG, Grp> & Extra<EE, VV, GG>\n>\n\ntype SubMergeInInsert<Out, VV extends O, Grp extends notArr, GG extends string, EE> =\n MatchedIn<Out, VV, GG, EE> | InsertReady<Grp, VV, GG, EE>\ntype SubMergeInDiscard<Out, VV extends O, Grp extends notArr, GG extends string, EE> =\n MatchedIn<Out, VV, GG, EE> | DiscardReady<Grp, VV, GG, EE>\nexport type SubMergeInFail<\n Out,\n VV extends O,\n Grp extends notArr,\n GG extends string,\n EE,\n> = OrReplace<MatchedReady<Out, VV, GG, EE>, StrictReady<Grp, VV, GG, EE>>\n\ntype SubMergeIntoFail<\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE,\n Out extends Loose<Grp, VV, GG>,\n> = RWCollection<MatchedIn<Out, VV, GG, EE>, Out>\n\ntype SubMergeIntoInsert<\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE,\n Out extends Loose<Grp, VV, GG>,\n> = RWCollection<SubMergeInInsert<Out, VV, Grp, GG, EE>, Out>\n\ntype SubMergeIntoDiscard<\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE,\n Out extends Loose<Grp, VV, GG>,\n> = RWCollection<SubMergeInDiscard<Out, VV, Grp, GG, EE>, Out>\n\nexport type SubMergeOut<\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, VV, GG> = Loose<Grp, VV, GG>,\n> =\n | { whenNotMatched: 'insert'; into: SubMergeIntoInsert<Grp, VV, GG, EE, Out> }\n | { whenNotMatched: 'discard'; into: SubMergeIntoDiscard<Grp, VV, GG, EE, Out> }\n | { whenNotMatched: 'fail'; into: SubMergeIntoFail<Grp, VV, GG, EE, Out> }\n\nexport const subMerge = <\n T extends O,\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, VV, GG> = Loose<Grp, VV, GG>,\n>(\n args: DeltaAccumulators<T, V<VV, GG>>,\n out: SubMergeOut<Grp, VV, GG, EE, Out>,\n gid: AsLiteral<GI<GG>>,\n // ExprsExact<Extra, V_Grp>\n extra: ExprsExact<Extra<EE, VV, GG>, V_Grp<VV, GG, Grp>>,\n idPrefix: string,\n first: boolean,\n): RawStages<unknown, V_Grp<VV, GG, Grp>, 'out'> => {\n type GID = GI<GG>\n type V_Grp = Rec<GID, Grp> & V\n // TS & ID & V_Grp & Extra\n type ReadyForMerge = StrictReady<Grp, VV, GG, EE>\n type Denied = IdAndTsKeys | GID\n type V = Omit<VV, Denied>\n type PV = Par<V>\n type New = RORec<'new', ReadyForMerge>\n type Extra = Omit<EE, IdAndTsKeys | GID | keyof V>\n\n const e: ExprsExact<Extra, ReadyForExtra> = extra\n type OldAndNew<T = Out> = Rec<'old', Out> & Rec<'merged', T>\n const mergeOldWithNew: MapO<V, UpdaterHKT<OldAndNew, Out, V, New, never>> = mapExact0<\n V,\n MappedHKT<V, DeltaAccumulatorHKT<T>>,\n UpdaterHKT<OldAndNew, Out, V, New, never>\n >(args, (v, k) =>\n to(\n first\n ? ctx<O<V>>()('new').of(k).expr()\n : v.merge<OldAndNew, New>(\n root<Rec<'old', O<PV>>>().of('old').of(k).expr(),\n ctx<O<V>>()('new').of(k).expr(),\n ),\n ),\n )\n\n const mergeAggregates: RawStages<O, OldAndNew, OldAndNew<Replace<Out, V>>, New> = $set_<\n O,\n OldAndNew,\n OldAndNew<Replace<Out, V>>,\n New\n >(\n set<Rec<'merged', Replace<Out, V>>>()({\n merged: ['merged', set<V>()(mergeOldWithNew)],\n }),\n )\n\n type Update<R, X, C = unknown, Subset extends X = X> = UpdaterHKT<R, R, X, C, never, Subset>\n const gidPath: Expr<Grp, V_Grp> = root<V_Grp>().of(gid).expr()\n\n type ExtraAndId = ID & TS & Extra\n type InsertReady = Replace<ReadyForMerge, ND>\n type DiscardReady = Replace<ReadyForMerge, IsDeleted>\n type ExtraAndIdHKT = MergeHKT<\n Extra,\n ID & TS,\n Update<V_Grp, Extra>,\n Update<V_Grp, ID & TS>\n >\n const mapId = <K extends string, F extends HKT<K>, X>(\n k: AsLiteral<K>,\n v: App<F, K>,\n ): MapO<RORec<K, X>, F> => map1(k, v)\n\n const F1: MapO<ID & TS, Update<V_Grp, ID & TS>> = {\n _id: ['_id', to(idPrefix ? concat(val(idPrefix), $rand) : $rand)],\n touchedAt: ['touchedAt', to(current)],\n }\n const F2: MapO<RORec<GID, Grp>, Update<V_Grp, RORec<GID, Grp>>> = mapId<\n GID,\n Update<V_Grp, RORec<GID, Grp>>,\n Grp\n >(gid, to(gidPath))\n const extraAndId: MapO<ExtraAndId, ExtraAndIdHKT> = spread0<\n Extra,\n ID & TS,\n Update<V_Grp, Extra>,\n Update<V_Grp, ID & TS>\n >(\n mapExact0<Extra, MappedHKT<Extra, ExprHKT<V_Grp>>, Update<V_Grp, Extra>>(extra, to),\n F1,\n )\n const extraIdAndGroup = spread0<\n ExtraAndId,\n RORec<GID, Grp>,\n ExtraAndIdHKT,\n Update<V_Grp, RORec<GID, Grp>>\n >(extraAndId, F2)\n const addExtraAndMerge = extraIdAndGroup as MapO<ReadyForMerge, Update<V_Grp, ReadyForMerge>>\n\n const addTSAndExtra: MapO<Extra, Update<ReadyForExtra, Extra, New>> = {\n ...mapExact0<Extra, MappedHKT<Extra, ExprHKT<ReadyForExtra>>, Update<ReadyForExtra, Extra>>(\n e,\n to,\n ),\n ...(out.whenNotMatched === 'insert' ? { deletedAt: ['deletedAt', to(nil)] } : {}),\n touchedAt: ['touchedAt', to(current)],\n }\n\n type ReadyForExtra = Replace<Out, V>\n type ReadyForWhenMatched = MatchedReady<Out, VV, GG, EE>\n\n const updater = set<Extra>()<ReadyForExtra, ReadyForExtra, New>(addTSAndExtra) as Updater<\n ReadyForExtra,\n ReadyForExtra,\n ReadyForWhenMatched,\n New\n >\n\n type In = MatchedIn<Out, VV, GG, EE>\n\n type WhenMatched = RawStages<\n O,\n Rec<'old' | 'merged', Out | ReadyForWhenMatched>,\n In\n >\n const whenMatched: WhenMatched = getWhenMatched<Out, Replace<V, Extra> & Model>(\n out.whenNotMatched,\n null,\n )\n\n const whenMatchedStages = link<Out, New>()\n .with<O, OldAndNew>(\n $replaceWith_(\n field({\n old: ['old', root<Out>().expr()],\n merged: ['merged', root<Out>().expr()],\n }),\n ),\n )\n .with<O, OldAndNew<ReadyForExtra>>(mergeAggregates)\n .with<O, OldAndNew<ReadyForWhenMatched>>(\n $set_<O, OldAndNew<ReadyForExtra>, OldAndNew<ReadyForWhenMatched>>(\n set<Rec<'merged', ReadyForWhenMatched>>()({\n merged: ['merged', subUpdater(updater, root<OldAndNew<ReadyForExtra>>().of('merged'))],\n }),\n ),\n )\n .with<O, In>(whenMatched).stages\n\n const ready = $set_<O, V_Grp, ReadyForMerge>(\n set<ReadyForMerge>()<V_Grp, V_Grp>(addExtraAndMerge),\n )\n const stages = link<V_Grp>().with<unknown, ReadyForMerge>(ready)\n\n if (out.whenNotMatched === 'insert') {\n const insertMarker = $set_<O, ReadyForMerge, InsertReady>(\n set<ND>()<ReadyForMerge, ReadyForMerge>({\n deletedAt: [\n 'deletedAt',\n to<ReadyForMerge, null, unknown, Get<ReadyForMerge, 'deletedAt'>>(nil),\n ],\n }),\n )\n return stages\n .with<unknown, InsertReady>(insertMarker)\n .with<unknown, 'out'>(\n $merge_<InsertReady, Out, New, In>({\n into: out.into,\n whenNotMatched: 'insert',\n on: root<Out | InsertReady>().of(gid),\n vars: {\n new: [\n 'new',\n root<InsertReady>().expr() as Expr<ReadyForMerge, InsertReady>,\n ],\n },\n stages: 'ctx',\n whenMatched: whenMatchedStages,\n }),\n ).stages\n }\n\n if (out.whenNotMatched === 'discard') {\n const discardMarker = $set_<O, ReadyForMerge, DiscardReady>(\n set<IsDeleted>()<ReadyForMerge, ReadyForMerge>({\n deletedAt: [\n 'deletedAt',\n to<ReadyForMerge, IsDeleted['deletedAt'], unknown, Get<ReadyForMerge, 'deletedAt'>>(\n current,\n ),\n ],\n }),\n )\n return stages\n .with<unknown, DiscardReady>(discardMarker)\n .with<unknown, 'out'>(\n $merge_<DiscardReady, Out, New, In>({\n into: out.into,\n whenNotMatched: 'insert',\n on: root<Out | DiscardReady>().of(gid),\n vars: {\n new: [\n 'new',\n root<DiscardReady>().expr() as Expr<ReadyForMerge, DiscardReady>,\n ],\n },\n stages: 'ctx',\n whenMatched: whenMatchedStages,\n }),\n ).stages\n }\n\n return stages.with<unknown, 'out'>(\n $merge_<ReadyForMerge, Out, New, In>({\n into: out.into,\n whenNotMatched: 'fail',\n on: root<Out | ReadyForMerge>().of(gid),\n vars: { new: ['new', root<ReadyForMerge>().expr()] },\n stages: 'ctx',\n whenMatched: whenMatchedStages,\n }),\n ).stages\n}\n","import type { ConstHKT, Exclude, Omit } from '../../../types'\nimport type { AsLiteral, ID, O, RORec, Rec, doc, notArr } from '../../../types/json'\nimport { mergeExpr, type ExprHKT, type ExprsExact } from '../../expression/concat'\nimport { root } from '../../field'\nimport type { Delta, DeltaAccumulatorHKT, DeltaAccumulators, Expr, StreamRunnerParam, TS } from '../../types'\nimport { map1 } from '../../utils/json'\nimport { mapExactToObject } from '../../utils/map-object'\nimport { link } from '../prefix'\nimport { subGroup } from './utils/sub-group'\nimport {\n subMerge,\n type Extra,\n type IdAndTsKeys,\n type Loose,\n type SubMergeOut,\n type V_Grp,\n} from './utils/sub-merge'\n\ntype Denied<GID = never> = keyof (TS & ID) | GID\ntype WithGRP<V, Grp, GID extends string> = Rec<GID, Grp> & V\nconst addGrp =\n <V extends O, Grp, GID extends string>(gid: AsLiteral<GID>) =>\n <D extends Rec<'_id', Grp>>(\n expr: ExprsExact<O & Omit<V, Denied<GID>>, D>,\n ): ExprsExact<Rec<GID, Grp> & Omit<V, Denied<GID>>, D> => {\n return mergeExpr<Omit<V, Denied<GID>>, RORec<GID, Grp>, D, unknown, keyof O, O[keyof O]>(\n expr,\n map1(gid, root<D>().of('_id').expr()),\n )\n }\ntype GI<GG> = Exclude<GG, keyof TS>\n\nexport type GroupMergeOut<\n Grp extends notArr,\n V extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, V, GG> = Loose<Grp, V, GG>,\n> = SubMergeOut<Grp, V, GG, EE, Out>\n\nexport type GroupMergeCollection<\n WhenNotMatched extends GroupMergeOut<never, never, never>['whenNotMatched'],\n Grp extends notArr,\n V extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, V, GG> = Loose<Grp, V, GG>,\n> = (GroupMergeOut<Grp, V, GG, EE, Out> & { whenNotMatched: WhenNotMatched })['into']\n\nexport const $groupMerge = <\n T extends O,\n Grp extends notArr,\n V extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, V, GG> = Loose<Grp, V, GG>,\n>(\n id: Expr<Grp, T>,\n args: DeltaAccumulators<T, O & Omit<V, Denied<GI<GG>>>>,\n out: GroupMergeOut<Grp, V, GG, EE, Out>,\n gid: AsLiteral<GI<GG>>,\n extra: ExprsExact<Extra<EE, V, GG>, V_Grp<V, GG, Grp>>,\n idPrefix = '',\n): StreamRunnerParam<Delta<T>, 'out'> => ({\n raw: (first: boolean) =>\n link<Delta<T>>()\n .with<unknown, WithGRP<Omit<V, Denied<GI<GG>>>, Grp, GI<GG>>>(\n subGroup<T, Grp, O & Omit<V, Denied<GI<GG>>>, GI<GG>>(\n id,\n args,\n addGrp<V, Grp, GI<GG>>(gid),\n ),\n )\n .with<unknown, 'out'>(\n subMerge<T, Grp, V, GG, EE, Out>(args, out, gid, extra, idPrefix, first),\n ).stages,\n teardown: c =>\n c({\n collection: out.into,\n method: 'updateMany',\n params: [\n {},\n [\n {\n $unset: Object.keys({\n ...mapExactToObject<Extra<EE, V, GG>, ExprHKT<V_Grp<V, GG, Grp>>, ConstHKT<1>>(extra, () => 1),\n ...mapExactToObject<O & Omit<V, Denied<GI<GG>>>, DeltaAccumulatorHKT<T>, ConstHKT<1>>(args, () => 1),\n }),\n },\n ...(out.whenNotMatched === 'insert'\n ? [\n {\n $set: { deletedAt: '$$NOW', touchedAt: '$$CLUSTER_TIME' },\n },\n ]\n : []),\n ],\n ],\n }),\n})\n\nexport type GroupIdCollection<\n V extends O,\n EE = {},\n Out extends Loose<string, V, '_id'> = Loose<string, V, '_id'>,\n> = GroupMergeCollection<'fail', string, V, '_id', EE, Out>\nexport const $groupId = <\n T extends O,\n V extends O,\n EE = {},\n Out extends Loose<string, V, '_id'> = Loose<string, V, '_id'>,\n>(\n id: Expr<string, T>,\n args: DeltaAccumulators<T, O & Omit<V, Denied>>,\n out: GroupIdCollection<V, EE, Out>,\n extra: ExprsExact<Omit<EE, IdAndTsKeys | keyof Omit<V, IdAndTsKeys>>, doc & Omit<V, IdAndTsKeys>>,\n): StreamRunnerParam<Delta<T>, 'out'> =>\n $groupMerge<T, string, V, '_id', EE, Out>(\n id,\n args,\n { into: out, whenNotMatched: 'fail' },\n '_id',\n extra,\n )\n\nexport type GroupCollection<\n Grp extends notArr,\n V extends O,\n EE = {},\n Out extends Loose<Grp, V, '_grp'> = Loose<Grp, V, '_grp'>,\n> = GroupMergeCollection<'insert', Grp, V, '_grp', EE, Out>\nexport const $group = <\n T extends O,\n Grp extends notArr,\n V extends O,\n EE = {},\n Out extends Loose<Grp, V, '_grp'> = Loose<Grp, V, '_grp'>,\n>(\n id: Expr<Grp, T>,\n args: DeltaAccumulators<T, O & Omit<V, Denied<'_grp'>>>,\n out: GroupCollection<Grp, V, EE, Out>,\n extra: ExprsExact<\n Omit<EE, IdAndTsKeys | '_grp' | Exclude<keyof V, IdAndTsKeys | '_grp'>>,\n Rec<'_grp', Grp> & Omit<V, IdAndTsKeys | '_grp'>\n >,\n idPrefix = '',\n): StreamRunnerParam<Delta<T>, 'out'> =>\n $groupMerge<T, Grp, V, '_grp', EE, Out>(\n id,\n args,\n { into: out, whenNotMatched: 'insert' },\n '_grp',\n extra,\n idPrefix,\n )\n","import type { ConstHKT, HKT, I, IdHKT, N, O, Omit, RORec, Rec, jsonItem } from '../../../types'\nimport { $ifNull, eqTyped, ite } from '../../expression/logic'\nimport { nil } from '../../expression/val'\nimport { root } from '../../field'\nimport type { BA, Delta, Expr, FRawStages, RawStages } from '../../types'\nimport { set, to, type Updater, type UpdaterHKT } from '../../update/updater'\nimport { mapExact1, type MapOPart } from '../../utils/map-object'\nimport { $set1 } from '../mongo-stages'\n\nexport interface ParDeltaHKT<K extends BA, T extends jsonItem, E> extends HKT<jsonItem> {\n readonly out: RORec<K, I<jsonItem, this>> & Delta<T> & E\n}\n\nconst deltaExpr =\n <T extends jsonItem, V extends jsonItem, E>(\n expr: <K extends BA>(field: K) => Expr<V | null, Rec<K, T> & Delta<T> & E>,\n ) =>\n <K extends BA>(field: K): Expr<V | null, Delta<T> & E> => {\n type F = ParDeltaHKT<K, T, E>\n return ite<V | null, null, T, F>(\n eqTyped<null, T, F, unknown>($ifNull(root<Delta<T>>().of(field).expr(), nil), nil),\n nil,\n expr(field),\n )\n }\n\ntype Delta2<T extends jsonItem, BA2 extends string> = Delta<T> & RORec<BA2, T | null>\nexport const $setEach1 = <\n T extends jsonItem,\n V extends jsonItem,\n BA2 extends string,\n E = unknown,\n C = unknown,\n>(\n updater: (k: BA) => Updater<Delta<T> & RORec<BA2, T | null> & E, T | N, V | null, C>,\n dict: MapOPart<RORec<BA2>, ConstHKT<BA>>,\n): FRawStages<unknown, Delta2<T, BA2> & E, Rec<BA2, V | null> & Omit<Delta<T> & E, BA2>, C, 1> => {\n type DV = RORec<BA2, V | null>\n type R = Delta<T> & RORec<BA2, T | null> & E\n return $set1<unknown, R, Rec<BA2, V | null> & Omit<R, BA2>, C>(\n set<DV>()(mapExact1<BA2, ConstHKT<BA>, UpdaterHKT<R, R, DV, C, BA2>>(dict, updater)),\n )\n}\n\nexport const $setEach = <\n T extends O,\n V extends jsonItem,\n BA2 extends string,\n E = unknown,\n C = unknown,\n>(\n updater: (k: BA) => Updater<Delta<T> & E, T | N, V | null, C>,\n dict: MapOPart<RORec<BA2>, ConstHKT<BA>>,\n): RawStages<unknown, Delta<T> & E, Delta<T> & Rec<BA2, V | null> & Omit<E, BA2>, C, 1> =>\n $setEach1<T, V, BA2, E, C>(updater, dict)<IdHKT<O>>(root) as RawStages<\n unknown,\n Delta<T> & E,\n Delta<T> & Rec<BA2, V | null> & Omit<E, BA2>,\n C,\n 1\n >\n\nexport const $replaceWithEach1 = <T extends O, V extends jsonItem, E = unknown>(\n t: <K extends BA>(field: K) => Expr<V | null, Delta<T> & E>,\n) => {\n return $setEach<T, V, BA, E>(k => to(t(k)), {\n after: ['after', 'after'],\n before: ['before', 'before'],\n }) as RawStages<unknown, Delta<T> & E, Delta<V> & Omit<E, BA>>\n}\n\nexport const $replaceWithEach = <T extends O, V extends jsonItem, E = unknown>(\n expr: <K extends BA>(field: K) => Expr<V | null, Rec<K, T> & Delta<T> & E>,\n): RawStages<unknown, Delta<T> & E, Delta<V> & Omit<E, BA>> =>\n $replaceWithEach1<T, V, E>(deltaExpr<T, V, E>(expr))\n","import type { App, O, Rec, jsonItem } from '../../../types'\nimport { sub } from '../../expression/logic'\nimport { nil } from '../../expression/val'\nimport { root } from '../../field'\nimport type { BA, Delta, Expr, PreDelta, RawStages } from '../../types'\nimport { subUpdater, to, weaken, type Updater } from '../../update/updater'\nimport { link } from '../prefix'\nimport { $replaceWithEach, $setEach, type ParDeltaHKT } from './$replace-with-each'\n\nexport const $replaceWithDelta = <T extends O, V extends jsonItem>(\n expr: Expr<V, T>,\n): RawStages<unknown, Delta<T>, Delta<V>> =>\n $replaceWithEach<T, V>(<K extends BA>(field: K) =>\n sub(expr, root<App<ParDeltaHKT<K, T, unknown>, T>>().of(field)),\n )\n\nexport const $setDelta = <T extends O, V extends O, C = unknown>(updater: Updater<T, T, V, C>) => {\n const dict = {\n after1: ['after1', 'after'],\n before1: ['before1', 'before'],\n } as const\n type BA1<X = V> = Rec<`${BA}1`, X | null>\n type DD = BA1 & Delta<T>\n const side = (k: BA) => root<Delta<T>>().of<PreDelta<T | null>, BA>(k)\n const update = (k: BA) => subUpdater(weaken(updater), side(k))\n return link<Delta<T>, C>()\n .with<unknown, BA1<T> & Delta<T>>(\n $setEach<T, T, `${BA}1`, unknown, C>(k => to(side(k).expr()), dict),\n )\n .with<unknown, BA1 & Delta<T>>($setEach<T, V, `${BA}1`, unknown, C>(update, dict))\n .with<unknown, Delta<V> & BA1>(\n $replaceWithEach<T, V, BA1>(field => root<DD>().of<BA1, `${BA}1`>(`${field}1`).expr()),\n )\n .with<unknown, Delta<V>>($setEach<V, V, `${BA}1`, unknown, C>(k => to(nil), dict)).stages\n}\n","import type { App, AsLiteral, HKT, IdHKT, N } from '../../types'\n\nexport type Equal<Dom, T extends Dom, V extends Dom> = {\n forward: <F extends HKT<Dom>>(x: App<F, T>) => App<F, V>\n forward1: (x: T) => V\n backward: <F extends HKT<Dom>>(x: App<F, V>) => App<F, T>\n backward1: (x: V) => T\n}\nexport const sym = <Dom, T extends Dom, V extends Dom>(eq: Equal<Dom, T, V>): Equal<Dom, V, T> => ({\n backward: eq.forward,\n forward: eq.backward,\n backward1: eq.forward1,\n forward1: eq.backward1,\n})\nexport const reflex = <Dom, T extends Dom>(): Equal<Dom, T, T> => ({\n backward: id,\n forward: id,\n backward1: id,\n forward1: id,\n})\nconst id = <T>(x: T) => x\nconst assertEqual = <Dom, T extends Dom, V extends Dom>() => reflex() as Equal<Dom, T, V>\n\nexport const fromEq = <Dom, T extends Dom, V extends Dom>(\n eq: Pick<Equal<Dom, T, V>, 'forward' | 'backward'>,\n): Equal<Dom, T, V> => ({\n ...eq,\n backward1: eq.backward<IdHKT<Dom>>,\n forward1: eq.forward<IdHKT<Dom>>,\n})\nexport const literalsEqaul = <T extends keyof any | boolean | N, V extends T>(\n _: AsLiteral<T> & V,\n) => assertEqual<T, T, V>()\n","import type { App, HKT, rawItem } from '../../types'\nimport type { Predicate } from '../types'\n\ntype Operators = '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$in' | '$nin' | '$type' | '$exists'\nexport const operator =\n <\n K extends Operators,\n F extends HKT<Dom2, HKT<Dom1, unknown>>,\n Dom1,\n Dom2 = Dom1,\n G extends HKT<Dom2, HKT<Dom1, unknown>> = F,\n >() =>\n <D2 extends Dom2 = Dom2>(op: K) =>\n <T extends Dom1>(operand: rawItem & App<App<F, D2>, T>): Predicate<App<App<G, D2>, T>> => {\n return {\n raw: { [op]: operand },\n }\n }\n","import type { Arr, ArrHKT, ConstHKT, HKT, I, IdHKT, N, rawItem, RawObj, RConstHKT, Timestamp } from '../../types'\nimport { operator } from './utils'\n\nconst dualEq = operator<'$eq' | '$ne', ConstHKT<IdHKT<unknown>>, unknown>()\n\nexport const $eq = dualEq('$eq')\nexport const $ne = dualEq('$ne')\n\ntype Numeric = number | Timestamp | Date\nexport const comp = operator<'$gt' | '$lt' | '$gte' | '$lte', RConstHKT<Numeric>, Numeric, Numeric>()\n\nexport const $gt = comp<Numeric>('$gt')\nexport const $gtTs = comp<Timestamp>('$gt')\nexport const $gteTs = comp<Timestamp>('$gte')\nexport const $lt = comp<number>('$lt')\nexport const dateLt = comp<Date>('$lt')\nexport const $gte = comp<number>('$gte')\nexport const $lte = comp<number>('$lte')\n\ninterface DictHKT<T> extends HKT<keyof T, unknown> {\n readonly out: T[I<keyof T, this>] | N\n}\n\ndeclare const unknown: unique symbol\ntype MongoTypes = {\n number: number,\n array: Arr<rawItem>,\n string: string,\n object: RawObj,\n [i: number]: unknown\n}\n\nexport type MongoTypeNames = keyof MongoTypes\n\nexport const $type = operator<'$type', ConstHKT<ArrHKT<keyof MongoTypes>>, keyof MongoTypes, unknown, ConstHKT<DictHKT<MongoTypes>> >()('$type')\nexport const $exists = operator<'$exists', ConstHKT<ConstHKT<boolean>>, keyof MongoTypes, unknown, ConstHKT<ConstHKT<unknown>> >()('$exists')\n\n","import type { O, RawObj } from '../../types'\nimport type { Expr, Query } from '../types'\nimport { safeNarrow } from '../utils/json'\n\nexport const $expr = <D extends O, C>(expr: Expr<boolean, D, C>): Query<D, C> => ({\n raw: f => safeNarrow<RawObj>()({ $expr: expr.raw(f).get() }),\n})\n","import type { ArrHKT, ConstHKT, IdHKT } from '../../types'\nimport { operator } from './utils'\n\nconst dualIn = operator<\n '$in' | '$nin',\n ConstHKT<ArrHKT>,\n unknown,\n unknown,\n ConstHKT<IdHKT>\n>()\n\nexport const $in = dualIn('$in')\nexport const $nin = dualIn('$nin')\n","import type { doc } from '../../../types'\nimport { ite, ne } from '../../expression/logic'\nimport { nil } from '../../expression/val'\nimport { root } from '../../field'\nimport { $expr } from '../../predicate'\nimport type { BA, Delta, Expr, RawStages } from '../../types'\nimport { $match_ } from '../mongo-stages'\nimport { concatStages } from '../prefix'\nimport { $replaceWithDelta } from '../set/$set-delta'\n\nexport const $matchDelta = <T extends doc>(query: Expr<boolean, T>) =>\n concatStages<unknown, Delta<T>, Delta<T | null>, Delta<T>, unknown>(\n $replaceWithDelta(ite(query, root<T>().expr(), nil)),\n matchDelta(),\n )\nexport const matchDelta = <D>() => {\n const part = (side: BA) => root<Delta<D | null>>().of(side).expr()\n return $match_<Delta<D | null>>(\n $expr<Delta<D | null>, unknown>(\n ne<D | null, Delta<D | null>, unknown>(part('before'))(part('after')),\n ),\n ) as RawStages<unknown, Delta<D | null>, Delta<D>>\n}\n","import { $matchDelta } from './$match-delta'\nimport type { doc } from '../../../types'\nimport { $expr } from '../../predicate/$expr'\nimport type { DeltaStages, Expr } from '../../types'\nimport { $match1 } from '../raws'\n\nexport const $match = <T extends doc>(query: Expr<boolean, T>): DeltaStages<T, T, T> => ({\n raw: $match1($expr(query)),\n delta: $matchDelta<T>(query),\n})\n","import type { App, Arr, AsLiteral, doc, Exclude, HKT, I, ID, N, O, Rec, RORec } from '../../../types'\nimport { $let, $map0, concat, field, mergeExpr, nil, val } from '../../expression'\nimport { array, concatArray, filter, first, inArray, mergeObjects } from '../../expression/array'\nimport { $ifNull, eq, eqTyped, ite, not } from '../../expression/logic'\nimport { ctx, Field, root } from '../../field'\nimport type {\n BA,\n Deleted,\n DeletedFlags,\n Delta,\n Expr,\n NTrue,\n PreDelta,\n RawStages,\n} from '../../types'\nimport { literalsEqaul, type Equal } from '../../utils/guard'\nimport { map1 } from '../../utils/json'\nimport { matchDelta } from '../match'\nimport { $replaceWith_, $unwind_ } from '../mongo-stages'\nimport { link } from '../prefix'\n\ntype s = string\n\n/** Identity of an unwound join row: one side’s `_id`, or a concat of both. */\nexport type JoinId<K1 extends s, K2 extends s> =\n | K1\n | K2\n | readonly [K1, middle: s, K2]\n | readonly [K2, middle: s, K1]\n\n/** `_id` of a join row for `k`: `k1` / `k2` alone, or `concat` in tuple order. */\nexport const joinIdOf = <K1 extends s, K2 extends s, D, C = unknown>(\n k: JoinId<K1, K2>,\n k1: K1,\n k1Id: Expr<s, D, C>,\n k2Id: Expr<s, D, C>,\n): Expr<s, D, C> => {\n if (k === k1) return k1Id\n if (typeof k === 'string') return k2Id\n const idOf = (key: K1 | K2): Expr<s, D, C> => (key === k1 ? k1Id : k2Id)\n return concat(idOf(k[0]), val<s>(k[1]), idOf(k[2]))\n}\n/** One unwound slot. `_id` is chosen once, when the slot is built. `{}` means that side is deleted. */\ntype Slot<X> = PreDelta<X> & ID\n/** An item, or an empty-side `{}`, already stamped with its slot id. */\ntype Key<X> = { readonly _id: s; readonly value: X }\ntype Keyed<X> = O<Key<X>>\ntype ManyIn<K1 extends s, T extends doc, K2 extends s, U extends doc, N1 extends null> = Delta<\n Rec<K1, T | N1> & Rec<K2, Arr<U>>\n>\n/**\n * If `probe` is null, the root is `App<F, null>` and the result is null.\n * Otherwise the root is `App<F, T>` and `keep` (typed at that root) is the result.\n */\nconst andAlso = <T, V, F extends HKT<null | T>, C = unknown>(\n probe: Expr<null | T, App<F, null | T>, C>,\n keep: Expr<V, App<F, T>, C>,\n): Expr<V | null, App<F, null | T>, C> =>\n ite<V | null, null, T, F, C>(eqTyped<null, T, F, C, null | T>(probe, nil), nil, keep)\n\ntype DDelta<T> = PreDelta<T> & {\n readonly deleted: DeletedFlags | N\n}\n/**\n * `$replaceWith`. Pair `k2` into slots and copy `k1` out as its own delta.\n * A missing `k2` array counts as `[]`.\n * `Pad` is `{}` when the right side is outer (`N2` is `null`), otherwise `never`.\n * Only the outer instantiation inserts the `{}` sentinel.\n *\n * Call shape used below: `slotsMany('left', 'right', ['left', '.', 'right'])`.\n * `L` is `{ _id: 'L' }`. `p1` is `{ _id: 'p1', n: 1 }`. `p1b` is `{ _id: 'p1', n: 2 }`.\n * Each item is stamped with its slot `_id` first. Before and after then match on that id.\n * `k === k1` stamps the document id, so `p1` → `p2` is one slot. `k === k2` stamps the item id.\n * A tuple uses `concat` in that order. The `k1` component is the document `_id`, the `k2` component is the item `_id`.\n * An empty outer side is one entry with the document id, so it meets an item only when that item's slot id is the same.\n * `k === k2` is not padded: an empty side has no item id.\n * A `{}` value is the deleted side. The join writes `deleted` from that, not the slot.\n *\n * Both sides empty. `before: null` is the same split as `right: []`. The left id is `L`.\n * ```\n * { _id: 'inv', before: null, after: { left: L, right: [] } }\n * → { _id: 'inv', before: null, after: { left: L, right: [] },\n * left: { before: null, after: L },\n * right: [{ _id: 'L', before: {}, after: {} }] }\n * ```\n *\n * `[]` → `[p1]`. The empty side is a disappearing sentinel, not paired with `p1`.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [] },\n * after: { left: L, right: [p1] } }\n * → right: [{ _id: 'L', before: {}, after: null },\n * { _id: 'L.p1', before: null, after: p1 }]\n * ```\n *\n * `[p1]` → `[]`. The old item is closed, then a separate appearing sentinel.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [p1] },\n * after: { left: L, right: [] } }\n * → right: [{ _id: 'L.p1', before: p1, after: null },\n * { _id: 'L', before: null, after: {} }]\n * ```\n *\n * Same `_id`, changed body. One slot, no sentinel.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [p1] },\n * after: { left: L, right: [p1b] } }\n * → right: [{ _id: 'L.p1', before: p1, after: p1b }]\n * ```\n *\n * Left id `L` → `M` on that same payment. The slot keeps `before`'s left id.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [p1] },\n * after: { left: { _id: 'M' }, right: [p1] } }\n * → right: [{ _id: 'L.p1', before: p1, after: p1 }]\n * ```\n *\n * `[p1]` → `[p2]`. Delete plus insert, still no sentinel.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [p1] },\n * after: { left: L, right: [{ _id: 'p2', n: 1 }] } }\n * → right: [{ _id: 'L.p1', before: p1, after: null },\n * { _id: 'L.p2', before: null, after: { _id: 'p2', n: 1 } }]\n * ```\n *\n * `left` is copied beside the slots. On the fresh document above it is\n * `{ before: null, after: L }`. On the others it is `{ before: L, after: L }`,\n * except the `L` → `M` case, where `after` is `{ _id: 'M' }`.\n *\n * `k === 'left'`. One slot, id `L`. `p1` → `p2` does not split.\n * ```\n * { before: { left: L, right: [p1] }, after: { left: L, right: [{ _id: 'p2', n: 1 }] } }\n * → right: [{ _id: 'L', before: p1, after: { _id: 'p2', n: 1 } }]\n * ```\n * Outer, `[]` → `[p1]`. The empty side is `{}` on that same slot. The join marks `deleted.before`.\n * ```\n * → right: [{ _id: 'L', before: {}, after: p1 }]\n * ```\n *\n * `k === 'right'`. Id is the payment id. `p1` → `p2` is a delete plus an insert. No sentinel.\n * ```\n * → right: [{ _id: 'p1', before: p1, after: null },\n * { _id: 'p2', before: null, after: { _id: 'p2', n: 1 } }]\n * ```\n */\nconst slotsMany = <\n K1 extends s,\n T extends doc,\n KK2 extends s,\n U extends doc,\n N1 extends null = never,\n Pad extends O | never = never,\n>(\n k1: AsLiteral<K1>,\n k2: AsLiteral<Exclude<KK2, K1 | BA>>,\n k: JoinId<K1, Exclude<KK2, K1 | BA>>,\n /** Empty side. Outer is one `{ _id: document id, value: {} }`. Inner is `[]`. */\n emptyOf: (\n id: Expr<s, ManyIn<K1, T, Exclude<KK2, K1 | BA>, U, N1>>,\n ) => Expr<Arr<Keyed<U | Pad>>, ManyIn<K1, T, Exclude<KK2, K1 | BA>, U, N1>>,\n): RawStages<\n unknown,\n Delta<Rec<K1, T | N1> & Rec<Exclude<KK2, K1 | BA>, Arr<U>>>,\n Rec<K1, DDelta<T | null>> & Rec<Exclude<KK2, K1 | BA>, Arr<Slot<U | Pad | null>>>\n> => {\n type K2 = Exclude<KK2, K1 | BA>\n type Pair<A, B> = Rec<K1, A> & Rec<K2, B>\n type In = ManyIn<K1, T, K2, U, N1>\n type K1Delta = DDelta<T | null>\n type K2Delta = Slot<U | Pad | null>\n type Deltas = Pair<K1Delta, Arr<K2Delta>>\n\n const emptyArr: Expr<Arr<U>, In> = array<U, In>()\n const src: Field<In, In> = root<In>()\n const k2Arr = (side: BA): Expr<Arr<U> | null, In> =>\n src.of<In, BA>(side).of<Pair<T | N1, Arr<U>>, K2, null>(k2).expr()\n const k2OrEmpty = (side: BA): Expr<Arr<U>, In> =>\n $ifNull<Arr<U>, In, unknown>(k2Arr(side), emptyArr)\n const k1Id: Expr<s, In> = root<In>().of<In, '_id'>('_id').expr()\n const k1Delta: Expr<K1Delta, In> = field<K1Delta, In>({\n before: [\n 'before',\n $ifNull<T | null, In, unknown>(\n src.of<In, 'before'>('before').of<Pair<T | N1, Arr<U>>, K1, null>(k1).expr(),\n nil,\n ),\n ],\n after: [\n 'after',\n $ifNull<T | null, In, unknown>(\n src.of<In, 'after'>('after').of<Pair<T | N1, Arr<U>>, K1, null>(k1).expr(),\n nil,\n ),\n ],\n deleted: ['deleted', src.of('deleted').expr()],\n })\n const itemId = <C>(k2Id: Expr<s, In, C>): Expr<s, In, C> => {\n const at = (key: K1 | K2) => (key === k1 ? k1Id : k2Id)\n if (typeof k === 'string') return at(k)\n return concat<In, C>(at(k[0]), val<s>(k[1]), at(k[2]))\n }\n const keyed = (side: BA): Expr<Arr<Keyed<U | Pad>>, In> => {\n type Items = RORec<'items', Arr<U>>\n const items = ctx<Arr<U>>()('items').expr()\n return $let<Arr<Keyed<U | Pad>>, In, unknown, Items>(\n { items: ['items', k2OrEmpty(side)] },\n ite<Arr<Keyed<U | Pad>>, In, Items>(\n eq<Arr<U>, In, Items>(items)(emptyArr),\n emptyOf(k1Id),\n $map0<'b', U, Keyed<U | Pad>, In, Items>({\n input: items,\n as: 'b',\n expr: field<Key<U | Pad>, In, RORec<'b', U> & Items>({\n _id: ['_id', itemId<RORec<'b', U> & Items>(ctx<U>()('b').of<U, '_id'>('_id').expr())],\n value: ['value', ctx<U>()('b').expr()],\n }),\n }),\n ),\n )\n }\n const beforeKeyed = keyed('before')\n const afterKeyed = keyed('after')\n type KeyedArr = Arr<Keyed<U | Pad>>\n type Vars = RORec<'beforeK' | 'afterK', KeyedArr>\n const bound = <N extends 'beforeK' | 'afterK'>(name: N) => ctx<KeyedArr>()(name).expr()\n const idOf = <N extends 'a' | 'b'>(name: N) =>\n ctx<Keyed<U | Pad>>()(name).of<Key<U | Pad>, '_id', 1>('_id').expr()\n const valueOf = <N extends 'a' | 'b'>(name: N) =>\n ctx<Keyed<U | Pad>>()(name).of<Key<U | Pad>, 'value', 1>('value').expr()\n const kept = $map0<'b', Keyed<U | Pad>, Slot<U | Pad | null>, unknown, Vars>({\n input: bound('beforeK'),\n as: 'b',\n expr: field<Slot<U | Pad | null>, unknown, RORec<'b', Keyed<U | Pad>> & Vars>({\n _id: ['_id', idOf('b')],\n before: ['before', valueOf('b')],\n after: [\n 'after',\n first<U | Pad, unknown, RORec<'b', Keyed<U | Pad>> & Vars>(\n $map0<'a', Keyed<U | Pad>, U | Pad, unknown, RORec<'b', Keyed<U | Pad>> & Vars>({\n input: filter<Keyed<U | Pad>, unknown, 'a', RORec<'b', Keyed<U | Pad>> & Vars>({\n expr: bound('afterK'),\n as: 'a',\n limit: val(1),\n cond: eq<s, unknown, RORec<'a' | 'b', Keyed<U | Pad>> & Vars>(idOf('a'))(idOf('b')),\n }),\n as: 'a',\n expr: valueOf('a'),\n }),\n ),\n ],\n }),\n })\n const beforeIds = $map0<'id', Keyed<U | Pad>, s, unknown, Vars>({\n input: bound('beforeK'),\n as: 'id',\n expr: ctx<Keyed<U | Pad>>()('id').of<Key<U | Pad>, '_id', 1>('_id').expr(),\n })\n const added = $map0<'a', Keyed<U | Pad>, Slot<U | Pad | null>, unknown, Vars>({\n input: filter<Keyed<U | Pad>, unknown, 'a', Vars>({\n expr: bound('afterK'),\n as: 'a',\n cond: not<unknown, RORec<'a', Keyed<U | Pad>> & Vars>(\n inArray<s, unknown, RORec<'a', Keyed<U | Pad>> & Vars>(idOf('a'), beforeIds),\n ),\n }),\n as: 'a',\n expr: field<Slot<U | Pad | null>, unknown, RORec<'a', Keyed<U | Pad>> & Vars>({\n _id: ['_id', idOf('a')],\n before: ['before', nil],\n after: ['after', valueOf('a')],\n }),\n })\n const slots = $let<Arr<Slot<U | Pad | null>>, In, unknown, Vars>(\n {\n beforeK: ['beforeK', beforeKeyed],\n afterK: ['afterK', afterKeyed],\n },\n concatArray<Slot<U | Pad | null>, In, Vars>(kept, added),\n )\n return $replaceWith_<In, Deltas>(\n field<RORec<K1, K1Delta> & RORec<K2, Arr<K2Delta>>, In>(\n mergeExpr<RORec<K2, Arr<K2Delta>>, RORec<K1, K1Delta>, In>(\n map1(k2, slots),\n map1(k1, k1Delta),\n ),\n ),\n )\n}\n\n/** Inner right: an empty side stays empty. */\nconst noEmpty = <K1 extends s, T extends doc, K2 extends s, U extends doc, N1 extends null>(\n _id: Expr<s, ManyIn<K1, T, K2, U, N1>>,\n): Expr<Arr<Keyed<U>>, ManyIn<K1, T, K2, U, N1>> => array<Keyed<U>, ManyIn<K1, T, K2, U, N1>>()\n\n/** Outer right: an empty side is one `{}` entry, id the document id. */\nconst padEmpty = <K1 extends s, T extends doc, K2 extends s, U extends doc, N1 extends null>(\n id: Expr<s, ManyIn<K1, T, K2, U, N1>>,\n): Expr<Arr<Keyed<U | O>>, ManyIn<K1, T, K2, U, N1>> =>\n array<Keyed<U | O>, ManyIn<K1, T, K2, U, N1>>(\n field<Key<O>, ManyIn<K1, T, K2, U, N1>>({\n _id: ['_id', id],\n value: ['value', field<{}, ManyIn<K1, T, K2, U, N1>>({})],\n }),\n )\n\n/**\n * `$replaceWith`. Rebuild each side of the slot as a join row, or null.\n * The row `_id` is the slot `_id` from `slotsMany`, on both sides.\n * A side whose value is `{}` is marked `deleted`.\n *\n * A null `k2` omits that side. `{}` is stored as a null `k2`.\n * A null `k1` omits the side when the left is inner. When the left is outer, the row stays and `k1` is null.\n *\n * Call shape: `joinMany('left', 'right')`.\n *\n * Fresh empty, inner left. `before` is omitted because `left` is null. The slot id is `L`.\n * Outer left keeps that side: `{ _id: 'L', left: null, right: null }`.\n * ```\n * { _id: 'inv', left: { before: null, after: L },\n * right: { _id: 'L', before: {}, after: {} } }\n * → { _id: 'inv',\n * before: null,\n * after: { _id: 'L', left: L, right: null },\n * deleted: { before: true, after: true } }\n * ```\n *\n * `[]` → `[p1]`, sentinel slot. `after` is null, not the new payment.\n * ```\n * { _id: 'inv', left: { before: L, after: L },\n * right: { _id: 'L', before: {}, after: null } }\n * → { _id: 'inv',\n * before: { _id: 'L', left: L, right: null },\n * after: null,\n * deleted: { before: true, after: false } }\n * ```\n *\n * `[]` → `[p1]`, new payment.\n * ```\n * { _id: 'inv', left: { before: L, after: L }, right: { _id: 'L.p1', before: null, after: p1 } }\n * → { _id: 'inv',\n * before: null,\n * after: { _id: 'L.p1', left: L, right: p1 } }\n * ```\n *\n * `[p1]` → `[]`, closed payment.\n * ```\n * { _id: 'inv', left: { before: L, after: L }, right: { _id: 'L.p1', before: p1, after: null } }\n * → { _id: 'inv',\n * before: { _id: 'L.p1', left: L, right: p1 },\n * after: null }\n * ```\n *\n * `[p1]` → `[]`, appearing sentinel.\n * ```\n * { _id: 'inv', left: { before: L, after: L },\n * right: { _id: 'L', before: null, after: {} } }\n * → { _id: 'inv',\n * before: null,\n * after: { _id: 'L', left: L, right: null },\n * deleted: { before: false, after: true } }\n * ```\n *\n * `p1` → `p1b`. Both rows copy `L.p1`.\n * ```\n * { _id: 'inv', left: { before: L, after: L }, right: { _id: 'L.p1', before: p1, after: p1b } }\n * → { _id: 'inv',\n * before: { _id: 'L.p1', left: L, right: p1 },\n * after: { _id: 'L.p1', left: L, right: p1b } }\n * ```\n *\n * Left id `L` → `M`. The slot id was fixed as `L.p1`, so both rows use it.\n * ```\n * { _id: 'inv', left: { before: L, after: { _id: 'M' } },\n * right: { _id: 'L.p1', before: p1, after: p1 } }\n * → { _id: 'inv',\n * before: { _id: 'L.p1', left: L, right: p1 },\n * after: { _id: 'L.p1', left: { _id: 'M' }, right: p1 } }\n * ```\n */\nconst joinMany = <\n K1 extends s,\n T extends doc,\n K2 extends s,\n U extends doc,\n N1 extends null = never,\n N2 extends null = never,\n>(\n k1: AsLiteral<K1>,\n k2: AsLiteral<K2>,\n /** `literalsEqaul<null, N1>(includeNull1)` when the left side is outer. */\n eq1: false | Equal<null, null, N1>,\n /** `literalsEqaul<null, N2>(includeNull2)` when the right side is outer. */\n eq2: false | Equal<null, null, N2>,\n): RawStages<\n unknown,\n Rec<K1, DDelta<T | null>> & Rec<K2, Slot<U | O | null>>,\n Delta<(Rec<K1, T | N1> & Rec<K2, U | N2> & ID) | null>\n> => {\n type Pair<A, B> = Rec<K1, A> & Rec<K2, B>\n type Row<A, B> = Pair<A, B> & ID\n type Join = Row<T | N1, U | N2>\n type K1Delta = DDelta<T | null>\n type K2Delta = Slot<U | O | null>\n type Doc = Pair<K1Delta, K2Delta>\n interface UnwoundK1 extends HKT<T | null> {\n readonly out: Pair<DDelta<I<T | null, this>>, K2Delta>\n }\n type UnwoundK1K2<X extends U | O | null> = Pair<DDelta<T>, Slot<X>>\n interface UnwoundK1K2F extends HKT<U | O | null> {\n readonly out: UnwoundK1K2<I<U | O | null, this>>\n }\n /** `k1` stays `T | null`. Outer left reads it with `$ifNull`. */\n type UnwoundK2<X extends U | O | null> = Pair<K1Delta, Slot<X>>\n interface UnwoundK2F extends HKT<U | O | null> {\n readonly out: UnwoundK2<I<U | O | null, this>>\n }\n\n const doc: Field<Doc, Doc> = root<Doc>()\n const id = <D extends Rec<K2, doc>>(): Expr<s, D> => root<D>().of(k2).of('_id').expr()\n const k1At = (side: BA): Expr<T | null, Doc> => doc.of<Doc, K1>(k1).of<K1Delta, BA>(side).expr()\n const rowOf = <A, B, D extends Rec<K2, doc>>(a: Expr<A, D>, b: Expr<B, D>): Expr<Row<A, B>, D> =>\n mergeObjects<ID & Rec<K1, A>, Rec<K2, B>, D>(\n mergeObjects<ID, Rec<K1, A>, D>(\n field<RORec<'_id', s>, D>({ _id: ['_id', id<D>()] }),\n field<RORec<K1, A>, D>(map1(k1, a)),\n ),\n field<RORec<K2, B>, D>(map1(k2, b)),\n )\n const rowPad = <A, D extends Rec<K2, doc>>(\n k1v: Expr<A, D>,\n n2: Equal<null, null, N2>,\n ): Expr<Row<A, N2>, D> => {\n interface Right extends HKT<null> {\n readonly out: Expr<I<null, this>, D>\n }\n return rowOf<A, N2, D>(k1v, n2.forward<Right>(nil))\n }\n const rowReal = <A, D extends Rec<K2, doc>>(\n k1v: Expr<A, D>,\n k2v: Expr<U, D>,\n ): Expr<Row<A, U>, D> => rowOf<A, U, D>(k1v, k2v)\n /** Null `k2` omits the side. `{}` is stored as null when `eq2` is set, otherwise the side is omitted. */\n const k2join = <A, F extends HKT<U | O | null>>(\n raw: Expr<U | O | null, App<F, U | O | null>>,\n orNull: Expr<U | null, App<F, U | null>>,\n pad: Expr<Row<A, N2> | null, App<F, O>>,\n real: Expr<Row<A, U>, App<F, U>>,\n ): Expr<Row<A, U | N2> | null, App<F, U | O | null>> =>\n ite<Row<A, U | N2> | null, O, U | null, F>(\n eqTyped<O, U | null, F, unknown, U | O | null>(raw, field<O, App<F, U | O | null>>({})),\n pad,\n andAlso<U, Row<A, U>, F>(orNull, real),\n )\n const joinAt = (side: BA): Expr<Join | null, Doc> => {\n const k2t = <X extends U | O | null>() =>\n root<UnwoundK1K2<X>>().of<UnwoundK1K2<X>, K2>(k2).of<Slot<X>, BA>(side).expr()\n const k2w = <X extends U | O | null>() =>\n root<App<UnwoundK2F, X>>().of<App<UnwoundK2F, X>, K2>(k2).of<Slot<X>, BA>(side).expr()\n if (!eq1) {\n const k1t = <X extends U | O | null>() =>\n root<Pair<DDelta<T>, Slot<X>>>().of(k1).of<DDelta<T>, BA>(side).expr()\n return andAlso<T, Join | null, UnwoundK1>(\n k1At(side),\n k2join<T, UnwoundK1K2F>(\n k2t<U | O | null>(),\n k2t<U | null>(),\n eq2 ? rowPad(k1t<O>(), eq2) : nil,\n rowReal(k1t<U>(), k2t<U>()),\n ),\n )\n }\n const k1v = <X extends U | O | null>(): Expr<T | N1, App<UnwoundK2F, X>> => {\n type D = App<UnwoundK2F, X>\n interface Left extends HKT<null> {\n readonly out: Expr<I<null, this>, D>\n }\n return $ifNull<T | N1, D, unknown>(\n root<D>().of<D, K1>(k1).of<K1Delta, BA>(side).expr(),\n eq1.forward<Left>(nil),\n )\n }\n return k2join<T | N1, UnwoundK2F>(\n k2w<U | O | null>(),\n k2w<U | null>(),\n eq2 ? rowPad(k1v<O>(), eq2) : nil,\n rowReal(k1v<U>(), k2w<U>()),\n )\n }\n const isPad = (side: BA): Expr<NTrue, Doc> =>\n ite(\n eq<U | O | null, Doc>(doc.of<Doc, K2>(k2).of<K2Delta, BA>(side).expr())(field<{}, Doc>({})),\n val(true),\n doc.of(k1).of<K1Delta, 'deleted', 1>('deleted').of<DeletedFlags, BA, N, 3>(side).expr(),\n )\n const joinDelta: Expr<Delta<Join | null>, Doc> = field<Rec<BA, Join | null> & Deleted & ID, Doc>({\n _id: ['_id', id()],\n before: ['before', joinAt('before')],\n after: ['after', joinAt('after')],\n deleted: [\n 'deleted',\n field<RORec<BA, NTrue>, Doc>({\n before: ['before', isPad('before')],\n after: ['after', isPad('after')],\n }),\n ],\n })\n\n return $replaceWith_(joinDelta)\n}\n\n/**\n * Unwind a lookup delta.\n * `k` is `k1` (to one), `k2`, or a concat tuple in either order.\n * `N1` / `N2` are `null` for an outer side, `never` for an inner side.\n * Pass `includeNull1` as `null` to keep a row whose `k1` is null.\n * Pass `includeNull2` as `null` to pad an empty right array, except when `k === k2`:\n * that id is the item's, so an empty right emits no row. The pad's id is the document id,\n * and it joins an item only when that item's slot id is the same. The pad value `{}` is stored as null.\n * `slotsMany`, then `$unwind`, then `joinMany`, then `matchDelta`.\n */\nexport const $unwindDelta = <\n K1 extends s,\n T extends doc,\n KK2 extends s,\n U extends doc,\n N1 extends null = never,\n N2 extends null = never,\n>(\n k1: AsLiteral<K1>,\n k2: AsLiteral<Exclude<KK2, K1 | BA>>,\n k: JoinId<K1, Exclude<KK2, K1 | BA>>,\n includeNull1?: N1,\n includeNull2?: N2,\n): RawStages<\n unknown,\n Delta<Rec<K1, T | N1> & Rec<Exclude<KK2, K1 | BA>, Arr<U>>>,\n Delta<Rec<K1, T | N1> & Rec<Exclude<KK2, K1 | BA>, U | N2> & ID>\n> => {\n type K2 = Exclude<KK2, K1 | BA>\n type In = ManyIn<K1, T, K2, U, N1>\n type Join = Rec<K1, T | N1> & Rec<K2, U | N2> & ID\n const stages = <Pad extends O | never>(\n emptyOf: (id: Expr<s, In>) => Expr<Arr<Keyed<U | Pad>>, In>,\n eq1: false | Equal<null, null, N1>,\n eq2: false | Equal<null, null, N2>,\n ) => {\n type Slots = Rec<K1, DDelta<T | null>> & Rec<K2, Arr<Slot<U | Pad | null>>>\n type Unwound = Rec<K1, DDelta<T | null>> & Rec<K2, Slot<U | Pad | null>>\n return link<In>()\n .with<unknown, Slots>(slotsMany<K1, T, KK2, U, N1, Pad>(k1, k2, k, emptyOf))\n .with<unknown, Unwound>(\n $unwind_<Rec<K1, DDelta<T | null>>, K2, Slot<U | Pad | null>, never>(k2),\n )\n .with<unknown, Delta<Join | null>>(joinMany<K1, T, K2, U, N1, N2>(k1, k2, eq1, eq2))\n .with<unknown, Delta<Join>>(matchDelta<Join>()).stages\n }\n const run = <Pad extends O | never>(\n emptyOf: (id: Expr<s, In>) => Expr<Arr<Keyed<U | Pad>>, In>,\n ) =>\n stages<Pad>(\n emptyOf,\n includeNull1 === null && literalsEqaul<null, N1>(includeNull1),\n includeNull2 === null && literalsEqaul<null, N2>(includeNull2),\n )\n if (k === k2) return run<never>(noEmpty)\n if (includeNull2 === null) return run<O>(padEmpty)\n return run<never>(noEmpty)\n}\n","import type { App, Arr, AsLiteral, doc, HKT, O, Omit, Rec, RORec } from '../../../types'\nimport { mergeObjects } from '../../expression/array'\nimport { field, fieldM } from '../../expression/concat'\nimport { root, type Field } from '../../field'\nimport type { Delta, DeltaStages } from '../../types'\nimport { set, to } from '../../update'\nimport { $set1, $unwind1 } from '../mongo-stages'\nimport { link } from '../prefix'\nimport { $replaceWithDelta } from '../set/$set-delta'\nimport { $unwindDelta, joinIdOf } from './$unwind-delta'\n\nexport { $unwindDelta, joinIdOf, type JoinId } from './$unwind-delta'\ntype s = string\n\ntype LR<T, U> = doc & { readonly left: T; readonly right: U }\ntype TOf<TT, K extends string> = doc & Omit<TT, K>\n\nexport const $unwind = <TT extends O, K extends s, U extends doc>(\n k: AsLiteral<K>,\n dict: RORec<K, 'key'> & RORec<'_id', 'id'>,\n middle = '.',\n): DeltaStages<O, TOf<TT, K> & Rec<K, Arr<U>>, TOf<TT, K> & Rec<K, U>> => {\n type T = TOf<TT, K>\n type D = T & Rec<K, U>\n const joinK = ['left', middle, 'right'] as const\n return {\n delta: link<Delta<T & Rec<K, Arr<U>>>>()\n .with<unknown, Delta<LR<T & Rec<K, Arr<U>>, Arr<U>>>>(\n $replaceWithDelta(\n field({\n _id: ['_id', root<T & Rec<K, Arr<U>>>().of('_id').expr()],\n left: ['left', root<T & Rec<K, Arr<U>>>().expr()],\n right: ['right', root<Rec<K, Arr<U>>>().of(k).expr()],\n }),\n ),\n )\n .with<unknown, Delta<LR<T & Rec<K, Arr<U>>, U>>>(\n $unwindDelta<'left', T & Rec<K, Arr<U>>, 'right', U>(\n 'left',\n 'right',\n joinK,\n ),\n )\n .with<unknown, Delta<T & Rec<K, U>>>(\n $replaceWithDelta<LR<T & Rec<K, Arr<U>>, U>, T & Rec<K, U>>(\n mergeObjects<T, Rec<K, U>, LR<T & Rec<K, Arr<U>>, U>>(\n root<LR<T & Rec<K, Arr<U>>, U>>().of('left').expr(),\n fieldM<RORec<K, 'key'> & RORec<'_id', 'id'>, RORec<'key', U> & RORec<'id', string>, LR<T & Rec<K, Arr<U>>, U>>(\n {\n key: root<LR<T & Rec<K, Arr<U>>, U>>().of('right').expr(),\n id: root<LR<T & Rec<K, Arr<U>>, U>>().of('_id').expr(),\n },\n dict,\n ),\n ),\n ),\n ).stages,\n raw: <F extends HKT<O, O>>(f: <X extends O>() => Field<App<F, X>, X>) =>\n link<App<F, T & Rec<K, Arr<U>>>>()\n .with<App<F, T>, App<F, D>>($unwind1<T, K, U>(k)(f))\n .with<App<F, T>, App<F, D>>(\n $set1(\n set<RORec<'_id', string>>()<D, D>({\n _id: [\n '_id',\n to(\n joinIdOf(\n joinK,\n 'left',\n root<D>().of('_id').expr(),\n root<D>().of<D, K>(k).of<U, '_id'>('_id').expr(),\n ),\n ),\n ],\n }),\n )(f),\n ).stages,\n }\n}\n","import crypto from 'crypto'\nimport { canonicalize as str } from 'json-canonicalize'\nimport type {\n App,\n Arr,\n AsLiteral,\n Exclude,\n HKT,\n I,\n ID,\n N,\n O,\n Omit,\n RORec,\n Rec,\n doc,\n notArr,\n} from '../../../types'\nimport { field, mergeExpr } from '../../expression/concat'\nimport { asExpr } from '../../expression/expr-base'\nimport { $ifNull, eqTyped, ite } from '../../expression/logic'\nimport { nil, val } from '../../expression/val'\nimport { Field, root } from '../../field'\nimport type { BA, Before, Delta, Expr, RawStages, TStages, UBefore } from '../../types'\nimport { set, to } from '../../update'\nimport { literalsEqaul } from '../../utils/guard'\nimport { map1 } from '../../utils/json'\nimport { $set_, $simpleLookup_ } from '../mongo-stages'\nimport { link } from '../prefix'\nimport { $replaceWithEach, $replaceWithEach1 } from '../set/$replace-with-each'\nimport { $replaceWithDelta } from '../set/$set-delta'\nimport { $unwindDelta, type JoinId } from '../unwind'\ntype s = string\ntype Both<\n K1 extends s,\n LE,\n KK2 extends s,\n RE,\n N1 extends null = never,\n N2 extends null = never,\n> = Delta<Rec<K1, LE | N1> & Rec<Exclude<KK2, BA | K1>, RE | N2> & ID>\n\nexport const $lookupDelta = <\n LQ extends O,\n LE extends LQ & doc,\n RQ extends O,\n RE extends RQ & doc,\n BRB extends UBefore<RQ>,\n RS extends UBefore<RQ>,\n S extends notArr,\n K1 extends s,\n KK2 extends s,\n N1 extends null = never,\n N2 extends null = never,\n>(\n { field1, field2 }: { field1: Field<LQ, S | N | Arr<S>>; field2: Field<RQ, S | N | Arr<S>> },\n { coll, exec, input }: TStages<RS, UBefore<RQ>, BRB, Before<RE>>,\n k1: AsLiteral<K1>,\n k2: AsLiteral<Exclude<KK2, BA | K1>>,\n k: JoinId<K1, Exclude<KK2, BA | K1>>,\n includeNull1?: N1,\n includeNull2?: N2,\n): RawStages<unknown, Delta<LE>, Both<K1, LE, KK2, RE, N1, N2>> => {\n type K2 = Exclude<KK2, BA | K1>\n type BU = Before<RE>\n const hash = crypto\n .createHash('md5')\n .update(coll.collectionName + str(input) + str(exec))\n .digest('base64url')\n\n type ABIds = Rec<'aId' | 'bId', S | Arr<S>>\n type In = Delta<Rec<K1, LE>>\n const normForeignKey = (f: BA) =>\n to(\n $ifNull(\n root<In>().of(f).of<Rec<K1, LE>, K1, null, 3>(k1).with(field1).expr(),\n asExpr<S, unknown>(val(hash)),\n ),\n )\n return link<Delta<LE>>()\n .with<unknown, Delta<Rec<K1, LE>>>(\n $replaceWithDelta<LE, Rec<K1, LE>>(field<RORec<K1, LE>, LE>(map1(k1, root<LE>().expr()))),\n )\n .with<unknown, Delta<Rec<K1, LE>> & ABIds>(\n $set_<O, Delta<Rec<K1, LE>>, Delta<Rec<K1, LE>> & ABIds>(\n set<ABIds>()({\n bId: ['bId', normForeignKey('before')],\n aId: ['aId', normForeignKey('after')],\n }),\n ),\n )\n .with<unknown, Delta<Rec<K1, LE>> & Rec<'a', Arr<BU>> & ABIds>(\n $simpleLookup_<Delta<Rec<K1, LE>> & ABIds, Before<RE>, RS, 'a', unknown, unknown, S | N>({\n coll,\n k: 'a',\n fields: {\n foreign: root<UBefore<RQ>>().of('before').with(field2),\n local: root<ABIds>().of('aId'),\n },\n vars: {},\n pipeline: link<RS>().with(input).with(exec).stages,\n }),\n )\n .with<unknown, Delta<Rec<K1, LE>> & Rec<'a' | 'b', Arr<BU>>>(\n $simpleLookup_<\n Delta<Rec<K1, LE>> & Rec<'a', Arr<BU>> & ABIds,\n Before<RE>,\n RS,\n 'b',\n unknown,\n unknown,\n S | N\n >({\n coll,\n k: 'b' as const,\n fields: {\n foreign: root<UBefore<RQ>>().of('before').with(field2),\n local: root<ABIds>().of('bId'),\n },\n vars: {},\n pipeline: link<RS>().with(input).with(exec).stages,\n }),\n )\n .with<unknown, Delta<Rec<K1, LE> & Rec<K2, Arr<RE>>>>(\n $replaceWithEach<Rec<K1, LE>, Rec<K1, LE> & Rec<K2, Arr<RE>>, Rec<'a' | 'b', Arr<BU>>>(\n <K extends BA>(\n f: K,\n ): Expr<\n (Rec<K1, LE> & Rec<K2, Arr<RE>>) | null,\n Delta<Rec<K1, LE>> & Rec<'a' | 'b', Arr<BU>>\n > => {\n type R = Delta<Rec<K1, LE>> & Rec<'a' | 'b', Arr<BU>>\n type Side = Rec<K1, LE> | null\n type Row = (Rec<K1, LE> & Rec<K2, Arr<RE>>) | null\n const joined = <S extends 'before' | 'after', A extends 'a' | 'b'>(\n side: S,\n arr: A,\n ): Expr<Row, Omit<R, S> & Rec<S, Side>> => {\n type At<X extends Side> = Omit<R, S> & Rec<S, X>\n interface AtF extends HKT<Side> {\n readonly out: At<I<Side, this>>\n }\n type Present = At<Rec<K1, LE>>\n const here = root<Present>()\n return ite<Row, null, Rec<K1, LE>, AtF>(\n eqTyped<null, Rec<K1, LE>, AtF, unknown, Side>(\n root<App<AtF, Side>>().of<RORec<S, Side>, S, 1>(side).expr(),\n nil,\n ),\n nil,\n field<RORec<K1, LE> & RORec<K2, Arr<RE>>, Present>(\n mergeExpr<RORec<K2, Arr<RE>>, RORec<K1, LE>, Present>(\n map1(k2, here.of<RORec<A, Arr<BU>>, A, 1>(arr).of<BU, 'before'>('before').expr()),\n map1(\n k1,\n here.of<RORec<S, Rec<K1, LE>>, S, 1>(side).of<RORec<K1, LE>, K1, 1>(k1).expr(),\n ),\n ),\n ),\n )\n }\n return f === 'after' ? joined('after', 'a') : joined('before', 'b')\n },\n ),\n )\n .with<unknown, Delta<Rec<K1, LE | N1> & Rec<K2, Arr<RE>>>>(\n includeNull1 === null\n ? $replaceWithEach1<Rec<K1, LE> & Rec<K2, Arr<RE>>, Rec<K1, LE | N1> & Rec<K2, Arr<RE>>>(\n <Part extends BA>(\n part: Part,\n ): Expr<\n (Rec<K1, LE | N1> & Rec<K2, Arr<RE>>) | null,\n Delta<Rec<K1, LE> & Rec<K2, Arr<RE>>>\n > => {\n type R1 = Rec<K1, LE> & Rec<K2, Arr<RE>>\n type R = Delta<R1>\n const otherPart: Field<R, R1 | null> = root<R>().of(\n part === 'after' ? 'before' : 'after',\n )\n\n interface NullK1 extends HKT<null> {\n readonly out: Expr<I<null, this>, R>\n }\n const n1 = literalsEqaul<null, N1>(includeNull1).forward<NullK1>(nil)\n const expr: Expr<\n (Rec<K1, LE | N1> & Rec<K2, Arr<RE>>) | null,\n Delta<Rec<K1, LE> & Rec<K2, Arr<RE>>>\n > = $ifNull<Rec<K1, LE | N1> & Rec<K2, Arr<RE>>, R, unknown>(\n root<R>().of(part).expr(),\n field<RORec<K1, LE | N1> & RORec<K2, Arr<RE>>, R>(\n mergeExpr<RORec<K2, Arr<RE>>, RORec<K1, N1>, R>(\n map1(k2, (otherPart as Field<R, R1>).of(k2).expr()),\n map1(k1, n1),\n ),\n ),\n )\n return expr\n },\n )\n : link<Delta<Rec<K1, LE> & Rec<K2, Arr<RE>>>>().stages,\n )\n .with<unknown, Delta<Rec<K1, LE | N1> & Rec<K2, RE | N2> & ID>>(\n $unwindDelta<K1, LE, KK2, RE, N1, N2>(k1, k2, k, includeNull1, includeNull2),\n ).stages\n}\n","import type { App, Arr, AsLiteral, HKT, ID, N, O, Rec, RORec, notArr } from '../../../types'\nimport { $ifNull, concat, val } from '../../expression'\nimport { root, type Field } from '../../field'\nimport type { Before, RawStages, TStages, UBefore } from '../../types'\nimport { set, to } from '../../update'\nimport { $replaceWith_, $set1, $simpleLookup1, $unwind1 } from '../mongo-stages'\nimport { link } from '../prefix'\nimport { type JoinId } from '../unwind'\n\ntype s = string\n\nexport const $lookupRaw =\n <\n LQ extends O,\n LE extends LQ & ID,\n RQ extends O,\n RE extends RQ & ID,\n BRB extends Before<RQ>,\n RS extends UBefore<RQ>,\n S extends notArr,\n As extends s,\n Null extends null = never,\n >(\n { field1, field2 }: { field1: Field<LQ, S | Arr<S>>; field2: Field<RQ, S | Arr<S>> },\n { coll, exec, input }: TStages<RS, Before<RQ>, BRB, Before<RE>>,\n k2: AsLiteral<As>,\n k: JoinId<'left', 'right'>,\n includeNull?: Null,\n ) =>\n <F extends HKT<O, O>>(\n f: <T extends O>() => Field<App<F, T>, T>,\n ): RawStages<App<F, LQ>, App<F, LE>, App<F, LE & Rec<As, RE | Null> & ID>> => {\n type D = LE & Rec<As, RE | Null>\n const left = root<D>().of('_id').expr()\n const right = root<D>().of<D, As>(k2).of<RE, '_id', Null>('_id').expr()\n const keepLeft = k === 'left'\n const composedId =\n typeof k === 'string' ? right : concat(left, val<s>(k[1]), right)\n return link<App<F, LE>>()\n .with<App<F, LE>, App<F, LE & Rec<As, Arr<RE>>>>(\n $simpleLookup1<LE, RE, RS, As, unknown, unknown, S | N>({\n coll,\n k: k2,\n fields: {\n local: field1,\n foreign: root<UBefore<RQ>>().of('before').with(field2),\n },\n vars: {},\n pipeline: link<RS>()\n .with<unknown, BRB>(input)\n .with<unknown, Before<RE>>(exec)\n .with<unknown, RE>($replaceWith_(root<Before<RE>>().of('before').expr())).stages,\n })(f),\n )\n .with<App<F, LE>, App<F, D>>($unwind1<LE, As, RE, Null>(k2, includeNull)(f))\n .with<App<F, LE>, App<F, D>>(\n keepLeft\n ? link<App<F, D>>().stages\n : $set1(\n set<RORec<'_id', s>>()<D, D>({\n _id: ['_id', to($ifNull(composedId, left))],\n }),\n )(f),\n ).stages\n }\n","import type { O, Rec, RecHKT } from '../../types'\nimport { root } from '../field'\nimport type { Before, FRawStages, RawStages } from '../types'\n\nexport const asBefore = <Q extends O, S extends Q, R extends Q, C = unknown>(\n f: FRawStages<Q, S, R, C>,\n): RawStages<Before<Q>, Before<S>, Before<R>, C> =>\n f<RecHKT<'before'>>(<T extends O>() => root<Rec<'before', T>>().of('before'))\n","const T = (s: string) =>\n `Timestamp(${parseInt(`${BigInt(s) / 2n ** 32n}`)}, ${parseInt(`${BigInt(s) % 2n ** 32n}`)})`\n\nconst replace = (s: string)=>s.replace(/\\{\"\\$timestamp\":\"(\\d+)\"\\}/g, (_, d) => T(d))\nconst json = (a: object) => replace(JSON.stringify(a))\n\nexport const log = (...args: unknown[]) =>\n console.log(\n new Date(),\n ...args.map(a => (typeof a === 'function' ? a(replace) : a && typeof a === 'object' ? json(a) : a)),\n )\n","import type { Collection, CreateIndexesOptions, Db, IndexSpecification } from '../../types'\nimport { type log as log1 } from './log'\n\nexport const indexMap = new Map<string, Map<string, Promise<void>>>()\n\nexport const createIndex = async (\n collection: { readonly createIndex: Collection['createIndex']; collectionName: string },\n indexSpec: IndexSpecification,\n op?: CreateIndexesOptions,\n) => {\n const { name, ...options } = op ?? {}\n const map = indexMap.get(collection.collectionName) ?? new Map<string, Promise<void>>()\n indexMap.set(collection.collectionName, map)\n const indexKey = `${JSON.stringify(indexSpec)}-${JSON.stringify(options)}`\n if (map.has(indexKey)) {\n await map.get(indexKey)\n return\n }\n const promise = createIndexWithRetry(collection, indexSpec, op)\n map.set(indexKey, promise)\n await promise\n}\nconst createIndexWithRetry = async (\n collection: { readonly createIndex: Collection['createIndex']; collectionName: string },\n indexSpec: IndexSpecification,\n options?: CreateIndexesOptions,\n) => {\n const log: typeof log1 = () => {}\n log('Creating index', { collection: collection.collectionName, indexSpec, options })\n while (true) {\n try {\n await collection.createIndex(indexSpec, options)\n log('Index created', { collection: collection.collectionName, indexSpec, options })\n } catch (e: any) {\n if ([85, 276].includes(e.code)) {\n // 85 index exists with different name, just ignore creating\n // 276 operation interrupted, it is ok\n log('Index created with different name', e.code, {\n collection: collection.collectionName,\n indexSpec,\n options,\n })\n break\n }\n if (e.code == 12587) {\n // BackgroundOperationInProgressForNamespace, wait a bit then retry\n await new Promise(res => setTimeout(res, 300))\n continue\n }\n log('Error creating index', {\n collection: collection.collectionName,\n indexSpec,\n options,\n error: e,\n })\n console.error('Error creating index', e)\n throw e\n }\n break\n }\n}\n\nexport const ensureCollection = async (db: Db, collectionName: string) => {\n if (!(await db.listCollections({ name: collectionName }, { nameOnly: true }).next())) {\n await db.createCollection(collectionName)\n }\n}\n","import type { PRRec } from '../../../types'\nimport type { KEYS, RaceWinner, SourceIteratorResults } from './types'\n\nexport const map = <T, K extends string & keyof T & keyof V, V>(\n x: Pick<T, K>,\n f: <P extends K>(v: Required<T>[P], k: P) => V[P],\n): V => Object.fromEntries<V, 0>(Object.entries(x).map<[K, V[K]]>(([k, v]) => [k, f(v, k)]))\n\nexport const patch = <T, K extends keyof T>({ ...x }: T, k: K, v: T[K]): T => {\n delete x[k]\n return { ...x, [k]: v }\n}\nexport const restart = <K extends KEYS, Result, Info extends PRRec<K, unknown>>(\n sources: SourceIteratorResults<K, Result, Info>,\n) => {\n type Sources = SourceIteratorResults<K, Result, Info>\n return map<Sources, K, Sources>(sources, x => x.stop())\n}\n\n/**\n * Races multiple source iterators against each other, returning the first one to complete.\n *\n * This function takes an object of source iterators and creates a race condition between\n * them using Promise mechanics. It returns the result of the first iterator to complete,\n * along with its corresponding key from the original object.\n *\n * @param sources - An object containing source iterators, each with a next() method that returns a Promise\n * @returns A promise that resolves to the first completed iterator result along with its key and all sources\n */\nexport const race = <W, K extends KEYS, Result, Info extends PRRec<K, W>>(\n sources: SourceIteratorResults<K, Result, Info>,\n): Promise<RaceWinner<K, Result, Info>> => {\n type Winner = RaceWinner<K, Result, Info>\n type Sources = SourceIteratorResults<K, Result, Info>\n const promises: readonly PromiseLike<Winner | Error>[] = Object.values<\n PromiseLike<Winner | Error>\n >(\n map<Sources, K, Record<K, PromiseLike<Winner | Error>>>(sources, (p, key) => {\n const s = p.next.then(\n frame => ({ key, frame }),\n error => new Error(error),\n )\n return s\n }),\n )\n return Promise.any<readonly (Winner | Error)[], 0>(promises).then<Winner>(\n (result: Winner | Error) => {\n if (result instanceof Error) {\n throw result\n } else {\n return result\n }\n },\n )\n}\n","import type { PRRec } from '../../../types';\nimport type { NextFrame, HasJob } from '../../types'\nimport type { KEYS, RaceWinner, SourceIteratorResults } from './types'\nimport { race } from './utils'\n\nexport const nextWinner = <K extends KEYS, Result, Info extends PRRec<K, HasJob>>(\n previousWinner: RaceWinner<K, Result, Info>,\n previousWinnerNextFrame: NextFrame<Result, Info[K]>,\n sources: SourceIteratorResults<K, Result, Info>,\n interrupt?: (key: KEYS) => boolean\n): PromiseLike<RaceWinner<K, Result, Info>> => {\n const { frame: previousFrame, key } = previousWinner\n // If we have a non interruptable job, we will wait for it to complete before doing anything else\n if (!interrupt?.(key) && previousFrame.info!.job) {\n // If the received iteration is a job, wait for it to complete before doing anything else.\n return previousWinnerNextFrame.then((previousFrameSuccessor)=>{\n \n // If its resulting frame is still a job, don't interrupt, hold with the same flow\n // This means we don't jump to another thread, maintaining the current execution context.\n if (previousFrameSuccessor.info!.job) {\n return { frame: previousFrameSuccessor, key }\n }\n // else we will just race the sources again including the current one\n // if this current one wins the race it will be equivalent to the previous return\n return race(sources)\n })\n }\n return race(sources)\n}\n","import type { PRRec } from '../../../types';\nimport type { Frame, IteratorResult, HasJob, NextFrame } from '../../types'\nimport { nextWinner } from './next-winner'\nimport type { KEYS, Race, RaceWinner, SourceIteratorResults, SourceResults } from './types'\nimport { patch, race, restart } from './utils'\n\nconst makeSelect =\n <K extends KEYS, Result, Info extends PRRec<K, HasJob>>(\n winner: RaceWinner<K, Result, Info>,\n nextFrame: NextFrame<Result, Info[K]>,\n interrupt?: (key: KEYS) => boolean,\n ): Race<K, Result, Info> =>\n sources =>\n nextWinner(winner, nextFrame, sources, interrupt)\n\nconst makeContinuation =\n <K extends KEYS, Result, Info extends PRRec<K, HasJob>>(\n sources: SourceIteratorResults<K, Result, Info>,\n winner: RaceWinner<K, Result, Info>,\n interrupt?: (key: KEYS) => boolean,\n hooks?: {\n start?: (frame: Frame<Result, Info[K]>, result: IteratorResult<Result, Info[K]>) => void\n },\n ) =>\n () => {\n const { frame, key } = winner\n const result = frame.cont()\n hooks?.start?.(frame, result)\n return mergeIterators<K, Result, Info>({\n sources: patch<SourceIteratorResults<K, Result, Info>, K>(sources, key, result),\n interrupt,\n select: makeSelect(winner, result.next, interrupt),\n hooks,\n })\n }\n/**\n * Reiterates over the results, continuing the iteration process.\n * - `frame`: The resulting frame from the asynchronous source.\n * - `key`: The source key of the data.\n */\nconst makeReiterate =\n <K extends KEYS, Result, Info extends PRRec<K, HasJob>>(\n sources: SourceIteratorResults<K, Result, Info>,\n interrupt?: (key: KEYS) => boolean,\n hooks?: {\n start?: (frame: Frame<Result, Info[K]>, result: IteratorResult<Result, Info[K]>) => void\n },\n ) =>\n (winner: RaceWinner<K, Result, Info>): Frame<Result, SourceResults<K, Info>> => {\n const { frame, key } = winner\n return {\n cont: makeContinuation(sources, winner, interrupt, hooks),\n data: frame.data,\n info: { key, value: frame.info, job: frame.info!.job },\n }\n }\n\nexport const mergeIterators = <K extends KEYS, Result, Info extends PRRec<K, HasJob>>(params: {\n sources: SourceIteratorResults<K, Result, Info>\n interrupt?: ((key: KEYS) => boolean) | undefined\n select?: Race<K, Result, Info> | undefined\n hooks?: {\n start?: (frame: Frame<Result, Info[K]>, result: IteratorResult<Result, Info[K]>) => void\n } | undefined\n}): IteratorResult<Result, SourceResults<K, Info>> => {\n const { sources, interrupt, select = race, hooks } = params\n // The main `IteratorResult` returned by `mergeItResults`.\n return {\n stop: () => mergeIterators({ sources: restart(sources), interrupt, select, hooks }),\n next: select(sources).then(makeReiterate(sources, interrupt, hooks)),\n clear: async () => {\n for (const key in sources) {\n await sources[key]?.clear()\n }\n },\n }\n}\n","import { mergeIterators } from './merge'\nimport type { Dict } from '../../../types'\nimport type { Iterator, IteratorResult, HasJob } from '../../types'\n\nconst state = { steady: false }\nlet timeout: NodeJS.Timeout | null = null\n\nexport { mergeIterators } from './merge'\n\nexport const firstWorksMerge = <Result, Info extends HasJob>(\n iters: Iterator<Result, Info>[],\n): Iterator<Result, { readonly key: string; readonly value: Info } & HasJob> => {\n const iterator = () => {\n const results = iters.map(iter => iter())\n const sources: Dict<IteratorResult<Result, Info>> = Object.fromEntries(\n results.map((result, index) => [String(index), result]),\n )\n return mergeIterators<string, Result, Dict<Info>>({\n sources,\n // interrupt: key => key !== '0',\n interrupt: key => false,\n hooks: {\n start: (frame, result) => {\n if (!frame.info.job) return\n if (timeout !== null) {\n clearTimeout(timeout)\n timeout = null\n }\n result.next.then(() => {\n if (!frame.info.job) return\n if (!state.steady) {\n if (timeout !== null) clearTimeout(timeout)\n timeout = setTimeout(() => {\n state.steady = true\n console.log('steady')\n }, 2000)\n }\n })\n },\n },\n })\n }\n return iterator\n}\n","import type { Iterator, HasJob } from './types'\nimport { firstWorksMerge } from './utils/merge/combiners'\n\nexport class Machine<Result = unknown> {\n private sources: Iterator<Result, HasJob>[]\n\n constructor(root?: Iterator<Result, HasJob>) {\n this.sources = root ? [root] : []\n }\n\n add(x: Iterator<Result, HasJob>): void {\n this.sources.push(x)\n }\n\n runner(): Iterator<Result, HasJob> {\n const items = this.sources.filter(x => x)\n if (items.length === 1) {\n return items[0]!\n }\n return firstWorksMerge<Result, HasJob>(items)\n }\n\n start(cb?: (info: HasJob) => void | boolean): Promise<never> {\n const run = this.runner()\n return runCont(run, cb)\n }\n}\n\nexport const wrap = <Result>(root: Machine<Result>): Machine<Result> => root\n\nconst runCont = async <T, Info>(\n it: Iterator<T, Info>,\n cb?: (info: Info) => void | boolean,\n): Promise<never> => {\n while (true) {\n const { next, stop: _, clear } = it()\n const res = await next.then(\n next => ({ ok: true, next }) as const,\n err => ({ ok: false, err }) as const,\n )\n if (!res.ok) {\n console.error(res.err)\n process.exit(1)\n }\n const { cont, info } = res.next\n if (cb?.(info)) {\n await clear()\n throw new Error('Machine stopped')\n }\n it = cont\n }\n}\n","import {\n type AsLiteral,\n type ID,\n type O,\n type RORec,\n type Rec,\n type doc,\n type notArr,\n type Arr,\n type N,\n} from '../../../types'\nimport { mergeObjects } from '../../expression/array'\nimport { fieldM } from '../../expression/concat'\nimport { root, type Field } from '../../field'\nimport type { Delta, DeltaStages, HasJob, IteratorResult, Runner, TStages } from '../../types'\nimport type {\n BA,\n Before,\n RawStages,\n SnapshotStream,\n SnapshotStreamExecutionResult,\n StreamRunnerParam,\n UBefore,\n} from '../../types/stream'\nimport { concatStages, concatTStages, emptyDelta } from '../prefix'\nimport { $replaceWithDelta } from '../set/$set-delta'\nimport { $lookupDelta } from './$lookup-delta'\nimport { $lookupRaw } from './$lookup-raw'\nimport { type JoinId } from '../unwind'\n\nimport { asBefore } from '../../utils/before'\nimport { createIndex } from '../../utils/db-indexes'\nimport { driver } from '../../driver'\nimport { mergeIterators } from '../../utils/merge'\nimport { log } from '../../utils'\n\ntype Next<L, R> = ({ key: 'L'; value: L } | { key: 'R'; value: R }) & HasJob\n\nconst merge = <Result, LD extends HasJob, RD extends HasJob>({\n lsource: L,\n rsource: R,\n}: {\n lsource: IteratorResult<readonly Result[], LD>\n rsource: IteratorResult<readonly Result[], RD>\n}): IteratorResult<readonly Result[], Next<LD, RD>> =>\n mergeIterators<'L' | 'R', readonly Result[], { L: LD; R: RD }>({ sources: { L, R } })\n\nconst join = <\n As extends string,\n LQ extends doc,\n Q2 extends O,\n LE extends LQ,\n LS extends UBefore<LQ>,\n BLB extends Before<LQ>,\n RQ extends O,\n RE extends RQ & doc,\n S extends notArr,\n RS extends UBefore<RQ>,\n BRB extends Before<RQ>,\n Result extends Q2,\n Null extends null = never,\n>(\n params: LookupParams<As, LQ, LE, RQ, RE, S>,\n leftSnapshot: TStages<LS, Before<LQ>, BLB, Before<LE>>,\n rightSnapshot: TStages<RS, Before<RQ>, BRB, Before<RE>>,\n stagesUntilNextLookup: DeltaStages<LQ | Q2, LE & RORec<As, RE | Null>, Result>,\n outerLeft?: Null,\n): SnapshotStreamExecutionResult<LQ | Q2, Result> => {\n type L = 'left'\n type R = 'right'\n const { lField, rField, left, right, as } = params\n const rightJoinField = { field1: lField, field2: rField }\n // `to: 'one'` keeps the left `_id`. `to: 'many'` writes `middle` between the two ids.\n const joinId: JoinId<L, R> = params.to === 'one' ? 'left' : ['left', params.middle, 'right']\n type Joined = Rec<L, LE> & Rec<R, RE | Null> & ID\n const joinR_Snapshot: RawStages<\n Before<LQ | Q2>,\n Before<LE>,\n Before<LE & Rec<As, RE | Null> & ID>\n > = asBefore($lookupRaw(rightJoinField, rightSnapshot, as, joinId, outerLeft))\n const resultingSnapshot = concatTStages(leftSnapshot, joinR_Snapshot)\n const dict = { [as]: 'a' } as RORec<As, 'a'>\n const idB: RORec<'_id', 'b'> = { _id: 'b' }\n const dictId: RORec<As, 'a'> & RORec<'_id', 'b'> = { ...dict, ...idB }\n return {\n stages: consume =>\n consume(concatTStages(resultingSnapshot, asBefore(stagesUntilNextLookup.raw))),\n out: <Final>(\n finalInput: StreamRunnerParam<Delta<Result>, Final>,\n ): Runner<readonly Final[], HasJob> => {\n const leftJoinField = { field1: rField, field2: lField }\n const joinL_Delta = $lookupDelta<RQ, RE, LQ, LE, BLB, LS, S, R, L, Null>(\n leftJoinField,\n leftSnapshot,\n 'right',\n 'left',\n joinId,\n outerLeft,\n )\n const joinR_Delta = $lookupDelta<LQ, LE, RQ, RE, BRB, RS, S, L, R, never, Null>(\n rightJoinField,\n rightSnapshot,\n 'left',\n 'right',\n joinId,\n undefined,\n outerLeft,\n )\n const mergeForeignIntoDoc = concatStages(\n $replaceWithDelta<Joined, LE & Rec<As, RE | Null>>(\n mergeObjects<LE, ID & Rec<As, RE | Null>, Joined>(\n root<Joined>().of('left').expr(),\n fieldM<RORec<As, 'a'> & RORec<'_id', 'b'>, { a: RE | Null; b: string }, Joined>(\n {\n a: root<Joined>().of('right').expr(),\n b: root<Joined>().of('_id').expr(),\n },\n dictId,\n ),\n ),\n ),\n stagesUntilNextLookup.delta,\n )\n const lRunnerInput = concatStages(joinR_Delta, mergeForeignIntoDoc)\n const rRunnerInput = concatStages(joinL_Delta, mergeForeignIntoDoc)\n const getRunner = <Q, V extends Q, B, C>(\n f: SnapshotStreamExecutionResult<Q, V>,\n stages: RawStages<unknown, Delta<V, BA>, Delta<B>>,\n final: StreamRunnerParam<Delta<B>, C>,\n ) =>\n f.out(\n {\n raw: first => concatStages(stages, final.raw(first)),\n teardown: final.teardown,\n },\n async () => {\n log('Creating indexes for lookup left', leftSnapshot.coll.collectionName, {\n [`before.${lField.str()}`]: 1,\n })\n await createIndex(\n leftSnapshot.coll,\n { [`before.${lField.str()}`]: 1 },\n { name: 'left_' + new (driver().UUID)().toString('base64') },\n )\n log('Creating indexes for lookup right', rightSnapshot.coll.collectionName, {\n [`before.${rField.str()}`]: 1,\n })\n await createIndex(\n rightSnapshot.coll,\n { [`before.${rField.str()}`]: 1 },\n { name: 'right_' + new (driver().UUID)().toString('base64') },\n )\n },\n )\n const lRunner = getRunner(left, lRunnerInput, finalInput)\n const rRunner = getRunner(right, rRunnerInput, finalInput)\n return () => merge({ lsource: lRunner(), rsource: rRunner() })\n },\n }\n}\n\ntype Params<As extends string, LQ extends O, RQ extends O, RE extends RQ, S extends notArr> = {\n from: SnapshotStreamExecutionResult<RQ, RE>\n as: AsLiteral<As>\n} & (\n | {\n to: 'one'\n localField: Field<LQ, string | N>\n foreignField?: never\n middle?: never\n }\n | {\n to: 'many'\n middle: string\n localField: Field<LQ, S | Arr<S>>\n foreignField: Field<RQ, S | Arr<S>>\n }\n)\ntype LookupParams<\n As extends string,\n LQ extends O,\n LE extends LQ,\n RQ extends O,\n RE extends RQ,\n S extends notArr,\n> = {\n lField: Field<LQ, S | Arr<S>>\n rField: Field<RQ, S | Arr<S>>\n right: SnapshotStreamExecutionResult<RQ, RE>\n as: AsLiteral<As>\n left: SnapshotStreamExecutionResult<LQ, LE>\n} & (\n | { to: 'one'; middle?: never }\n | { to: 'many'; middle: string }\n)\n\nconst $lookup1 =\n <\n As extends string,\n LQ extends doc,\n LE extends LQ,\n RQ extends O,\n RE extends RQ & doc,\n S extends notArr,\n Null extends null = never,\n >(\n p: LookupParams<As, LQ, LE, RQ, RE, S>,\n outerLeft?: Null,\n ): SnapshotStream<LQ, LE & RORec<As, RE | Null>> =>\n <Q2 extends O, Result extends Q2>(\n input: DeltaStages<Q2 | (LE & RORec<As, RE | Null>), LE & RORec<As, RE | Null>, Result>,\n ) =>\n p.left.stages(\n <LS extends UBefore<LQ>, BLB extends Before<LQ>>(\n lStages: TStages<LS, Before<LQ>, BLB, Before<LE>, number>,\n ) =>\n p.right.stages(\n <RS extends UBefore<RQ>, BRB extends Before<RQ>>(\n rStages: TStages<RS, Before<RQ>, BRB, Before<RE>>,\n ) =>\n join<As, LQ, Q2, LE, LS, BLB, RQ, RE, S, RS, BRB, Result, Null>(\n p,\n lStages,\n rStages,\n input,\n outerLeft,\n ),\n ),\n )\nexport const $lookup =\n <As extends string, LQ extends doc, RQ extends doc, RE extends RQ & doc, S extends notArr>(\n p: Params<As, LQ, RQ, RE, S>,\n ) =>\n <LE extends LQ>(l: SnapshotStream<LQ, LE>): SnapshotStream<LQ, LE & RORec<As, RE>> =>\n p.to === 'one'\n ? $lookup1<As, LQ, LE, RQ, RE, string | N>({\n right: p.from,\n as: p.as,\n lField: p.localField,\n rField: root<doc>().of('_id'),\n left: l(emptyDelta()),\n to: 'one',\n })\n : $lookup1<As, LQ, LE, RQ, RE, S>({\n to: 'many',\n right: p.from,\n as: p.as,\n lField: p.localField,\n rField: p.foreignField,\n left: l(emptyDelta()),\n middle: p.middle,\n })\n\nexport const $outerLookup =\n <As extends string, LQ extends doc, RQ extends doc, RE extends RQ & doc, S extends notArr>(\n p: Params<As, LQ, RQ, RE, S>,\n ) =>\n <LE extends LQ>(l: SnapshotStream<LQ, LE>): SnapshotStream<LQ, LE & RORec<As, RE | null>> =>\n p.to === 'one'\n ? $lookup1<As, LQ, LE, RQ, RE, string | N, null>(\n {\n right: p.from,\n as: p.as,\n lField: p.localField,\n rField: root<RQ>().of('_id'),\n left: l(emptyDelta()),\n to: 'one',\n },\n null,\n )\n : $lookup1<As, LQ, LE, RQ, RE, S, null>(\n {\n to: 'many',\n right: p.from,\n as: p.as,\n lField: p.localField,\n rField: p.foreignField,\n left: l(emptyDelta()),\n middle: p.middle,\n },\n null,\n )\n","import type { Exclude, O, Omit, ReplaceQ, StrKey } from '../../../types'\nimport type { DeltaStages, Expr, LinStages } from '../../types'\nimport { setQ, type Updater, type UpdaterQHKT } from '../../update/updater'\nimport type { MapO } from '../../utils/map-object'\nimport { $replaceWith1, $replaceWith_, $set1, $set_ } from '../mongo-stages'\nimport { $replaceWithDelta, $setDelta } from './$set-delta'\n\nconst $setCore = <Q extends O, T extends Q, V extends Q, C = unknown>(\n updater: Updater<T, T, V, C>,\n): DeltaStages<Q, T, V, C> & LinStages<Q, T, V, C> => ({\n delta: $setDelta(updater),\n raw: $set1<Q, T, V, C>(updater),\n lin: $set_(updater),\n})\n\ntype V<VV, Q> = Exclude<StrKey<VV>, StrKey<Q>>\nexport type $Set<VV extends O, Q extends O> = <R extends Q, C = unknown>(\n fields: MapO<Omit<VV, StrKey<Q>>, UpdaterQHKT<R, R, VV, V<VV, Q>, C>, V<VV, Q>>,\n) => DeltaStages<Q, R, Q & ReplaceQ<R, VV, Q>, C> & LinStages<Q, R, Q & ReplaceQ<R, VV, Q>, C>\n\nexport const $set: <VV extends O, Q extends O = O>() => $Set<VV, Q> =\n <VV extends O, Q extends O = O>() =>\n <R extends Q, C = unknown>(\n fields: MapO<Omit<VV, StrKey<Q>>, UpdaterQHKT<R, R, VV, V<VV, Q>, C>, V<VV, Q>>,\n ) =>\n $setCore<Q, R, Q & ReplaceQ<R, VV, Q>, C>(setQ<VV, Q>()(fields))\n\nexport const $replaceWith = <T extends O, V extends O>(\n expr: Expr<V, T>,\n): DeltaStages<O, T, V> & LinStages<O, T, V> => ({\n delta: $replaceWithDelta(expr),\n raw: $replaceWith1(expr),\n lin: $replaceWith_(expr),\n})\n","import type { Filter, HKT, I, IdHKT, Omit, Replace, RWCollection } from '../../types'\nimport type { ID, N, O, StrKey, doc, rawItem } from '../../types/json'\nimport { mergeObjects } from '../expression/array'\nimport { field, mergeExpr, type ExprHKT, type ExprsExact } from '../expression/concat'\nimport { eq, ite } from '../expression/logic'\nimport { current, nil, val } from '../expression/val'\nimport { root } from '../field'\nimport type { DDel, Del, Delta, Expr, RawStages, StreamRunnerParam, TS } from '../types'\nimport { id } from '../utils/json'\nimport { mapExact, mapExactToObject, type Exact, type MappedHKT } from '../utils/map-object'\nimport { getSubsetMatchForExt, getWhenMatchedForMerge } from './$merge'\nimport { $replaceWith_ } from './mongo-stages'\nimport { $merge_ } from './out'\nimport { link } from './prefix'\n\ntype ND = { readonly deletedAt?: null }\n\ntype SafeE<E> = Omit<E, `$${string}` | keyof ID>\nexport type Merge<T extends doc, E> = Omit<SafeE<E>, keyof (ND & TS)> & ((T & ND & TS) | Del)\n\ntype ExprP<P> = Expr<P, unknown, { new: P }>\ntype Update<P, Out> = (added: ExprP<P>, old: Expr<Out, Out>) => ExprP<P>\n\nexport const $insertX = <T extends doc, D extends O, EEE extends { [K in StrKey<EEE>]: rawItem }>(\n out: RWCollection<Merge<T, EEE>>,\n expr: Expr<T, D>,\n map: (x: Expr<T & ND & TS & Omit<SafeE<EEE>, keyof (ND & TS)>, D>) => Expr<Merge<T, EEE>, D>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n extExpr: ExprsExact<Omit<SafeE<EEE>, keyof (ND & TS)>, unknown>,\n update: Update<Replace<Merge<T, EEE>, {}>, Merge<T, EEE>> = x => x,\n): StreamRunnerParam<D, 'out'> => {\n type EE = SafeE<EEE>\n type E = Omit<EE, keyof (ND & TS)>\n interface EqHKT<Dom = unknown> extends HKT<Dom> {\n readonly out: Record<'$eq', I<Dom, this>>\n }\n type Out = Merge<T, EEE>\n const filter: {\n readonly [K in StrKey<E>]: Record<'$eq', E[K]>\n } = mapExactToObject<E, IdHKT, MappedHKT<E, EqHKT>>(ext, v => ({ $eq: v }))\n const sameSubset = getSubsetMatchForExt<Out, Out, E>(ext)\n\n return {\n teardown: c =>\n c<Out, 'updateMany'>({\n collection: out,\n method: 'updateMany',\n params: [\n filter as Filter<Out>,\n [{ $set: { deletedAt: '$$NOW', touchedAt: '$$CLUSTER_TIME' } }],\n ],\n }),\n raw: (): RawStages<unknown, D, 'out'> => {\n const replacer = map(\n mergeObjects<T, ND & TS & E, D>(\n expr,\n field(\n mergeExpr<EE, ND & TS, D>(extExpr, {\n deletedAt: ['deletedAt', nil],\n touchedAt: ['touchedAt', current],\n }),\n ),\n ),\n )\n\n return link<D>()\n .with<unknown, Out>($replaceWith_(replacer))\n .with<unknown, 'out'>(\n $merge_<Out, Out>({\n into: out,\n on: root<O<ID>>().of('_id'),\n stages: true,\n whenMatched: getWhenMatchedForMerge<Out, Out, never>('insert', update, sameSubset),\n whenNotMatched: 'insert',\n }),\n ).stages\n },\n }\n}\n\nexport const $simpleInsert = <T extends doc, EEE extends { [K in StrKey<EEE>]: rawItem }>(\n out: RWCollection<Merge<T, EEE>>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n): StreamRunnerParam<T, 'out'> => {\n type EE = SafeE<EEE>\n type E = Omit<EE, keyof (ND & TS)>\n const extExpr = mapExact<E, IdHKT, ExprHKT<unknown>>(\n ext,\n <P extends StrKey<E>>(v: E[P]): Expr<E[P], unknown> => val<E[P]>(v),\n )\n\n return $insertX<T, T, EEE>(out, root<T>().expr(), id, ext, extExpr)\n}\n\nexport const $insertPart = <T extends doc, EEE extends { [K in StrKey<EEE>]: rawItem }>(\n out: RWCollection<Merge<T, EEE>>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n): StreamRunnerParam<Delta<T>, 'out'> => {\n type EE = SafeE<EEE>\n type E = Omit<EE, keyof (ND & TS)>\n const extExpr = mapExact<E, IdHKT, ExprHKT<unknown>>(\n ext,\n <P extends StrKey<E>>(v: E[P]): Expr<E[P], unknown> => val<E[P]>(v),\n )\n return $insertX<T, Delta<T>, EEE>(\n out,\n assertNotNull<T, Delta<T>>(root<Delta<T>>().of('after').expr()),\n x =>\n ite<Merge<T, EEE>, Delta<T>>(\n eq<T | null, Delta<T>>(root<Delta<T>>().of('after').expr())(nil),\n field<DDel & Omit<SafeE<EEE>, keyof (ND & TS & ID)>, Delta<T>>(\n mergeExpr<SafeE<EEE>, DDel, Delta<T>>(extExpr, {\n deletedAt: ['deletedAt', current],\n _id: [\n '_id',\n assertNotNull(root<Delta<T>>().of('before').of<T, '_id', null>('_id').expr()),\n ],\n touchedAt: ['touchedAt', current],\n }),\n ),\n x,\n ),\n ext,\n extExpr,\n )\n}\n\nexport const $insert = <T extends doc>(\n out: RWCollection<Merge<T, {}>>,\n): StreamRunnerParam<Delta<T>, 'out'> => $insertPart(out, {})\n\nconst assertNotNull = <T, D, C = unknown>(expr: Expr<T | N, D, C>) => expr as Expr<T, D, C>\n","import type { AggregateCommand } from '../types/aggregate'\nimport type { Db, ReadonlyCollection } from '../../types'\nimport type { RawStages } from '../types'\nimport { log } from '../utils/log'\n\nexport const aggregate = <Result>(\n db: Db,\n streamName: string,\n input: <E>(\n consume: <S, B>(value: {\n coll: ReadonlyCollection<S>\n input: RawStages<unknown, B, Result>\n }) => E,\n ) => E,\n snapshot = true,\n start = Date.now(),\n) =>\n input<Promise<AggregateCommand<Result>>>(({ coll, input }) => {\n const req = {\n aggregate: coll.collectionName,\n pipeline: input,\n cursor: {},\n ...(snapshot && { readConcern: { level: 'snapshot' } }),\n }\n log('exec', streamName, req)\n // if (state.steady) {\n // return state.f({ input: req }).then(() => new Promise(res => {}))\n // }\n const start2 = Date.now()\n return db.command<AggregateCommand<Result>>(req)\n .then(\n result => {\n log('prepare', streamName, Date.now() - start)\n log('prepare2', streamName, start2 - start)\n const r = result\n log(\n 'execed',\n streamName,\n (replace: (s: string) => string) =>\n replace(\n JSON.stringify(req).replaceAll(\n '\"$$CLUSTER_TIME\"',\n JSON.stringify(r.cursor.atClusterTime),\n ),\n ),\n result,\n 'took',\n Date.now() - start,\n )\n return r\n },\n async err => {\n log('err', req, err)\n console.error(err)\n await new Promise(() => {})\n throw new Error(err)\n },\n )\n })\n","import type { Iterator, Frame } from '../types'\n\nexport const addTeardown = <T, Info>(it: Iterator<T, Info>, tr?: () => Promise<void>): Iterator<T, Info> => {\n if (!tr) return it\n return () => {\n const { next, stop, clear } = it()\n const n: PromiseLike<Frame<T, Info>> = next\n return {\n next: n.then(({ cont, ...res }) => ({ cont: addTeardown(cont, tr), ...res })),\n stop: () => (tr(), stop()),\n clear: async () => {\n await tr()\n await clear()\n },\n }\n }\n}\n","import type { Commander, ConstHKT, Db, Dict, Document, IdHKT, O, PRRec, ReadonlyCollection, RORec, StrKey, Timestamp, View } from '../types'\nimport { driver } from './driver'\nimport type { Field } from './field'\nimport type { Del, Model, Query } from './types'\nimport { log } from './utils'\nimport { mapExactToObject } from './utils/map-object'\n\nexport type OplogEntry = {\n ts: Timestamp // oplog timestamp\n ns: string // \"db.collection\"\n op: 'i' | 'u' | 'd' | 'c' | 'n'\n o: Dict<unknown> // operation object\n o2?: { _id: string } // update query (for updates)\n wall?: Date\n} & Document\n\nconst sleep = (ms: number) => new Promise<void>(r => setTimeout(r, ms))\n\nconst maxTimestamp = () => new (driver().Timestamp)(0xffffffffffffffffn)\n\nexport const getCurrentTimestamp = async (db: Db): Promise<Timestamp> => {\n // Get the current timestamp from the server\n const adminDb = db.admin()\n const serverStatus = await adminDb.command<{ operationTime: Timestamp }>({ serverStatus: 1 })\n return serverStatus.operationTime\n}\n\nasync function getLastCommittedTs(adminDb: Commander): Promise<Timestamp | null> {\n const status = await adminDb.command<{\n optimes?: { lastCommittedOpTime?: { ts?: Timestamp } }\n }>({ replSetGetStatus: 1 })\n return status.optimes?.lastCommittedOpTime?.ts ?? null\n}\n\nexport async function waitUntilStablePast(\n db: Db,\n oplogTs: Timestamp,\n { pollMs = 0, timeoutMs = 10_000 }: { pollMs?: number; timeoutMs?: number } = {},\n): Promise<void> {\n const adminDb = db.client.db('admin')\n const deadline = Date.now() + timeoutMs\n\n while (true) {\n const stable = await getLastCommittedTs(adminDb)\n if (stable && stable.comp(oplogTs) >= 0) return\n\n if (Date.now() > deadline) {\n throw new Error('Timed out waiting for stable timestamp to reach oplog event time')\n }\n await sleep(pollMs)\n }\n}\ntype Event = { fields: Set<string>; doc: OplogEntry }\nexport async function* tailOplog(db: Db): AsyncGenerator<Event | null, never, void> {\n let lastTs = await getCurrentTimestamp(db)\n const reopenDelayMs = 250\n\n const coll = db.client.db('local').collection<OplogEntry>('oplog.rs')\n\n while (true) {\n const cursor = coll.find(\n {\n ts: { $gt: lastTs },\n $or: [\n {\n ns: RegExp(`^${db.namespace}\\\\.(?!tmp_)(?!__).*(?<!_snapshot)$`),\n op: { $in: ['i', 'u'] },\n },\n {\n ns: 'admin.$cmd',\n op: 'c',\n 'o.applyOps': {\n $elemMatch: {\n ns: RegExp(`^${db.namespace}\\\\.(?!tmp_)(?!__).*(?<!_snapshot)$`),\n op: { $in: ['i', 'u'] },\n },\n },\n },\n ],\n },\n {\n tailable: true,\n awaitData: true,\n noCursorTimeout: true,\n },\n )\n\n try {\n for await (const docs of cursor) {\n for (const doc of docs.op === 'c' ? (docs.o['applyOps'] as OplogEntry[]) : [docs]) {\n doc.ts = docs.ts\n if (doc.op === 'i' || '_id' in doc.o) {\n const fields = new Set(Object.keys(doc.o))\n fields.delete('_id')\n yield { fields, doc }\n } else {\n // doc.op is 'u'\n if (doc.o['$v'] !== 2) {\n throw new Error(`Expected update with $v: 2, got ${JSON.stringify(doc)}`)\n }\n const updatedFields = []\n const diff = doc.o['diff'] as Dict<unknown>\n for (const updateOp in diff) {\n if ((['u', 'i', 'd'] as const).includes(updateOp)) {\n updatedFields.push(...Object.keys(diff[updateOp] as Dict<unknown>))\n } else if (updateOp.startsWith('s')) {\n updatedFields.push(updateOp.slice(1))\n }\n }\n yield { fields: new Set(updatedFields), doc }\n }\n }\n }\n } catch (e) {\n log('oplog loop error, notifying watchers and reopening')\n console.error(e)\n lastTs = await getCurrentTimestamp(db)\n yield null\n // swallow and reopen; caller can add their own logging around consumption\n } finally {\n log('oplog loop ended')\n await cursor.close().catch(() => {})\n }\n\n await sleep(reopenDelayMs)\n }\n}\n\nconst watchers = new Map<\n string,\n Map<\n string,\n {\n cb: (doc: OplogEntry | null) => void\n keys: readonly string[] | null\n match: Query<never> | undefined\n rem: () => void\n }\n >\n>()\nlet running = false\n\nconst makePromise = <T>() => {\n let resolve: (val: T) => void = () => {}\n let promise = new Promise<T>(r => (resolve = r))\n return { promise, resolve }\n}\n\nconst loop = async (db: Db) => {\n log('starting oplog loop')\n let notify = makePromise<void>()\n let batch: Event[] | null = []\n const run = async () => {\n for await (const event of tailOplog(db)) {\n if (event?.fields.size === 0) continue\n batch = event && batch ? [...batch, event] : null\n notify.resolve()\n }\n }\n run()\n const iter = async function* () {\n while (true) {\n await notify.promise\n const b = batch\n batch = []\n notify = makePromise()\n yield b\n }\n }\n for await (const events of iter()) {\n if (!events) {\n log('notifying watchers of oplog loop restart')\n for (const m of watchers.values()) {\n for (const { cb } of [...m.values()]) {\n cb(null)\n }\n }\n continue\n }\n for (const { fields, doc } of events) {\n const m = watchers.get(doc.ns)\n if (!m) continue\n for (const { cb, keys, rem, match } of [...m.values()]) {\n if (!keys || (doc.op === 'i' ? (match ? true : true) : keys.some(k => fields.has(k)))) {\n cb(doc)\n rem()\n }\n }\n }\n }\n}\n\nconst register = <V extends O>(\n coll: ReadonlyCollection<V | Del>,\n keys: readonly string[] | null,\n match: Query<V> | undefined,\n cb: (doc: OplogEntry | null) => void,\n) => {\n const ns = coll.namespace\n let m = watchers.get(ns)\n if (!m) watchers.set(ns, (m = new Map()))\n const id = crypto.randomUUID()\n const rem = () => {\n m!.delete(id)\n if (m!.size === 0) watchers.delete(ns)\n }\n m.set(id, { cb, keys, match, rem })\n if (!running) {\n running = true\n loop(coll.s.db)\n }\n return rem\n}\n\nexport const subQ = <D extends O, C, DeltaD extends O>(\n a: Query<D, C>,\n f: Field<DeltaD, D>,\n): Query<DeltaD, C> => ({ raw: g => a.raw(g.with(f)) })\n\nlet maxKeysRemoved: Promise<void> | null = null\n\nexport const makeWatchStream = async <V extends Model, K extends StrKey<V>>(\n { collection, projection: p, hardMatch: m }: View<V, K>,\n streamName: string,\n) => {\n const { db } = collection.s\n await (maxKeysRemoved ??= Promise.all(\n (await db.listCollections({}, { nameOnly: true }).toArray()).map(\n x =>\n void db\n .collection(x.name)\n .updateMany({ touchedAt: maxTimestamp() }, [{ $set: { touchedAt: '$$CLUSTER_TIME' } }]),\n ),\n ).then(() => {}))\n\n const projection: PRRec<K, 1> & {deletedAt: 1} = { ...(p ? mapExactToObject<RORec<K, 1>, IdHKT, ConstHKT<1>>(p, v => v) : {}), deletedAt: 1 }\n\n let notify = makePromise<OplogEntry | null>()\n register(collection, p ? Object.keys(projection) : null, m, doc => {\n log(streamName, 'change detected', doc)\n notify.resolve(doc)\n })\n\n return {\n tryNext: async () => {\n const doc = await notify.promise\n // wait until the server’s lastStableRecoveryTimestamp / stable time has advanced past the oplog entry time\n const start = Date.now()\n if (doc) await waitUntilStablePast(collection.s.db, doc.ts)\n log(streamName, 'stable past took', Date.now() - start)\n return doc ?? {}\n },\n close: async () => {},\n }\n}\n","import type { Collection, Document, Exclude, OPickD, rawItem, RawObj, StrKey, Timestamp } from '../../types'\nimport type { Actions, Model } from '../types/stream'\n\nexport type AllowedPick<V extends Model, K extends StrKey<V>> = OPickD<V, Allowed<K>>\nexport type Allowed<K> = Exclude<K, 'deletedAt' | '_id'>\nexport type Teardown = { collection: string; method: string; params: unknown[] }\nexport type TsData = {\n input: readonly RawObj[]\n finalInput: readonly RawObj[]\n finalInputFirst: readonly RawObj[]\n project: rawItem\n match: rawItem\n teardown: Teardown\n}\nexport type Last = {\n _id: string\n ts: Timestamp\n data?: TsData\n job?: 1 | null\n}\n\nexport const actions: {\n [K in keyof Actions<unknown>]: <W extends Document>(\n col: Collection<W>,\n x: Actions<W>[K],\n ) => [Promise<unknown>, unknown[]]\n} = {\n updateMany: (c, args) => [\n c.updateMany(...args),\n [`db['${c.collectionName}'].updateMany(...`, args, ')'],\n ],\n deleteMany: (c, args) => [\n c.deleteMany(...args),\n [`db['${c.collectionName}'].deleteMany(...`, args, ')'],\n ],\n}\n\n","import type { N, O, RawObj, rawItem } from '../../types'\nimport type { Query } from '../types'\nimport { defined, safeNarrow } from '../utils/json'\n\ntype Many<T> = readonly (T | N)[]\ntype Operator = `$${string}`\ntype Result2<Dom> = { readonly [_ in Operator]?: readonly Dom[] }\ntype Result1<Dom> = Result2<Dom> & RawObj\ntype Result<Dom> = Dom | Result1<Dom> \ntype Combiner = {\n <T extends O, C = unknown>(first: Query<T, C>, ...args: Many<Query<T, C>>): Query<T, C>\n <T extends O, C = unknown>(...args: Many<Query<T, C>>): Query<T, C> | undefined\n}\ntype ApplyOpertorToMaybePreItems = <T>(\n op: Operator,\n args: Many<T>,\n) => undefined | (<Dom extends rawItem>(map: (x: T) => Dom) => Result<Dom>)\ntype ApplyOpertorToPreItems = <T>(\n op: Operator,\n x: readonly T[],\n) => undefined | (<Dom extends rawItem>(map: (x: T) => Dom) => Result<Dom>)\nconst filterUndefined = (applyOperator: ApplyOpertorToPreItems): ApplyOpertorToMaybePreItems => {\n return (op, args) => applyOperator(op, args.filter(defined))\n}\nconst combine =\n (op: Operator, applyOperatorToPreItems: ApplyOpertorToMaybePreItems): Combiner =>\n <T extends O, C>(...args: Many<Query<T, C>>): Query<T, C> => {\n const mapToItems = applyOperatorToPreItems<Query<T, C>>(op, args)\n return mapToItems! && { raw: field => mapToItems(x => x.raw(field)) }\n }\nconst all: ApplyOpertorToPreItems = <T>(op: Operator, x: readonly T[]) =>\n x.length === 0\n ? undefined\n : <Dom extends rawItem>(f: (x: T) => Dom): Result<Dom> => safeNarrow<RawObj>()({ [op]: x.map(f) })\nconst first: ApplyOpertorToPreItems = (op, x) => (x.length === 1 ? f => f(x[0]!) : all(op, x))\nexport const $and: Combiner = combine('$and', filterUndefined(first))\nexport const $nor: Combiner = combine('$nor', filterUndefined(all))\nexport const $or: Combiner = combine('$or', filterUndefined(first))\n","import type { Exclude, N, O, RORec, StrKey, Timestamp, View } from '../../types'\nimport { driver } from '../driver'\nimport type { ConstHKT, IdHKT } from '../../types/hkt'\nimport { $match_, $project_ } from '../aggregate/mongo-stages'\nimport { link, type Concat } from '../aggregate/prefix'\nimport { root } from '../field'\nimport { $eq, $exists, $gtTs } from '../predicate'\nimport { $expr } from '../predicate/$expr'\nimport { $and } from '../query/logic'\nimport type { Query } from '../types'\nimport type { D, Del, Model, RawStages } from '../types/stream'\nimport { mapExactToObject, spread } from '../utils/map-object'\nimport type { Allowed } from './boot-utils'\n\nexport const previous = (ts: Timestamp) => new (driver().Timestamp)({ t: ts.high - 60, i: 0 })\n\nexport const getFirstStages = <V extends Model, KK extends StrKey<V>>(\n view: View<V, Allowed<KK>>,\n needs: Partial<Record<KK, 0 | 1>>,\n) => {\n type K = Allowed<KK>\n type WithDel = 'deletedAt' | '_id' | Exclude<K, 'deletedAt' | '_id'>\n\n const { projection, hardMatch: pre, match } = view\n const projectInput = projection && $project_<V, WithDel>(\n spread<RORec<K, 1>, RORec<'deletedAt' | '_id', 1>, IdHKT>(projection, {\n deletedAt: ['deletedAt', 1],\n _id: ['_id', 1],\n }),\n )\n\n const removeNotYetSynchronizedFields: null | readonly Query<V>[] = projection && Object.values(\n mapExactToObject<RORec<K, 1>, IdHKT, ConstHKT<Query<V> | null>>(projection, (_, k) =>\n (needs[k] ?? k.startsWith('_')) ? root<V>().of(k).has($exists(true)) : null,\n ),\n )\n const hardMatch = removeNotYetSynchronizedFields ? $and(pre, ...removeNotYetSynchronizedFields) : pre\n const firstStages = (\n lastTS: { ts: Timestamp } | null,\n keepNulls = false,\n ): Concat<V | O | Del, Del | V, V, unknown> => {\n const hardQuery = $and(\n lastTS\n ? root<Model>().of('touchedAt').has($gtTs(previous(lastTS.ts)))\n : root<D>().of('deletedAt').has($eq<Timestamp | N>(null)),\n lastTS ? null : match && $expr(match),\n keepNulls ? pre : hardMatch,\n )\n const ln = link<V | Del>()\n .with($match_(hardQuery) as RawStages<O, V | Del, V>)\n return (projectInput ? ln.with(projectInput) : ln)\n }\n return { firstStages, hardMatch }\n}\n\n","import crypto from 'crypto'\nimport type {\n Collection,\n Dict,\n Document,\n N,\n O,\n O2,\n O3,\n RORec,\n StrKey,\n Timestamp,\n View,\n WatchStream,\n} from '../../types'\nimport { uuid } from '../driver'\nimport type { HKT, I } from '../../types/hkt'\nimport { $match_, $replaceWith_, $set_ } from '../aggregate/mongo-stages'\nimport { $merge_ } from '../aggregate/out'\nimport { concatDelta, emptyDelta, link, pipe, type DeltaPipe } from '../aggregate/prefix'\nimport { mergeObjects } from '../expression'\nimport { field } from '../expression/concat'\nimport { $ifNull, and, eq, ite } from '../expression/logic'\nimport { nil, val } from '../expression/val'\nimport { ctx, root } from '../field'\nimport { $eq, $ne } from '../predicate'\nimport { aggregate } from '../stream/aggregate'\nimport type { AggregateCommand, Before, Expr, SnapshotStreamExecutionResult } from '../types'\nimport type { Frame, HasJob, Iterator, Runner } from '../types/machine'\nimport type {\n Actions,\n After,\n D,\n Delta,\n DeltaStages,\n Model,\n RawStages,\n StreamRunnerParam,\n TeardownRecord,\n UDelta,\n} from '../types/stream'\nimport { noop } from '../utils'\nimport { asBefore } from '../utils/before'\nimport { createIndex, ensureCollection, indexMap } from '../utils/db-indexes'\nimport { log } from '../utils/log'\nimport { addTeardown } from '../utils/tear-down'\nimport { makeWatchStream } from '../watch'\nimport type { Allowed, AllowedPick, Last, Teardown, TsData } from './boot-utils'\nimport { actions } from './boot-utils'\nimport { getFirstStages } from './first-stages'\nimport { set, to } from '../update'\nimport type { Updater } from '../update/updater'\n\nexport const streamNames: Dict<string> = {}\nconst executes = <\n q extends O,\n V extends Model,\n KK extends StrKey<V>,\n Result extends q | AllowedPick<V, KK>,\n>(\n view: View<V, Allowed<KK>>,\n input: DeltaStages<q | AllowedPick<V, KK>, AllowedPick<V, KK>, Result>,\n streamName: string,\n skip = false,\n after?: () => Promise<void>,\n needs: Partial<Record<KK, 0 | 1>> = {},\n): SnapshotStreamExecutionResult<q | AllowedPick<V, KK>, Result> => {\n type T = AllowedPick<V, KK>\n\n const { collection, projection, match } = view\n\n const { firstStages, hardMatch } = getFirstStages(view, needs)\n\n const db = collection.s.db,\n coll = collection.collectionName\n\n const hash = crypto\n .createHash('md5')\n .update(new Error().stack + '')\n .digest('base64url')\n if (!streamNames[streamName]) streamNames[streamName] = hash\n else if (streamNames[streamName] != hash) throw new Error(`streamName ${streamName} already used`)\n\n const last = db.collection<Last>('__last')\n const snapshotCollection = db.collection<UDelta<T>>(coll + '_' + streamName + '_snapshot')\n\n const job = {}\n const run = <Result2>(\n finalInput: StreamRunnerParam<Delta<Result>, Result2>,\n setup?: () => Promise<void>,\n ): Runner<readonly Result2[], HasJob> => {\n type W = HasJob & { debug: string }\n type It = Iterator<readonly Result2[], W>\n type FrameD = Frame<readonly Result2[], W>\n type Next = Promise<FrameD>\n const dropSnapshot = async () => {\n await snapshotCollection.drop().catch(noop)\n log(\n 'snapshot collection dropped',\n streamName,\n `db['${snapshotCollection.collectionName}'].drop()`,\n )\n log(\n 'with',\n [...(indexMap.get(snapshotCollection.collectionName)?.keys() ?? [])],\n 'indexes in map before deletion',\n )\n indexMap.delete(snapshotCollection.collectionName)\n }\n const clear = async () => Promise.all([dropSnapshot(), last.deleteOne({ _id: streamName })])\n\n const withStop = (next: () => PromiseLike<FrameD>, tr?: () => Promise<void>): It => {\n return addTeardown(() => ({ stop, next: next(), clear }), tr)\n }\n const nextData =\n (data: readonly Result2[], job?: object) =>\n (next: () => Next, debug: string, tr?: () => Promise<void>): FrameD => ({\n cont: withStop(next, tr),\n data,\n info: { job, debug: `${streamName} on ${collection.collectionName}: ${debug}` },\n })\n const next = nextData([], job)\n\n const data: TsData = {\n input: input.delta,\n finalInputFirst: finalInput.raw(true),\n finalInput: finalInput.raw(false),\n match: view.match?.raw(root()).get(),\n project: projection,\n teardown: finalInput.teardown(\n (x): Teardown => ({\n collection: x.collection.collectionName,\n method: x.method,\n params: x.params,\n }),\n ),\n }\n\n // Step 0 : declare we are starting a job\n const step0 = () => Promise.resolve(next(step1, 'empty new collection'))\n const stop: It = withStop(step0)\n\n // Step 1 : empty new collection\n const step1 = async (): Next => {\n log(\n 'reset collection',\n streamName,\n `db['${snapshotCollection.collectionName}'].updateMany( updated: true }, { $set: { updated: false, after: null } })`,\n )\n await snapshotCollection.updateMany(\n { updated: true },\n { $set: { updated: false, after: null } },\n )\n log('reset collection done', streamName)\n // we don't need to remove null before because they will be reinserted anyway in step 3\n return next(step2, 'get last update')\n }\n // Step 2 : get last update\n const step2 = (): Next =>\n Promise.all([\n last.findOne({ _id: streamName, data, job: null }),\n last.findOne({ _id: streamName }),\n ]).then(ts =>\n next(\n step2_5(ts),\n ts[0]\n ? `no teardown to handle, starting at ${ts[0].ts}`\n : ts[1]\n ? 'handle teardown'\n : 'start fresh',\n ),\n )\n const step2_5 =\n ([same, exists]: [Last | null, Last | null]) =>\n async (): Next => {\n const handleTeardown = async <W extends Document, M extends keyof Actions<unknown>>(\n last: Pick<Last, 'data'>,\n ) => {\n if (!last.data) return\n const { collection: c, method: m, params: p } = last.data.teardown\n const { collection, method, params } = {\n collection: db.collection<W>(c),\n method: m as M,\n params: p as TeardownRecord<W, M>['params'],\n }\n const [action, out] = actions[method](collection, params)\n log('teardown', `db['${snapshotCollection.collectionName}'].drop()`, ...out)\n await Promise.all([dropSnapshot(), action])\n log('teardown done', `db['${snapshotCollection.collectionName}'].drop()`, ...out)\n }\n if (!same) {\n log('not same, new data', streamName, data)\n await handleTeardown(exists ?? { data })\n }\n log('creating indexes')\n\n await createIndex(\n snapshotCollection,\n { before: 1 },\n {\n partialFilterExpression: { before: null },\n name: 'before_' + uuid(),\n },\n )\n\n await createIndex(\n snapshotCollection,\n { updated: 1 },\n {\n partialFilterExpression: { updated: true },\n name: 'updated_' + uuid(),\n },\n )\n\n await createIndex(\n snapshotCollection,\n { updated: 1, after: 1, before: 1 },\n {\n partialFilterExpression: { updated: true, after: null, before: null },\n name: 'updated_nulls_' + uuid(),\n },\n )\n\n await createIndex(\n snapshotCollection,\n { updated: 1, after: 1 },\n {\n partialFilterExpression: { updated: true, after: null },\n name: 'updated_no_after_' + uuid(),\n },\n )\n\n await createIndex(\n snapshotCollection,\n { updated: 1 },\n {\n partialFilterExpression: { updated: true, after: null, before: null },\n name: 'updated_nulls_' + uuid(),\n },\n )\n await ensureCollection(db, coll)\n await db.command({\n collMod: coll,\n changeStreamPreAndPostImages: { enabled: true },\n })\n await createIndex(\n collection,\n { touchedAt: 1 },\n hardMatch\n ? {\n partialFilterExpression: hardMatch.raw(root()),\n name: 'touchedAt_hard_' + uuid(),\n }\n : {},\n )\n await setup?.()\n\n await after?.()\n return nextData([])(async () => {\n // @TODO: use a proper way to execute teardowns before streams\n await new Promise(resolve => setTimeout(resolve, 1000))\n return next(step3(same), 'clone into new collection')\n }, 'wait for clone into new collection')\n }\n\n // Step 3 : clone into new collection\n const step3 = (lastTS: { _id: string; ts: Timestamp } | null) => async (): Next => {\n const notDeleted: Expr<boolean, T, unknown> = eq(\n $ifNull(root<D>().of('deletedAt').expr(), nil),\n )(nil)\n const query = match ? and<T & D>(notDeleted, match) : notDeleted\n type ToMerge = UDelta<T> & After<T> & { updated: true; _id: string }\n const replaceRaw: RawStages<O, T & D, ToMerge> = $replaceWith_(\n field<ToMerge, T & D>({\n after: ['after', lastTS ? ite(query, root<T>().expr(), nil) : root<T>().expr()],\n updated: ['updated', val(true)],\n _id: ['_id', root<T & D>().of('_id').expr()],\n }),\n )\n\n const cloneIntoNew = firstStages(lastTS)\n .with(replaceRaw)\n .with(\n $merge_<ToMerge, UDelta<T>, { new: ToMerge }>({\n into: snapshotCollection,\n on: root<UDelta<T>>().of('_id'),\n stages: 'ctx',\n vars: {\n new: ['new', root<ToMerge>().expr()],\n },\n whenMatched: link<UDelta<T>, { new: ToMerge }>().with(\n $replaceWith_(\n ite(\n eq<T | N, UDelta<T>, { new: ToMerge }>(root<UDelta<T>>().of('before').expr())(\n ctx<ToMerge>()('new').of('after').expr(),\n ),\n root<UDelta<T>>().expr(),\n mergeObjects(root<UDelta<T>>().expr(), ctx<ToMerge>()('new').expr()),\n ),\n ),\n ).stages,\n whenNotMatched: 'insert',\n }),\n ).stages\n\n const stream = await makeStream()\n\n const r = await aggregate<'out'>(db, streamName, c =>\n c({ coll: collection, input: cloneIntoNew }),\n )\n const start = Date.now()\n const res = await snapshotCollection.deleteMany({ updated: true, after: null, before: null })\n log(\n 'deleting from cloned into new collection',\n Date.now() - start,\n res,\n `db['${snapshotCollection.collectionName}'].deleteMany({ updated: true, after: null, before: null })`,\n )\n return next(step4({ result: r, ts: lastTS?.ts, stream }), 'run the aggregation', () =>\n stream.close(),\n )\n }\n\n type Res = {}\n type C = WatchStream<Res>\n\n // Step 4 : run the aggregation // idempotent\n const makeStream = (): Promise<C> => makeWatchStream(view, streamName)\n const step4 =\n (args: { result: AggregateCommand<'out'>; ts?: Timestamp | undefined; stream: C }) =>\n async (): Next => {\n const { result, ts, stream } = args\n const start = Date.now()\n // await snapshotCollection.updateMany({ before: null }, { $set: { before: null } })\n log('snapshot', streamName, 'ensure before null', Date.now() - start)\n const first = ts === undefined\n const stages = finalInput.raw(first)\n await last.updateOne({ _id: streamName }, { $set: { job: 1 } }, { upsert: true })\n // log('updated docs', await snapshotCollection.find({ updated: true }).toArray())\n const nextRes = stream.tryNext()\n const aggResult = await aggregate<Result2>(\n db,\n streamName,\n c =>\n c<UDelta<T>, UDelta<T> & Delta<T>>({\n coll: snapshotCollection as Collection<UDelta<T> & Delta<T>>,\n input: link<UDelta<T> & Delta<T>>()\n .with($match_(root<UDelta<T> & Delta<T>>().of('updated').has($eq<boolean>(true))))\n .with<Delta<T>, Delta<T>>(\n $set_(\n set<RORec<'before', T | null>>()({\n before: [\n 'before',\n to($ifNull(root<UDelta<T> & Delta<T>>().of('before').expr(), nil)),\n ],\n }) as Updater<Delta<T>, Delta<T>, Delta<T>>,\n ),\n )\n .with(input.delta)\n .with(stages).stages,\n }),\n false,\n start,\n )\n return next(\n step5({ ts: result.cursor.atClusterTime, aggResult, stream, nextRes, first }),\n 'remove handled deleted updated',\n )\n }\n\n // Step 5 : remove handled deleted updated\n const step5 = (l: L) => async (): Next => {\n log(\n streamName,\n `remove handled deleted updated db['${snapshotCollection.collectionName}'].deleteMany({ updated: true, after: null })`,\n )\n await snapshotCollection.deleteMany({ updated: true, after: null })\n log('removed handled deleted updated')\n return next(step6(l), 'update snapshot aggregation')\n }\n type L = {\n aggResult: AggregateCommand<Result2>\n ts: Timestamp\n stream: C\n nextRes: Promise<Res | null>\n first: boolean\n }\n\n // Step 6 : commit changes on snapshot\n const step6 = (l: L) => async (): Next => {\n log(\n 'update snapshot aggregation',\n `db['${snapshotCollection.collectionName}'].updateMany({ updated: true }, [ { $set: { updated: false, after: null, before: '$after' } } ])`,\n )\n const start = Date.now()\n await snapshotCollection.updateMany({ updated: true }, [\n {\n $set: {\n updated: false,\n after: null,\n before: '$after',\n },\n },\n ])\n log('updated snapshot aggregation', Date.now() - start)\n return next(step7(l), 'update __last')\n }\n\n // Step 7 : update __last\n const step7 = (l: L) => async (): Next => {\n const start = Date.now()\n const patch: { $set: Document } = {\n $set: {\n ts: l.ts,\n job: null,\n },\n }\n if (l.first) patch.$set = { ...patch.$set, data }\n await last.updateOne({ _id: streamName }, patch, { upsert: true })\n log(\n 'updated __last',\n Date.now() - start,\n `db['${last.collectionName}'].updateOne({ _id: '${streamName}' }, `,\n patch,\n `, { upsert: true })`,\n )\n return step8(l)\n }\n // Step 8 : wait for change\n const step8 = (l: L): FrameD => {\n return nextData(l.aggResult.cursor.firstBatch)(\n () =>\n l.nextRes.then(doc =>\n doc\n ? next(step3({ _id: streamName, ts: l.ts }), 'restart')\n : step8({ ...l, nextRes: l.stream.tryNext() }),\n ),\n 'wait for change',\n )\n }\n return skip\n ? withStop(() => Promise.resolve(next(step3(null), 'clone into new collection')))\n : stop\n }\n const hasBefore = root<UDelta<T>>().of('before').has($ne<T | N>(null))\n return {\n stages: c =>\n c<UDelta<T>, Before<T>>({\n coll: snapshotCollection,\n input: $match_(hasBefore) as RawStages<unknown, UDelta<T>, Before<T> & UDelta<T>>,\n exec: asBefore(input.raw),\n }),\n out: run,\n }\n}\n\nexport interface SnapshotStreamHKT extends HKT<O2> {\n readonly out: SnapshotStreamExecutionResult<I<O2, this>[0], I<O2, this>[1]>\n}\nexport interface DeltaHKT extends HKT<O3> {\n readonly out: DeltaStages<I<O3, this>[0], I<O3, this>[1], I<O3, this>[2]>\n}\n\nexport const staging = <V extends Model, KK extends StrKey<V>>(\n view: View<V, Allowed<KK>> & {\n needs?: Partial<Record<KK, 0 | 1>>\n },\n streamName: string,\n skip = false,\n after?: () => Promise<void>,\n): DeltaPipe<AllowedPick<V, KK>, AllowedPick<V, KK>, SnapshotStreamHKT, DeltaHKT> =>\n pipe<AllowedPick<V, KK>, AllowedPick<V, KK>, AllowedPick<V, KK>, SnapshotStreamHKT, DeltaHKT>(\n input => executes(view, input, streamName, skip, after, view.needs),\n emptyDelta(),\n concatDelta,\n emptyDelta,\n )\n","import crypto from 'crypto'\nimport type { Document, Exclude, N, O, O2, O3, OPickD, RORec, StrKey, Timestamp, View, WatchStream } from '../../types'\nimport { driver } from '../driver'\nimport type { ConstHKT, HKT, I, IdHKT } from '../../types/hkt'\nimport { $match_, $project_ } from '../aggregate/mongo-stages'\nimport { concatStages, link, pipe } from '../aggregate/prefix'\nimport { root } from '../field'\nimport { $eq, $exists, $gteTs } from '../predicate'\nimport { $expr } from '../predicate/$expr'\nimport { $and } from '../query/logic'\nimport { aggregate } from '../stream/aggregate'\nimport type { Frame, HasJob, Iterator, Query, RawStages, Runner } from '../types'\nimport type { AggregateCommand } from '../types/aggregate'\nimport type {\n Actions,\n D,\n Del,\n Model,\n SimpleStreamExecutionResult,\n StreamRunnerParam,\n TeardownRecord,\n} from '../types/stream'\nimport { log } from '../utils'\nimport { createIndex, ensureCollection } from '../utils/db-indexes'\nimport { mapExactToObject, spread } from '../utils/map-object'\nimport { addTeardown } from '../utils/tear-down'\nimport { makeWatchStream } from '../watch'\nimport { streamNames } from './boot'\nimport { actions, type Last, type Teardown, type TsData } from './boot-utils'\nimport { previous } from './first-stages'\n\ntype Allowed<K> = Exclude<K, 'deletedAt' | '_id'>\ntype AllowedPick<V extends Model, K extends StrKey<V>> = OPickD<V, Allowed<K>>\n\nconst executes = <\n q extends O,\n V extends Model,\n KK extends StrKey<V>,\n Result extends q | AllowedPick<V, KK>,\n>(\n view: View<V, Allowed<KK>>,\n input: RawStages<q | AllowedPick<V, KK>, AllowedPick<V, KK>, Result, unknown, 1>,\n streamName: string,\n needs: Partial<Record<KK, 0 | 1>>,\n): SimpleStreamExecutionResult<q | AllowedPick<V, KK>, Result> => {\n const hash = crypto\n .createHash('md5')\n .update(new Error().stack + '')\n .digest('base64url')\n if (!streamNames[streamName]) streamNames[streamName] = hash\n else if (streamNames[streamName] != hash) throw new Error('streamName already used')\n type K = Allowed<KK>\n const { collection, projection, hardMatch: pre, match } = view\n\n const removeNotYetSynchronizedFields: null | readonly Query<V>[] =\n projection &&\n Object.values(\n mapExactToObject<RORec<K, 1>, IdHKT, ConstHKT<Query<V> | null>>(projection, (_, k) =>\n (needs[k] ?? k.startsWith('_')) ? root<V>().of(k).has($exists(true)) : null,\n ),\n )\n const hardMatch = removeNotYetSynchronizedFields\n ? $and(pre, ...removeNotYetSynchronizedFields)\n : pre\n\n const job = {}\n const db = collection.s.db,\n coll = collection.collectionName\n const last = db.collection<Last>('__last')\n type D_ID = 'deletedAt' | '_id'\n // TODO create indexes (if snapshot is in sources)\n type WithDel = D_ID | Exclude<K, D_ID>\n const projectInput =\n projection &&\n $project_<V, WithDel>(\n spread<RORec<K, 1>, RORec<D_ID, 1>, IdHKT>(projection, {\n deletedAt: ['deletedAt', 1],\n _id: ['_id', 1],\n }),\n )\n const notDeleted = root<D>().of('deletedAt').has($eq<Timestamp | N>(null))\n\n const stages = (lastTS: { _id: string; ts: Timestamp } | null) => {\n const hardQuery: Query<V> | undefined = $and(\n lastTS && root<Model>().of('touchedAt').has($gteTs(previous(lastTS.ts))),\n hardMatch,\n notDeleted,\n match && $expr(match),\n )\n const ln = link<V | Del>().with($match_(hardQuery) as RawStages<unknown, V | Del, V>)\n return (projectInput ? ln.with(projectInput) : ln).with<unknown, Result>(input)\n }\n\n const run = <Result2>(\n finalInput: StreamRunnerParam<Result, Result2>,\n ): Runner<readonly Result2[], HasJob> => {\n type W = HasJob & { debug: string }\n type It = Iterator<readonly Result2[], W>\n type FrameD = Frame<readonly Result2[], W>\n type Next = Promise<FrameD>\n const clear = async () => {}\n const withStop = (next: () => PromiseLike<FrameD>, tr?: () => Promise<void>): It => {\n return addTeardown(() => ({ stop, next: next(), clear }), tr)\n }\n const next = (next: () => Next, debug: string, tr?: () => Promise<void>): FrameD => ({\n cont: withStop(next, tr),\n data: [],\n info: { job, debug },\n })\n\n const data: TsData = {\n input: input,\n finalInputFirst: finalInput.raw(true),\n finalInput: finalInput.raw(false),\n match: view.match?.raw(root()).get(),\n project: projection,\n teardown: finalInput.teardown(\n (x): Teardown => ({\n collection: x.collection.collectionName,\n method: x.method,\n params: x.params,\n }),\n ),\n }\n\n // Step 0 : declare we are starting a job\n const step0 = () => Promise.resolve(next(step1, 'get last update'))\n const stop: It = withStop(step0)\n\n // Step 1 : get last update\n const step1 = async (): Next => {\n log('creating indexes')\n await ensureCollection(db, coll)\n await db.command({\n collMod: coll,\n changeStreamPreAndPostImages: { enabled: true },\n })\n\n await createIndex(\n collection,\n { touchedAt: 1 },\n {\n partialFilterExpression: { deletedAt: { $eq: null } },\n name: 'touchedAt_' + new (driver().UUID)().toString('base64'),\n },\n )\n\n log('stream started', { streamName, data })\n const ts = await Promise.all([\n last.findOne({ _id: streamName, data }),\n last.findOne({ _id: streamName }),\n ])\n log('got last update', { streamName, ts })\n return next(step2_5(ts), 'handle teardown')\n }\n const step2_5 =\n ([same, exists]: [Last | null, Last | null]) =>\n async (): Next => {\n const handleTeardown = async <W extends Document, M extends keyof Actions<unknown>>(\n last: Last,\n ) => {\n if (!last.data) return\n const { collection: c, method: m, params: p } = last.data.teardown\n const { collection, method, params } = {\n collection: db.collection<W>(c),\n method: m as M,\n params: p as TeardownRecord<W, M>['params'],\n }\n const [action, out] = actions[method](collection, params)\n log('teardown', ...out)\n await action\n log('teardown done', ...out)\n }\n if (exists && !same) await handleTeardown(exists)\n return {\n cont: withStop(async () => {\n await new Promise(resolve => setTimeout(resolve, 1000))\n return next(step4(same), 'clone into new collection')\n }),\n data: [],\n info: { debug: 'wait for clone into new collection', job: undefined },\n }\n }\n\n type C = WatchStream<{}>\n // Step 4 : run the aggregation // idempotent\n const makeStream = (): Promise<C> => makeWatchStream(view, streamName)\n const step4 = (lastTS: { _id: string; ts: Timestamp } | null) => async (): Next => {\n const raw = stages(lastTS).with(finalInput.raw(lastTS === null)).stages\n const stream = await makeStream()\n // const currTime = await getCurrentTimestamp(db)\n const nextRes = stream.tryNext()\n const aggResult = await aggregate<Result2>(db, streamName, c =>\n c<V | Del, V | Del>({\n coll: collection,\n input: raw,\n }),\n )\n\n return next(\n step7({ aggResult, ts: aggResult.cursor.atClusterTime, stream, nextRes }),\n 'update __last',\n () => stream.close(),\n )\n }\n\n type L = {\n aggResult: AggregateCommand<Result2>\n ts: Timestamp\n stream: C\n nextRes: Promise<{} | null>\n }\n\n // Step 7 : update __last\n const step7 = (l: L) => async (): Next => {\n await last.updateOne({ _id: streamName }, { $set: { ts: l.ts, data } }, { upsert: true })\n return step8(l)\n }\n // Step 8 : wait for change\n const step8 = (l: L): FrameD => {\n return {\n data: l.aggResult.cursor.firstBatch,\n info: { job: undefined, debug: 'wait for change' },\n cont: withStop(() =>\n l.nextRes.then(doc =>\n doc\n ? next(step4({ _id: streamName, ts: l.ts }), 'restart')\n : step8({ ...l, nextRes: l.stream.tryNext() }),\n ),\n ),\n }\n }\n return stop\n }\n return {\n out: run,\n }\n}\ninterface StreamRunnerHKT extends HKT<O2> {\n readonly out: SimpleStreamExecutionResult<I<O2, this>[0], I<O2, this>[1]>\n}\ninterface StagesHKT extends HKT<O3> {\n readonly out: RORec<'lin', RawStages<I<O3, this>[0], I<O3, this>[1], I<O3, this>[2], unknown, 1>>\n}\n\nconst emptyLin = <V>() => ({ lin: link<V, unknown, 1>().stages })\nexport const from = <V extends Model, KK extends StrKey<V>>(\n view: View<V, Allowed<KK>>,\n streamName: string,\n needs: Partial<Record<KK, 0 | 1>> = {},\n) =>\n pipe<AllowedPick<V, KK>, AllowedPick<V, KK>, AllowedPick<V, KK>, StreamRunnerHKT, StagesHKT>(\n input => executes(view, input.lin, streamName, needs),\n { lin: link<AllowedPick<V, KK>, unknown, 1>().stages },\n ({ lin: a }, { lin: b }) => ({ lin: concatStages(a, b) }),\n emptyLin,\n )\n","import type { O, O2, StrKey, View } from '../../types'\nimport type { HKT, I, IdHKT } from '../../types/hkt'\nimport { concatDelta, emptyDelta, link, pipe, type DeltaPipe } from '../aggregate/prefix'\nimport { root } from '../field'\nimport type { Del, DeltaStages, Model, RawStages, Stages } from '../types/stream'\nimport type { DeltaHKT } from './boot'\nimport type { Allowed, AllowedPick } from './boot-utils'\nimport { getFirstStages } from './first-stages'\n\nexport type SingleResult<out Result> = <Result2>(\n finalInput: RawStages<unknown, Result, Result2>,\n) => Stages<unknown, Result2, unknown>\n\nexport interface SnapshotStreamHKT2 extends HKT<O2> {\n readonly out: SingleResult<I<O2, this>[1]>\n}\n\nconst executes = <\n q extends O,\n V extends Model,\n KK extends StrKey<V>,\n Result extends q | AllowedPick<V, KK>,\n>(\n view: View<V, Allowed<KK>>,\n input: DeltaStages<q | AllowedPick<V, KK>, AllowedPick<V, KK>, Result>,\n needs: Partial<Record<KK, 0 | 1>>,\n): SingleResult<Result> => {\n type T = AllowedPick<V, KK>\n const { firstStages } = getFirstStages(view, needs)\n const { collection } = view\n return <Result2>(\n finalInput: RawStages<unknown, Result, Result2>,\n ): Stages<unknown, Result2, unknown> => {\n const start: RawStages<O, T, Result> = input.raw<IdHKT<O>>(root)\n const stages = firstStages(null, true).with(start).with(finalInput).stages\n return c =>\n c<Del | V, Del | V>({\n coll: collection,\n input: link<V | Del>().stages,\n exec: stages,\n })\n }\n}\n\nexport const single = <V extends Model, KK extends StrKey<V>>(\n view: View<V, Allowed<KK>>,\n needs: Partial<Record<KK, 0 | 1>> = {},\n): DeltaPipe<AllowedPick<V, KK>, AllowedPick<V, KK>, SnapshotStreamHKT2, DeltaHKT> =>\n pipe<AllowedPick<V, KK>, AllowedPick<V, KK>, AllowedPick<V, KK>, SnapshotStreamHKT2, DeltaHKT>(\n input => executes(view, input, needs),\n emptyDelta(),\n concatDelta,\n emptyDelta,\n )\n"]}
1
+ {"version":3,"file":"index.esm.js","mappings":";;;;AAGA,MAAa,aAA0B,SAAkB,EAAE,WAAW,IAAG;AACzE,MAAa,UAAiC,MAC5C;AAEF,MAAa,cAAqC,MAChD;;;ACJF,MAAa,OAAa,GAAG,SAC3B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AACH,MAAa,OAAa,GAAG,SAC3B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AAEH,MAAa,MAGF,GAAG,SACZ,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC3D;AACH,MAAa,MAGF,GAAG,SACZ,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC3D;AAEH,MAAa,OAGF,GAAG,SACZ,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AACH,MAAa,OAGF,GAAG,SACZ,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AASH,SAAgB,SAAe,GAAG,MAAwC;CACxE,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,WAAW,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACjE;AACH;AAKA,SAAgB,IAAU,GAAG,MAAwC;CACnE,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AACH;AAKA,SAAgB,OAAa,GAAG,MAAwC;CACtE,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,SAAS,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC/D;AACH;AAMA,SAAgB,SAAe,GAAG,MAAwC;CACxE,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,WAAW,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACjE;AACH;AAIA,SAAgB,MAAY,MAAqB;CAC/C,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAClD;AACH;AAIA,SAAgB,KAAW,MAAqB;CAC9C,OAAO,OAAkB,EACvB,MAAK,MAAK,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACjD;AACH;;;AChGA,MAAa,mBAAqB;CAChC,QAAW,MAAa;AAC1B;AACA,MAAaA,QAAS,MAAS;AAC/B,MAAa,WAAc,MAAoC,KAAK;AAEpE,MAAa,aAAY,CAAE;AAM3B,MAAa,QAA8B,GAAiB,OAAU;CACpE,MAAM,KAAQ;CACd,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,EAAC;AACxB;;;ACgBA,MAAa,qBACX,GACA,MACsB;CACtB,MAAM,UAAuD,MAC3D,EAAE,QAAQ,MAAqB,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE;CACjD,MAAM,UAAU,OAAyC,OAAO,QAAQ,CAAC,CAAC;CAC1E,OAAO,OAAO,YACZ,QAAQ,KAAkD,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAEzF;AAEA,MAAa,qBACX,GACA,MAC2B,kBAAkC,GAAG,CAAC;AAMnE,MAAa,aACX,GACA,MACe,kBAAgD,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE1F,MAAa,aACX,GACA,MACe,kBAAwC,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAElF,MAAa,oBACX,GACA,MACqB,kBAAyC,GAAG,CAAC;AAMpE,MAAa,YACX,GACA,MACgB,iBAAsC,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAGjF,MAAa,UACX,GACA,OACI;CAAE,GAAG;CAAG,GAAG,SAAS,GAAGA,IAAE;AAAC;AAShC,MAAa,WAQX,GACA,OAEC;CAAE,GAAG;CAAG,GAAG,UAAU,GAAGA,IAAE;AAAC;;;AC/F9B,MAAa,OAA0B,QACrC,OAAO,EACL,WACE,UACG,OAAO,OAAO,QAAQ,YAAY,EAAE,eAAe,SACjD,OAAO,QAAQ,YAAY,IAAI,OAAO,MACrC,EAAE,UAAU,IAAG,IACf,GAAG,GAEZ;AAEH,MAAa,UAAoC,OAAO,EACtD,WAAW,UAAuC,gBAAgB,GACnE;AACD,MAAa,QACX,MACA,WAEA,OAAgB,EACd,MAAK,MACH,UAAU,EACR,MAAM;CACJ,MAAM,iBAAsD,OAAM,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE;CACrF,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;GAExB,GACJ;AAEH,MAAa,MAAM,IAAI,IAAI;AAE3B,MAAa,aAMgC,MAAyB,UACpE,OAA0B,EACxB,MAAK,MACH,UAAU,EACR,WAAW;CACF;CACP,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;GAEzB,GACJ;AAIH,MAAa,QACX,GACA,GAAG,SAEH,OAAsB,EACpB,MAAK,UACH,UAAU,EACR,WAAW;CACT,MAAM,EAAE,SAAQ;CAChB,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,KAAK,CAAC,CAAC,IAAG,CAAE;CACtC,MAAM;GAET,GACJ;AAEH,MAAa,OAAO;CAClB,MAAM,IAAI;CACV,OAAO,MAAM,EAAE,CAAC,CACb,KAAK,CAAC,CAAC,CACP,UAAU,EAAE,KAAK,MAAM,KAAK,OAAM,IAAK,EAAE,EAAE,CAAC,CAC5C,KAAK,EAAE;AACZ;AACA,MAAa,QAAQ,KAAK,IAAI;;;ACvE9B,MAAa,QACX,MACA,MACA,WAEA,OAAsB,EACpB,MAA0C,MACxC,UAA8B,EAC5B,OAAO;CACL,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACnB,MAAM,KAAK,IAAI,CAAsB,CAAC,CAAC,IAAG;CAC1C,MAAM,OAAO,IAAI,CAAsB,CAAC,CAAC,IAAG;GAE/C,GACJ;AAaH,MAAa,OAAuB,GAAG,SACrC,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC5D;AAEH,MAAa,MAAsB,GAAG,SACpC,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC3D;AAEH,MAAa,OAAuB,SAClC,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAChD;AAEH,MAAa,MACS,OACnB,MACC,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC9D;AAEL,MAAa,OAA+B,GAAoB,MAC9D,OAAkB,EAChB,MAA0D,MACxD,UAAkC,EAAE,IAAI,EAAE,KAAsB,CAAC,CAAC,CAAC,CAAC,IAAG,CAAE,GAC5E;AAEH,MAAa,WAOX,GACA,MAEA,WAAW,EACT,MAAwB,MACtB,UAA4B,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACxE;AAEH,MAAa,MACS,OAChB,MACF,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC9D;AAEL,MAAa,WAAoB,MAAqB,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG;AAE7E,MAAa,WAOC,GAAG,SACf,OAAgB,EACd,MAAK,MAAK,UAAU,EAAE,SAAS,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC/D;AAEH,MAAa,cACX,MACA,KACA,OAEA,OAA6B,EAC3B,MAAK,MACH,UAAU,EACR,SAAS;CACP,UAAU,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,OACrC,WAAU,CAAU,CAAC;EACnB,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,EAAE,UAAU,EAAC,CAAE,EAAC;EACjD,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG;EACnB,CAAC;CAEJ,GAAI,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE;GAEvC,GACJ;AAEH,MAAa,UACX,MACA,KACA,OAEA,WACE,MACA,OAAO,YACL,OAAO,QAAQ,GAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAEhE,IAAI,EAAE,CAAC;AAGX,MAAa,YAA0C,EACrD,OACA,OACA,YAMA,OAA+B,EAC7B,MAAK,MACH,UAAU,EACR,WAAW;CACT,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;GAE1B,GACJ;;;AC7IH,IAAa,QAAb,MAAa,MAAK;CAON;CACA;CACA;CANV,IAA6C,GAAwB;EACnE,OAAO,EAAE,MAAK,OAAM,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,IAAG,IAAK,EAAE,IAAG,GAAG;CACtD;CACA,YACU,OACA,KACA,QAAc;eAFd;aACA;gBACA;CACP;CACH,OAAO,aAAyB;EAC9B,MAAM,UAAkB,IAAI,OAC1B,IAAI,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,OAAOA,IAAE,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM;EACxE,OAAO,IAAI,MAAY,KAAI,MAAM,IAAI,IAAI,MAAM,UAAW,MAAM;CAClE;CACA,OAAO,aAEc,MAAQ;EACzB,MAAM,UAAkB,GAAG,OAAO,IAAI,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM;EACvE,OAAO,IAAI,MAA+B,IAAG,MAAK,KAAK,KAAK,MAAM;CACpE;CAeK,GAAwB,GAAI;EACjC,OAAO,IAAI,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAOA,IAAE,CAAC,CAAC,KAAK,GAAG,GAAG,KAAK,KAAK,KAAK,MAAM;CAC9E;CAkBO,KAAQ,GAAoB;EACjC,OAAO,EAAE,OAAyB,MAA2B,CAAC;CAChE;CAEA,MAAG;EACD,OAAO,KAAK;CACd;CACQ,UAAO;EACb,OAAO,UAAU,KAAK,IAAI,KAAK,KAAK,CAAC;CACvC;CAEA,OAAI;EACF,OAAO,OAAkB,EACvB,MACE,MACoC,EAAE,KAAsB,IAAI,CAAC,CAAC,QAAO,GAC5E;CACH;;AAGF,MAAa,EAAE,MAAM,QAAQ;;;ACxE7B,MAAM,iBAAoC,MAAc;AAExD,MAAM,SACJ,UAC+B,EAAE,MAAK,MAAK,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,EAAC;AACvF,MAAa,QACX,UACoC;CACpC,OAAO,MACL,IACE,KAAI,CAAW,CAAC,GAAG,SAAS,CAAC,CAAC,KAAI,GAClC,IAAI,CAAC,GACL,IACE,KAAI,CAAW,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,GAC9B,SAAS,IAAI,CAAC,GAAG,QAAQ,IAAI,MAAM,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GACpE,IAAI,MAAM,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CACnC,CACF;CAEH,QAAQ,GAAG,MAAM,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;;AAG5C,MAAM,iBACJ,MACA,gBACA,YACA,UACgC;CAChC,OAAO,EACL,MAAK,MACH,cAAc,EACZ,cAAc;EACZ,MAAM,KAAK,SAAQ;EACnB,UAAU;EACV,YAAY,WAAW,SAAQ;EAC/B,gBAAgB,eAAe,KAAqD,MAClF,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE;EAEhB,OAAO,MAAM,SAAQ;EACrB,MAAM;IAET;AAEP;AAEA,MAAa,gBACX,MACA,gBACA,YACA,WACuC;CACvC,OAAO,cAAc,MAAM,gBAAgB,YAAY,KAAK;CAC5D,QAAc,GAA4B,MACxC,KAA0B,OAAO,GAAG,CAAC;;AAGzC,MAAa,cACX,SAEA,aACE;CACE,OAAO;AACT,GACA;CACE,IAAI,MAAM,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC;CACjC,KAAI,CAAW,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CAC9B,KAAI,CAAW,CAAC,GAAG,SAAS,CAAC,CAAC,KAAI;GAEpC,SAAU,GAAG,GAAG,KAAK,SAAO;CAC1B,IAAI,SAAS,OAAO;CACpB,IAAI,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK;CAClC,OAAO,IAAK,EAAE,KAAK,IAAK,OAAO,EAAE,IAAI;AACvC,GACA,SAAU,GAAG,GAAC;CACZ,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,QAA0B,GAAG,MAAK;EACtD,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE;EACxB,OAAO,IAAK,EAAE,KAAK,IAAK,OAAO,EAAE,IAAI;CACvC,GAAG,KAAK,EAAE;AACZ,CAAC;AAEL,MAAa,mBACX,SAEA,aACE;CACE,OAAO;AACT,GACA;CACE,IAAI,MAAM,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC;CACjC,KAAI,CAAW,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CAC9B,KAAI,CAAW,CAAC,GAAG,SAAS,CAAC,CAAC,KAAI;GAEpC,SAAU,GAAG,MAAM,KAAK,SAAO;CAC7B,IAAI,SAAS,OAAO;CACpB,KAAK,SAAQ,MAAI;EACf,MAAM,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK;EACpC,IAAI,GAAG,EAAE,KAAK;OACT,OAAO,EAAE;CAChB,CAAC;CACD,OAAO;AACT,GACA,SAAU,GAAG,GAAC;CACZ,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,QAA0B,GAAG,MAAK;EACtD,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE;EACxB,OAAO,IAAK,EAAE,KAAK,IAAK,OAAO,EAAE,IAAI;CACvC,GAAG,KAAK,EAAE;AACZ,CAAC;AAEL,MAAa,aACX,KACA,UAGA,aACE;CACE,OAAO;AACT,GACA;CACE,IAAI,KAAK,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC;CAChC,IAAI,OAAO,KAAI,CAAW,CAAC,GAAG,GAAG,CAAC;CAClC,KAAI,CAAW,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CAC9B,KAAI,CAAW,CAAC,GAAG,SAAS,CAAC,CAAC,KAAI;GAEpC,SAAU,IAAI,GAAG,GAAG,KAAK,SAAO;CAC9B,IAAI,SAAS,OAAO;CACpB,IAAI,IAAiC,EAAE,GAAG,GAAE;CAE5C,MAAM,SAAS,GAAG,MAAK;EACrB,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,MAAM;EAC3B,IAAI,aAAa,MAAM,OAAO,aAAa,QAAQ,EAAE,QAAO,MAAO,EAAE,QAAO;EAC5E,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAK,MAAK,OAAO,eAAe,CAAC,KAAK,OAAO,SAAS,GAAG,OAAO,EAAE,QAAO,MAAO,EAAE,QAAO;EACpG,MAAM,OAAO,OAAO,KAAK,CAAC;EAE1B,OAAO,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,OAAM,MAAK,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;CACnF;CACA,MAAM,QAAS,EAAE,OAAO;EAAE,GAAG;EAAI,GAAG;CAAE,GACpC,OAAO,MAAM,MAAM,IAAI,IACvB,MAAM,MAAM,MAAM,IAAI,IACtB,MAAM,IAAI,WAAU,MAAK,MAAM,GAAG,CAAC,CAAC;CACtC,IAAI,QAAQ,IAAI,IAAI,OAAO,KAAK,CAAC;MAC5B,KAAK,KAAK,CAAC;CAChB,OAAO;AACT,GACA,SAAU,KAAsB,GAAc;CAC5C,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,QAAqB,GAAG,MAAK;EACjD,OAAO,OAAO,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAE,CAAC,CAAC,QAChC,GAAG,CAAC,GAAG,OACN,EAAG,QAAqB,GAAG,MAAK;GAE9B,MAAM,SAAS,GAAG,MAAK;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAK,MAAK,CAAC,KAAK,OAAO,KAAK,QAAQ,GAAG,OAAO,MAAM;IAC/D,MAAM,OAAO,OAAO,KAAK,CAAC;IAE1B,OAAO,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,OAAM,MAAK,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;GACnF;GACA,MAAM,QAAS,EAAE,OAAO;IAAE,GAAG;IAAI,GAAG;GAAE,GACpC,OAAO,MAAM,IACb,MAAM,MAAM,CAAC,IAAI,IAAI,IACrB,MAAM,IAAI,WAAU,MAAK,MAAM,GAAG,CAAC,CAAC;GACtC,IAAI,QAAQ,IAAI,IAAI,OAAO,KAAK,CAAC;QAC5B,KAAK,KAAK,CAAC;GAChB,OAAO;EACT,GAAG,CAAC,GACN,CAAC;CAEL,GAAG,OAAO,EAAE;AACd,CAAC;AAGL,MAAa,SACX,SAEA,KAAoC,SAAU,KAAG;CAC/C,OAAO,OAAO,KAAK,GAAG;AACxB,GAAG,IAAI;AAET,MAAa,YACX,SAEA,KAAiD,SAAU,KAAG;CAC5D,OAAO,OAAO,QAAQ,EAAE,GAAG,IAAG,CAAE,CAAC,CAAC,SAAS,CAAC,GAAG,OAAQ,EAAmB,EAAE,CAAC,KAAI,OAAM;EAAE;EAAG;CAAC,EAAG,CAAC;AACnG,GAAG,IAAI;;;AC5LT,MAAa,YACX,MAC6B;AAc/B,MAAa,gBACX,OACA,UAC6B,SAAS,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;AAU5D,MAAa,eACX,OACA,WAC0B;CAC1B,OAAO,aAAa,MAAM,OAAO,MAAM,KAAK;CAC5C,MAAK,MAAK,aAAa,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;;AAmBnD,MAAa,QACX,QACA,GACA,QAIA,UACE;CAeF,OAAO;EAbL,OACE,QAEA,KACE,KAAI,MAAK,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,GAC7B,MAAK,GACL,QACA,KAAK;EAET,OAAmC,SACjC,KAAyB,QAAQ,OAAO,GAAG,IAAI,GAAG,QAAQ,KAAK;EACjE,WAAW,OAAO,CAAC;CAEd;AACT;AACA,MAAMC,YACJ,YAC2B;CAC3B,OAAM,UAASA,SAAO,aAAa,QAAQ,KAAK,CAAC;CACjD;;AAYF,MAAa,cAAoB;CAC/B,OAAM,UAASA,SAAO,KAAK;CAC3B,QAAQ,SAAS,EAAE;;AAQrB,MAAa,oBAAiC;CAC5C,OAAO,KAAI,CAAY,CAAC;CACxB,WAA6B,KAAI,CAAa,CAAC;;AAGjD,MAAa,iBACX,EAAE,MAAM,MAAM,SACd,YACyB;CAAE;CAAM;CAAO,MAAM,aAAa,MAAM,MAAM;AAAC;;;ACtF1E,MAAa,UAGF,GAAG,SACZ,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,SAAS,KAAK,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GAC/D;AAEH,MAAa,WACX,MACA,OACA,WAEA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,WAAW;CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;AAAE,GACvE,GACJ;AACH,MAAa,WAAiB,MAA0B,QACtD,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,MAAM;CACJ,MAAM,EACJ,GAAG,EACD,SAAS,CAAC,EAAE,UAAU,IAAG,GAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE;CAGlD,IAAI,EAAE,WAAW;EAAC;EAAO,EAAE,WAAW,CAAC,EAAE,WAAW,MAAK,GAAI,IAAI,MAAM,EAAC;EAAI,IAAI;CAAM,EAAC;GAE1F,GACJ;AACH,MAAa,SACX,MACA,OACA,YAEA,OAAsB,EACpB,MAAK,MACH,UAAU,EACR,aAAa;CACX,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACtB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB,SAAS,SAAS,IAAI,CAAC,CAAC,CAAC,IAAG;GAE/B,GACJ;AACH,MAAa,OAAa,SACxB,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACrD;AACH,MAAa,SAAe,SAC1B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAClD;AAEH,MAAa,UAQX,MACA,MAEA,OAAkD,EAChD,MAA0C,MACxC,UACE,OAAO,YACL,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAwB,CAAC,KAAK,SAC9C,KAAK,OAAO,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,CAAC,IAAI,EAAE,CACjD,CACF,GAEN;AASH,MAAa,cACX,GAAG,CAAC,aAAa,iBAEjB,OAAoC,aAAa,WAAW;AAQ9D,MAAa,eAOX,GAAG,CAAC,aAAa,iBAId,QAAuC,aAAa,WAAW;AAEpE,MAAa,aACX,GAAG,UAEH,WAA0C,GAAG,KAAK;AAYpD,MAAa,gBAEwB,UACjC,OAAO,KAAK,KAAK,CAAC,CAAC,SACf,OAAkD,EAChD,MAAK,MACH,UACE,iBAAsD,QAAO,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,CAAC,GAEtF,IACD,OACE,IAAI,WAAU,CAAU,CAAC,EAAE,CAAC,CAAC;AAEvC,MAAa,QAEW,OAAM;;;AClK9B,MAAa,QAAiB,SAC5B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACjD;AAEH,MAAa,iBAAoC,SAC/C,OAAO;CACL;CACA,IAAI;CACJ,MAAM,IAAG,CAAE,CAAC,GAAG,CAAC,CAAC,KAAI;CACtB;AAEH,MAAa,UAA+C,EAC1D,IACA,MACA,MACA,YAOA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,SAAS;CACP,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACtB;CACA,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACrB,GAAI,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,IAAK;GAE/C,GACJ;AACH,MAAa,aAAyC,EACpD,QACA,MACA,YAMA,OAAqB,EACnB,MAAK,MACH,UAAU,EAAE,YAAY;CAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ,GAAG,SAAS,SAAS,GAAE;AAAE,EAAE,CAAE,GAC5F;AAEH,MAAa,WACX,SAEA,WAAiD,EAC/C,MAAK,MAAK,UAA6B,EAAE,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACvE;AAEH,MAAa,WAAoB,MAAqB,SACpD,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACpE;AAEH,MAAa,SAA4B,GAAG,UAC1C,OAAqB,EACnB,MAAK,MAAK,UAAU,MAAM,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,CAAC,GACnD;AAEH,MAAa,eAAwB,GAAG,UACtC,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe,MAAM,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACtE;AAEH,MAAa,SAAkB,SAC7B,OAAuB,EACrB,MAAK,MAAK,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAClD;AACH,MAAa,YAAY;AACzB,MAAa,QAAiB,SAC5B,OAAuB,EACrB,MAAK,MAAK,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACjD;AAIH,MAAa,gBACX,GAAG,UAEH,OAAuC,EACrC,MAAK,MAAK,UAAU,EAAE,eAAe,MAAM,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,EAAC,CAAE,GACtE;AAEH,MAAa,kBAAkC,SAC7C,OAAsB,EACpB,MAAK,MAAK,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAC3D;AAGH,MAAa,WACX,OACA,cACA,WAEA,OAAgB,EACd,MAAK,MACH,UAAU,EACR,SAAS;CACP,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB,cAAc,aAAa,IAAI,CAAC,CAAC,CAAC,IAAG;CACrC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;GAExB,GACJ;AAEH,MAAM,gBAAyB,OAA2B,SACxD,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG,GAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,GACtD,GACJ;AAEH,MAAa,SACX,OACA,OACA,QAEA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,QAAQ;CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAG;AAAE,GAClE,GACJ;AACH,MAAa,UAAmB,GAAuB,MAAyB;CAG9E,MAAM,QAAQ,IAAG,CAAc,CAAC,OAAO;CACvC,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,KAAI;CAChC,MAAM,SAAS,MAAM,GAAG,QAAQ,CAAC,CAAC,KAAI;CACtC,MAAM,OAAO,IAAG,CAAK,CAAC,MAAM,CAAC,CAAC,KAAI;CAClC,MAAM,gBAAgB,IAAG,CAAU,CAAC,eAAe,CAAC,CAAC,KAAI;CACzD,OAAO,KACL,EACE,KAAK,CACH,OACA,QACE,GACA,MAAM;EAAE,KAAK,CAAC,OAAO,MAAK,CAAQ;EAAG,QAAQ,CAAC,UAAU,CAAC;CAAC,CAAE,GAC5D,KACE,EACE,eAAe,CAAC,iBAAiB,aAAuB,QAAQ,IAAI,CAAC,KAEvE,IACE,IAAI,eAAe,IAAI,CAAC,CAAC,GACzB,MAAM;EACJ,KAAK,CAAC,OAAO,GAAG;EAChB,QAAQ,CACN,UACA,YACE,IACE,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,GACxB,MAAK,GACL,MAAgB,QAAQ,IAAI,CAAC,GAAG,aAAa,CAAC,GAEhD,MAAgB,QAAQ,IAAI,eAAe,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;EAGtE,GACD,MAAM;EACJ,KAAK,CAAC,OAAO,YAAyC,KAAK,MAAM,IAAI,CAAC,CAAC;EACvE,QAAQ,CAAC,UAAU,MAAM;EAC1B,CAAC,CACH,CACF,MAIP,IAAG,CAAc,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE;AAE7C;;;AC3JA,MAAa,WACgB,WAC3B,MACE,SAAS,QAAQ,CAAC,EAAE,QAAQ,MAAM,IAAI,EAAC,CAAK,EAAC,CAAE,IAAI,EAAE;AAEzD,MAAa,SAET,aAEF,MACE,SAAS,CACP,EACE,MAAM,OAAO,YACX,QAAQ,IAAI,EAAC,CAAK,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAClC,EAAC,CAAK,CACH,GAAG,EAAE,MAAM,CAAC,CAAY,CAAC,CACzB,IAAG,GACN,EACD,CAAC,IAGP;AAEL,MAAa,aACX,eAEA,SAAS,CACP,EACE,UAAU,iBAAkD,kBAAkB,CAAC,IAElF;AAEH,MAAa,iBAC6B,UACxC,MAAI;CACF,MAAM,QAAQ,EAAC,CAAK,CAAC,IAAG,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC,OAAOD,IAAE;CAC/C,OAAO,SAAS,CACd,EAAE,cAAc,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,EAAC,IAAK,KAAK,IAAI,EAAC,CAAK,CAAC,CAAC,IAAG,CAAE,EAAC,EAC7E;AACH;AAEF,MAAa,YAET,GACA,iBAEF,MAAI;CACF,MAAM,OAAO,IAAI,EAAC,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAG;CAC9C,OAAO,SAAS,CACd,EAAE,SAAS,gBAAgB,OAAO;EAAE;EAAM,4BAA4B;CAAI,IAAK,KAAI,EACpF;AACH;AAEF,MAAa,WACuB,IAAoB,UAEpD,MAEA,SAAS,CACP,EACE,QAAQ;CACN,KAAK,GAAG,IAAI,EAAC,CAAE,CAAC,CAAC,IAAG;CACpB,GAAG,iBAA4D,OAAM,MAAK,EAAE,IAAI,EAAC,CAAK,CAAC;IAG5F;AASL,MAAa,WACX,MACA,MACG,iBAAwD,OAAM,MAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE;AAEtF,MAAa,kBAET,UAEF,MAAI;CACF,MAAM,EAAE,MAAM,GAAG,MAAM,QAAQ,GAAG,QAAQ;CAC1C,MAAM,UAAU,QAAQ,MAAM,EAAC,CAAK;CACpC,OAAO,SAAS,CACd,EACE,SAAS;EACP,GAAI,QAAQ,EAAE,MAAM,KAAK,eAAc;EACvC,GAAI,UAAU;GACZ,YAAY,EAAC,CAAK,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC,IAAG;GACzC,cAAc,KAAI,CAAS,CAAC,KAAK,OAAO,OAAO,CAAC,CAAC,IAAG;;EAEtD,IAAI,EAAC,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAG;EACjC,GAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,QAAO;EACrD,GAAG;KAGR;AACH;;;AChHF,MAAa,WACX,UAC6B,QAAQ,KAAK,CAAC,CAAW,IAAI;AAE5D,MAAa,SACX,YACgC,MAAkB,OAAO,CAAC,CAAW,IAAI;AAE3E,MAAa,iBACX,SAC6B,cAAc,IAAI,CAAC,CAAW,IAAI;AAEjE,MAAa,YACX,GACA,gBAEA,SAAwB,GAAG,WAAW,CAAC,CAAW,IAAI;AAExD,MAAa,iBAGT,IACA,SAEA,QAAqB,IAAI,IAAI,CAAC,CAAW,IAAI;AAKjD,MAAa,YAAY;AAEzB,MAAa,kBASX,SACiD,eAAe,IAAI,CAAC,CAAW,IAAI;;;AC7CtF,MAAa,YACX,IACA,MACA,WACmD;CASnD,MAAM,OAAO,cACX,MACE,IACE,QAAkD,KAAI,CAAY,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,GAAI,GAAG,GAC1F,KACA,MAAuB;EACrB,GAAG,CAAC,KAAK,KAAI,CAAa,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,CAAE;EAC7C,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;EACvB,SAAS,CACP,WACA,KAAI,CAAa,CACd,GAA6B,SAAS,CAAC,CACvC,GAAgC,OAAO,CAAC,CACxC,KAAI;EAEV,CAAC,GAEJ,IACE,QACE,KAAI,CAAmC,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,GACzD,GAAG,GAEL,KACA,MAAwB;EACtB,GAAG,CAAC,KAAK,KAAI,CAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,CAAE;EAC/C,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;EACtB,SAAS,CACP,WACA,KAAI,CAAc,CACf,GAA6B,SAAS,CAAC,CACvC,GAAiC,QAAQ,CAAC,CAC1C,KAAI;EAEV,CAAC,CACH,CACF;CAGH,MAAM,eAAyC,SAAqB,cAAc,IAAI;CAEtF,OAAO,KAAI,CAAqB,CAC7B,KACC,cACE,MAAM,EACJ,MAAM,CAAC,QAAQ,IAAI,GACpB,CAAC,CACH,CACF,CACA,KAAiC,SAA0B,MAAM,CAAC,CAAC,CACnE,KAAoB,cAAc,KAAI,CAAqB,CAAC,GAAG,MAAM,CAAC,CAAC,KAAI,CAAE,CAAC,CAAC,CAC/E,KACC,QAAO,CAAK,CACV,IAAI,IAAI,KAAI,CAAQ,CAAC,GAAG,GAAG,CAAC,GAC5B,SAA0D,OAAM,MAAK,EAAE,KAAK,CAAC,CAC9E,CACF,CACA,KACC,YACE,MACE,OACE,SAAwD,OAAO,GAAG,MAChE,UAAU,KAAI,CAAW,CAAC,KAAI,GAAI,CAAC,CAAC,CACrC,CACF,CACF,CACF,CACF,CAAC;AACN;;;AC1FA,MAAa,mBAAyB,SACpC,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe;CAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ;AAAO,EAAE,CAAE,GACpF;AACH,MAAa,YACX,OAAmB,EACjB,MAAK,MAAK,UAAU,OAAO,GAC5B;AACH,MAAa,aAAmB,SAC9B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe;CAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ;AAAO,EAAE,CAAE,GACpF;AACH,MAAa,YAAkB,SAC7B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe;CAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ;AAAO,EAAE,CAAE,GACpF;AACH,MAAa,QAAc,SACzB,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GACjD;AACH,MAAa,WACX,MACA,QACA,SAEA,OAAmB,EACjB,MAAK,MACH,UAAU,EACR,UAAU;CACR,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAC1B,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACrB,QAAQ,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;GAE5B,GACJ;AAEH,MAAa,WAAiB,SAC5B,OAAmB,EACjB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAChD;AAEH,MAAa,WAAiB,SAC5B,OAAmB,EACjB,MAAK,MAAK,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE,GAChD;AACH,MAAa,YAAkB,SAC7B,OAAqB,EACnB,MAAK,MAAK,UAAU,EAAE,eAAe;CAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,QAAQ;AAAU,EAAE,CAAE,GACvF;AACH,MAAa,WACX,WACA,MACA,WAEA,OAAmB,EACjB,MAAK,MACH,UAAU,EACR,MAAM;CACJ,MAAM;EAAE,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,IAAG;EAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;EAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,IAAG;CAAE;CAC/E,IAAI,EACF,SAAS;EACP,UAAU;GACR;IACE,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAC;IAC5B,MAAM,EACJ,gBAAgB;KACd,aAAa,EAAE,cAAc,MAAK;KAClC,SAAS,EACP,MAAM,CACJ,EAAE,UAAU,MAAK,GACjB,EACE,OAAO;MACL,IAAI,EACF,KAAK,CAAC,OAAO,EAAE,eAAe,MAAK,CAAE;MAEvC,MAAM;MACN,MAAM;;KAKd,cAAc;;;GAIpB;IACE,MAAM,EAAE,KAAK,CAAC,OAAO,OAAO,EAAC;IAC7B,MAAM,EACJ,gBAAgB;KACd,MAAM,EAAE,OAAO,MAAK;KACpB,OAAO,EACL,MAAM,CACJ,EAAE,QAAQ,MAAK,GACf,EACE,OAAO;MACL,IAAI,EACF,KAAK,CAAC,OAAO,EAAE,aAAa,MAAK,CAAE;MAErC,MAAM;MACN,MAAM;;KAKd,KAAK;;;GAIX;IACE,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAC;IAC5B,MAAM,EACJ,gBAAgB;KACd,MAAM,EACJ,MAAM,CACJ,EAAE,OAAO,MAAK,GACd,EACE,OAAO;MACL,IAAI,EACF,KAAK,CACH,EACE,KAAK,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,EAAC,EAAE,GAAI,EAAE,QAAQ,MAAK,CAAE,KAEhE,EACE,MAAM,CACJ,EACE,KAAK,CACH,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,EAAC,EAAE,GACnC,EAAE,QAAQ,MAAK,MAGnB,EACE,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,EAAC,GAAI,EAAE,aAAa,MAAK,CAAE;MAM9D,MAAM;MACN,MAAM;;KAKd,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,EAAC,EAAE;KAC1C,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,EAAC;;;;EAKjC,SAAS,EACP,gBAAgB;GACd,MAAM,EAAE,OAAO,MAAK;GACpB,OAAO,EAAE,QAAQ,MAAK;GACtB,KAAK,EAAE,MAAM,CAAC,EAAE,aAAa,MAAK,GAAI,KAAK,EAAC;;;GAMvD,GACJ;AAEH,MAAa,YAAkB,EAC7B,KACA,MACA,YAMA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,MAAM;CACJ,MAAM;EACJ,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;EAClB,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAG;EACnB,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;;CAEzB,IAAI,EACF,MAAM;EACJ,MAAM,EACJ,MAAM,EACJ,WAAW;GACT,WAAW;GACX,SAAS;GACT,MAAM;;EAIZ,IAAI,EACF,SAAS;GACP,UAAU;IACR;KACE,MAAM,EAAE,KAAK,CAAC,OAAO,OAAO,EAAC;KAC7B,MAAM,EACJ,OAAO;MACL,IAAI,EACF,MAAM,CAAC,EAAE,aAAa,UAAS,GAAI,EAAE,aAAa,QAAO,CAAE;MAE7D,MAAM;MACN,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,EAAC;;;IAItC;KACE,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAC;KAC5B,MAAM,EACJ,OAAO;MACL,IAAI,EACF,MAAM,CAAC,EAAE,eAAe,UAAS,GAAI,EAAE,eAAe,QAAO,CAAE;MAEjE,MAAM;MACN,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,EAAC;;;IAItC;KACE,MAAM,EAAE,KAAK,CAAC,OAAO,MAAM,EAAC;KAC5B,MAAM,EACJ,OAAO;MACL,IAAI,EACF,KAAK,CACH,EACE,KAAK,CAAC,EAAE,QAAQ,UAAS,GAAI,EAAE,QAAQ,QAAO,CAAE,KAElD,EACE,MAAM,CACJ,EACE,KAAK,CAAC,EAAE,QAAQ,UAAS,GAAI,EAAE,QAAQ,QAAO,CAAE,KAElD,EACE,MAAM,CAAC,EAAE,aAAa,UAAS,GAAI,EAAE,aAAa,QAAO,CAAE;MAMrE,MAAM;MACN,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,EAAC;;;;GAKxC,SAAS;;;GAMpB,GACJ;AAEH,MAAa,wBAA8B,EACzC,WACA,eAKA,OAAmB,EACjB,MAAK,MACH,UAAU,EACR,iBAAiB;CACf,YAAY,EACV,eAAe;EAAE,MAAM,UAAU,IAAI,CAAC,CAAC,CAAC,IAAG;EAAI,UAAU;CAAK;CAEhE,UAAU,SAAS,IAAI,CAAC,CAAC,CAAC,IAAG;GAEhC,GACJ;AAEH,MAAa,sBACX,MACA,aAEA,OAAmB,EACjB,MAAK,MACH,UAAU,EACR,iBAAiB,EACf,eAAe;CACb,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;CACrB,UAAU,SAAS,IAAI,CAAC,CAAC,CAAC,IAAG;KAGlC,GACJ;;;AC7RH,MAAa,SACX,OACA,KACA,SAEA,OAA0B,EACxB,MAAK,MACH,UAAU,EAAE,QAAQ;CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAG;CAAI,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG,KAAM;AAAC,EAAC,CAAE,GACxF;AAEH,MAAa,SAAuC,EAClD,IACA,MACA,YAMA,OAAqB,EACnB,MAAK,MACH,UAAU,EACR,MAAM;CACJ,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,IAAG;CACvB;CACA,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG;GAEtB,GACJ;AACH,MAAa,SACX,IACA,QACG,MAAM;CAAE,OAAO;CAAI,IAAI;CAAQ,MAAM,IAAI,IAAG,CAAK,CAAC,MAAM,CAAC;AAAC,CAAE;AACjE,MAAa,QACX,IACA,QACG,MAAM,KAAI,MAAK,IAAI,EAAE,KAAI,CAAE,CAAC;;;AC7BjC,MAAa,cACX,GACA,OAC2B,EAAE,MAAmB,MAAuB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAAC;AAgBzF,MAAM,UAEF,YAEY,MAAwE;CAEpF,OAAO,OAAO,QAAQ,kBAA+B,SAAQ,MAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,OACjF,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC;AAE9C;AAEF,MAAa,aAGT,YAE2D,EAC3D,KAAK,OAAO,MAAM;AAGtB,MAAa,aAA6B;CAGxC,QACE,YACmD,EACnD,KAAK,OAA2B,MAAM;AAE1C;AACA,MAAa,UACX,aAC2C,EAAE,MAAK,MAAK,QAAQ,IAAI,CAAC,EAAC;AAEvE,MAAa,MAAsC,UAA8C,EAC/F,MAAK,MAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,CAAE,CAAC;;;AC/DpC,MAAa,UAAU,MAAgE,WAAU,CAAU,CAAC;CAC1G,IAAI,EAAE;CACN,MAAM,EAAE;CACT;;;ACqCD,MAAa,WAA8E,EACzF,MACA,IACA,gBACA,GAAG,iBAEH,SAA4B,CAC1B,EACE,QAAQ;CACN,MAAM,OAAO,IAAI;CACjB,IAAI,GAAG,IAAG;CACV,GAAI,kBAAkB,EAAE,eAAc;CACtC,GAAI,WAAW,UAAU;EACvB,aAAa,WAAW;EACxB,GAAI,WAAW,WAAW,SAAS,EAAE,KAAK,QAAQ,WAAW,MAAM,KAAI,CAAK,EAAC;;IAIpF;AACH,MAAa,WACX,SACG,QAAyB,IAAI;;;ACNlC,MAAa,wBAKX,QACsE;CAEtE,MAAM,SAAyD,iBAI7D,MAAM,GAAG,MAAK;EACd,OAAO,GACL,KAAI,CAAgB,CACjB,GAAG,KAAK,CAAC,CACT,GAAG,CAAU,CAAC,CACd,KAAI,CAAiC,CACzC,CAAC,IAAI,CAAC,CAAC;CACV,CAAC;CACD,MAAM,SAAS,OAAO,OAAoC,MAAM;CAChE,OAAO,OAAO,SAAU,OAAO,WAAW,IAAI,OAAO,KAAM,IAAI,GAAG,MAAM,IAAK;AAC/E;AAEA,MAAa,0BAKX,gBACA,QACA,aAC2F;CAC3F,MAAM,UAAgB,MACpB,mBAAmB,YAAY,QAAQ,GAAG,GAAG,IAAI;CAUnD,MAAM,YAAY,QAJ8D,mBAChF,WACI,IAAG,CAAgB,CAAC,KAAK,IACzB,KAAI,GAC0B,GAAG,WAAW,CAAC,CAAC,KAAI,CAAE;CACxD,MAAM,SAAS,aACb,KAAI,CAAO,CAAC,KAAI,GAChB,OAAO,IAAG,CAAM,CAAC,KAAK,CAAC,CAAC,KAAI,GAAI,KAAI,CAAO,CAAC,KAAI,CAAE,GAClD,MAAsC,EACpC,WAAW,CAAC,aAAa,SAAS,GACnC,CAAC;CAEJ,OAAO,KAAI,CAAoB,CAC5B,KACC,cACE,MAAsC;EACpC,KAAK,CAAC,OAAO,KAAI,CAAO,CAAC,KAAI,CAAE;EAC/B,QAAQ,CAAC,UAAU,MAAM;EAC1B,CAAC,CACH,CACF,CACA,KAAK,eAAuB,gBAAgB,QAAQ,CAAC,CAAC,CAAC;AAC5D;AACA,MAAa,kBACX,gBACA,aACqF;CACrF,MAAM,UAAgB,MACpB,mBAAmB,YAAY,QAAQ,GAAG,GAAG,IAAI;CAInD,MAAM,cAAgD,aAKpD,KAAI,CAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,GACnC,MAAuC;EACrC,WAAW,CAAC,aAAa,OAAO,KAAI,CAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAI,CAAE,CAAC;EACtF,WAAW,CAAC,aAAa,KAAI,CAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAI,CAAE;EAClF,CAAC;CAGJ,MAAM,OAAO,GAA+B,WAAW,CAAC,CAAC,KAAI,CAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,CAAE;CACjG,MAAM,SAAS,WACX,IAAI,MAAM,GAAG,QAAQ,KAAI,CAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAI,CAAE,GAAG,QAAQ,CAAC,IACtF;CAEJ,OAAO,KAAI,CAAgB,CAAC,KAC1B,cACE,IAAI,QAAQ,KAAI,CAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,GAAI,KAAI,CAAgB,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE,CAAC,CAC7F,CACF,CAAC;AACJ;AAgBA,MAAM,WAQJ,KACA,MACA,GACA,KACA,KACA,WACoC;CAQpC,MAAM,QAA+C,SAInD,OAAsC,MAAuC;EAC7E,OAAO,QAA+C,IAAI,GAAG,CAAC,GAAG,GAAG;CACtE,CAAC;CAID,MAAM,SAEF,iBAAgD,MAAK,OAAM,EAAE,KAAK,EAAC,EAAG;CAC1E,MAAM,aAAa,qBAAgC,GAAG;CAEtD,MAAM,aAAa,IAAI,mBAAmB;CAE1C,MAAM,WAAmC,IACvC,MACE,OAAwE,OAAO;EAC7E,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE;EAC/B,WAAW,CAAC,aAAa,OAAO;EACjC,CAAC,CACH;CAGH,MAAM,MAAoC,aACtC,KAAI,CAAK,CACN,KACC,MACE,IAAG,CAAa,CAAC,EACf,WAAW,CAAC,aAAa,GAAiB,OAAO,CAAC,GACnD,CAAC,CACH,CACF,CACA,KACC,QAAkD;EAChD,MAAM,IAAI;EACV,IAAI,KAAI,CAAO,CAAC,GAAG,KAAK;EACxB,gBAAgB;EAChB,QAAQ;EACR,aAAa,uBACX,IAAI,gBACJ,QACA,UAAU;EAEb,CAAC,CACH,CAAC,SACJ,KAAI,CAAK,CAAC,KACR,QAA8B;EAC5B,MAAM,IAAI;EACV,IAAI,KAAI,CAAO,CAAC,GAAG,KAAK;EACxB,gBAAgB;EAChB,QAAQ;EACR,aAAa,uBACX,IAAI,gBACJ,QACA,UAAU;EAEb,CAAC,CACH,CAAC;CAEN,MAAM,YAAe,UAAmE;EACtF,YAAY;EACZ,QAAQ;EACR,QAAQ,CACN,QACA,CACE,EACE,QAAQ,OAAO,KACb,iBAA0D,YAAY,CAAC,CAAC;;CAMlF,OAAO;EACL,MAAM,UACJ,KAAI,CAAU,CAAC,KAAiB,cAAyB,QAAQ,CAAC,CAAC,CAAC,KAAqB,GAAG,CAAC,CAC1F;EACL,WAAU,MAAK,EAAE,SAAS,IAAI,IAAI,CAAC;;AAEvC;AAEA,MAAa,kBAQT,KACA,MACA,IACA,KACA,UAA8B,MAAK,MACmB;CAatD,OAAO,QACL,KACA,MACA,KAAI,CAAgB,CAAC,GAAG,OAAO,IAC/B,OAAK;EACH,OAAO,IACL,QACE,KAAI,CAAwB,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,GAC7C,GAAG,GAEL,MACE,OACE,SACE,YACM,GAAG,GAEX;GACE,KAAK,CAAC,OAAO,EAAE;GACf,WAAW,CAAC,aAAa,OAAO;GACjC,CACF,GAEH,EAAE;CAEN,GACA,KACA,MAAM;AAEV;AAEF,MAAa,0BAGT,KACA,MACA,KACA,UAA8B,MAAK,MAEnC,QAAqC,KAAK,MAAM,KAAI,GAAIA,MAAI,KAAK,MAAM;AAE3E,MAAa,sBAGT,KACA,MACA,iBAAqC,QACrC,UAA8B,MAAK,MAEnC,QAAoC;CAAE,MAAM;CAAK;AAAc,GAAI,MAAM,KAAI,GAAIA,MAAI,IAAI,MAAM;AAEnG,MAAa,oBAGT,KACA,MACA,KACA,UAA8B,MAAK,MACY;CAE/C,OAAO,SAAQ,CAAK,CAClB;EAAE,MAAM;EAAK,gBAAgB;CAAM,GACnC,MACAE,gBACE,KAAI,CAAO,CAAC,GAAqB,QAAQ,CAAC,CAAC,GAAkC,KAAK,CAAC,CAAC,KAAI,CAAE,GAE5F,KACA,MAAM;AAEV;AACF,MAAa,gBAGT,KACA,MACA,UAA8B,MAAK,MAEnC,WAAU,CAAK,CAAsB,KAAK,MAAM,IAAI,MAAM;AAE9D,MAAMA,mBAA0B,SAA4B;;;ACvQ5D,MAAa,YAQX,MACA,KACA,KAEA,OACA,UACA,UACiD;CAWjD,MAAM,IAAsC;CAE5C,MAAM,kBAAsE,UAI1E,OAAO,GAAG,MACV,GACE,QACI,IAAG,CAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI,IAC7B,EAAE,MACA,KAAI,CAAqB,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI,GAC9C,IAAG,CAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI,CAAE,CAChC,CACN;CAGH,MAAM,kBAA4E,MAMhF,IAAG,CAAkC,CAAC,EACpC,QAAQ,CAAC,UAAU,IAAG,CAAK,CAAC,eAAe,CAAC,GAC7C,CAAC;CAIJ,MAAM,UAA4B,KAAI,CAAS,CAAC,GAAG,GAAG,CAAC,CAAC,KAAI;CAW5D,MAAM,SACJ,GACA,MACyB,KAAK,GAAG,CAAC;CAEpC,MAAM,KAA4C;EAChD,KAAK,CAAC,OAAO,GAAG,WAAW,OAAO,IAAI,QAAQ,GAAG,KAAK,IAAI,KAAK,CAAC;EAChE,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC;;CAEtC,MAAM,KAA4D,MAIhE,KAAK,GAAG,OAAO,CAAC;CAClB,MAAM,aAA8C,QAMlD,UAAyE,OAAO,EAAE,GAClF,EAAE;CAQJ,MAAM,mBANkB,QAKtB,YAAY,EACW;CAEzB,MAAM,gBAAgE;EACpE,GAAG,UACD,GACA,EAAE;EAEJ,GAAI,IAAI,mBAAmB,WAAW,EAAE,WAAW,CAAC,aAAa,GAAG,GAAG,CAAC,EAAC,IAAK;EAC9E,WAAW,CAAC,aAAa,GAAG,OAAO,CAAC;;CAMtC,MAAM,UAAU,IAAG,CAAS,CAAoC,aAAa;CAc7E,MAAM,cAA2B,eAC/B,IAAI,gBACJ,IAAI;CAGN,MAAM,oBAAoB,KAAI,CAAY,CACvC,KACC,cACE,MAAM;EACJ,KAAK,CAAC,OAAO,KAAI,CAAO,CAAC,KAAI,CAAE;EAC/B,QAAQ,CAAC,UAAU,KAAI,CAAO,CAAC,KAAI,CAAE;EACtC,CAAC,CACH,CACF,CACA,KAAkC,eAAe,CAAC,CAClD,KACC,MACE,IAAG,CAAsC,CAAC,EACxC,QAAQ,CAAC,UAAU,WAAW,SAAS,KAAI,CAA4B,CAAC,GAAG,QAAQ,CAAC,CAAC,GACtF,CAAC,CACH,CACF,CACA,KAAY,WAAW,CAAC,CAAC;CAE5B,MAAM,QAAQ,MACZ,IAAG,CAAiB,CAAe,gBAAgB,CAAC;CAEtD,MAAM,SAAS,KAAI,CAAS,CAAC,KAA6B,KAAK;CAE/D,IAAI,IAAI,mBAAmB,UAAU;EACnC,MAAM,eAAe,MACnB,IAAG,CAAM,CAA+B,EACtC,WAAW,CACT,aACA,GAAkE,GAAG,IAExE,CAAC;EAEJ,OAAO,OACJ,KAA2B,YAAY,CAAC,CACxC,KACC,QAAmC;GACjC,MAAM,IAAI;GACV,gBAAgB;GAChB,IAAI,KAAI,CAAqB,CAAC,GAAG,GAAG;GACpC,MAAM,EACJ,KAAK,CACH,OACA,KAAI,CAAe,CAAC,KAAI;GAG5B,QAAQ;GACR,aAAa;GACd,CAAC,CACH,CAAC;CACN;CAEA,IAAI,IAAI,mBAAmB,WAAW;EACpC,MAAM,gBAAgB,MACpB,IAAG,CAAa,CAA+B,EAC7C,WAAW,CACT,aACA,GACE,OAAO,IAGZ,CAAC;EAEJ,OAAO,OACJ,KAA4B,aAAa,CAAC,CAC1C,KACC,QAAoC;GAClC,MAAM,IAAI;GACV,gBAAgB;GAChB,IAAI,KAAI,CAAsB,CAAC,GAAG,GAAG;GACrC,MAAM,EACJ,KAAK,CACH,OACA,KAAI,CAAgB,CAAC,KAAI;GAG7B,QAAQ;GACR,aAAa;GACd,CAAC,CACH,CAAC;CACN;CAEA,OAAO,OAAO,KACZ,QAAqC;EACnC,MAAM,IAAI;EACV,gBAAgB;EAChB,IAAI,KAAI,CAAuB,CAAC,GAAG,GAAG;EACtC,MAAM,EAAE,KAAK,CAAC,OAAO,KAAI,CAAiB,CAAC,KAAI,CAAE,EAAC;EAClD,QAAQ;EACR,aAAa;EACd,CAAC,CACH,CAAC;AACJ;;;AC3TA,MAAM,UACmC,SAErC,SACuD;CACvD,OAAO,UACL,MACA,KAAK,KAAK,KAAI,CAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE,CAAC;AAEzC;AAoBF,MAAa,eAQX,IACA,MACA,KACA,KACA,OACA,WAAW,QAC6B;CACxC,MAAM,UACJ,KAAI,CAAY,CACb,KACC,SACE,IACA,MACA,OAAuB,GAAG,CAAC,CAC5B,CACF,CACA,KACC,SAAiC,MAAM,KAAK,KAAK,OAAO,UAAU,KAAK,CAAC,CACzE,CAAC;CACN,WAAU,MACR,EAAE;EACA,YAAY,IAAI;EAChB,QAAQ;EACR,QAAQ,CACN,IACA,CACE,EACE,QAAQ,OAAO,KAAK;GAClB,GAAG,iBAA4E,aAAa,CAAC;GAC7F,GAAG,iBAAmF,YAAY,CAAC;GACpG,KAEH,GAAI,IAAI,mBAAmB,WACvB,CACE,EACE,MAAM;GAAE,WAAW;GAAS,WAAW;EAAgB,OAG3D;EAGT;;AAQL,MAAa,YAMX,IACA,MACA,KACA,UAEA,YACE,IACA,MACA;CAAE,MAAM;CAAK,gBAAgB;AAAM,GACnC,OACA,KAAK;AAST,MAAa,UAOX,IACA,MACA,KACA,OAIA,WAAW,OAEX,YACE,IACA,MACA;CAAE,MAAM;CAAK,gBAAgB;AAAQ,GACrC,QACA,OACA,QAAQ;;;AC5IZ,MAAM,aAEF,UAEa,UAA0C;CAEvD,OAAO,IACL,QAA6B,QAAQ,KAAI,CAAY,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,GAAI,GAAG,GAAG,GAAG,GACjF,KACA,KAAK,KAAK,CAAC;AAEf;AAGF,MAAa,aAOX,SACA,SAC+F;CAG/F,OAAO,MACL,IAAG,CAAM,CAAC,UAA2D,MAAM,OAAO,CAAC,CAAC;AAExF;AAEA,MAAa,YAOX,SACA,SAEA,UAA2B,SAAS,IAAI,CAAC,CAAW,IAAI;AAQ1D,MAAa,qBACX,MACE;CACF,OAAO,UAAsB,MAAK,GAAG,EAAE,CAAC,CAAC,GAAG;EAC1C,OAAO,CAAC,SAAS,OAAO;EACxB,QAAQ,CAAC,UAAU,QAAQ;EAC5B;AACH;AAEA,MAAa,oBACX,SAEA,kBAA2B,UAAmB,IAAI,CAAC;;;ACjErD,MAAa,qBACX,SAEA,kBAAsC,UACpC,IAAI,MAAM,KAAI,CAAsC,CAAC,GAAG,KAAK,CAAC,CAAC;AAGnE,MAAa,aAAoD,YAAgC;CAC/F,MAAM,OAAO;EACX,QAAQ,CAAC,UAAU,OAAO;EAC1B,SAAS,CAAC,WAAW,QAAQ;;CAI/B,MAAM,QAAQ,MAAU,KAAI,CAAY,CAAC,GAA2B,CAAC;CACrE,MAAM,UAAU,MAAU,WAAW,OAAO,OAAO,GAAG,KAAK,CAAC,CAAC;CAC7D,OAAO,KAAI,CAAe,CACvB,KACC,UAAqC,MAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAI,CAAE,GAAG,IAAI,CAAC,CACpE,CACA,KAA8B,SAAqC,QAAQ,IAAI,CAAC,CAAC,CACjF,KACC,kBAA4B,UAAS,KAAI,CAAM,CAAC,GAAkB,GAAG,MAAK,EAAG,CAAC,CAAC,KAAI,CAAE,CAAC,CACvF,CACA,KAAwB,UAAqC,MAAK,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACvF;;;AC1BA,MAAa,OAA0C,QAA4C;CACjG,UAAU,GAAG;CACb,SAAS,GAAG;CACZ,WAAW,GAAG;CACd,UAAU,GAAG;;AAEf,MAAa,gBAAsD;CACjE,UAAU;CACV,SAAS;CACT,WAAW;CACX,UAAU;;AAEZ,MAAM,MAAS,MAAS;AACxB,MAAM,oBAAuD,OAAM;AAEnE,MAAa,UACX,QACsB;CACtB,GAAG;CACH,WAAW,GAAG;CACd,UAAU,GAAG;;AAEf,MAAa,iBACX,MACG,YAAW;;;AC5BhB,MAAa,kBAQc,QACR,YAAwE;CACvF,OAAO,EACL,KAAK,GAAG,KAAK,QAAO;AAExB;;;ACdF,MAAM,SAAS,SAAQ;AAEvB,MAAa,MAAM,OAAO,KAAK;AAC/B,MAAa,MAAM,OAAO,KAAK;AAG/B,MAAa,OAAO,SAAQ;AAE5B,MAAa,MAAM,KAAc,KAAK;AACtC,MAAa,QAAQ,KAAgB,KAAK;AAC1C,MAAa,SAAS,KAAgB,MAAM;AAC5C,MAAa,MAAM,KAAa,KAAK;AACrC,MAAa,SAAS,KAAW,KAAK;AACtC,MAAa,OAAO,KAAa,MAAM;AACvC,MAAa,OAAO,KAAa,MAAM;AAiBvC,MAAa,QAAQ,SAAQ,CAA0G,CAAC,OAAO;AAC/I,MAAa,UAAU,SAAQ,CAAmG,CAAC,SAAS;;;AC/B5I,MAAa,SAAyB,UAA4C,EAChF,MAAK,MAAK,WAAU,CAAU,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAG,EAAE,CAAE;;;ACF7D,MAAM,SAAS,SAAQ;AAQvB,MAAa,MAAM,OAAO,KAAK;AAC/B,MAAa,OAAO,OAAO,MAAM;;;ACFjC,MAAa,eAA8B,UACzC,aACE,kBAAkB,IAAI,OAAO,KAAI,CAAK,CAAC,KAAI,GAAI,GAAG,CAAC,GACnD,WAAU,CAAE;AAEhB,MAAa,mBAAqB;CAChC,MAAM,QAAQ,SAAa,KAAI,CAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,KAAI;CAChE,OAAO,QACL,MACE,GAAuC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CACtE;AAEL;;;AChBA,MAAa,UAAyB,WAAmD;CACvF,KAAK,QAAQ,MAAM,KAAK,CAAC;CACzB,OAAO,YAAe,KAAK;;;;ACuB7B,MAAa,YACX,GACA,IACA,MACA,SACiB;CACjB,IAAI,MAAM,IAAI,OAAO;CACrB,IAAI,OAAO,MAAM,UAAU,OAAO;CAClC,MAAM,QAAQ,QAAiC,QAAQ,KAAK,OAAO;CACnE,OAAO,OAAO,KAAK,EAAE,EAAE,GAAG,IAAO,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AACpD;AAaA,MAAM,WACJ,OACA,SAEA,IAA6B,QAAiC,OAAO,GAAG,GAAG,KAAK,IAAI;AA2FtF,MAAM,aAQJ,IACA,IACA,GAEA,YAOE;CAQF,MAAM,WAA6B,MAAK;CACxC,MAAM,MAAqB,KAAI;CAC/B,MAAM,SAAS,SACb,IAAI,GAAW,IAAI,CAAC,CAAC,GAAmC,EAAE,CAAC,CAAC,KAAI;CAClE,MAAM,aAAa,SACjB,QAA6B,MAAM,IAAI,GAAG,QAAQ;CACpD,MAAM,OAAoB,KAAI,CAAM,CAAC,GAAc,KAAK,CAAC,CAAC,KAAI;CAC9D,MAAM,UAA6B,MAAmB;EACpD,QAAQ,CACN,UACA,QACE,IAAI,GAAiB,QAAQ,CAAC,CAAC,GAAmC,EAAE,CAAC,CAAC,KAAI,GAC1E,GAAG;EAGP,OAAO,CACL,SACA,QACE,IAAI,GAAgB,OAAO,CAAC,CAAC,GAAmC,EAAE,CAAC,CAAC,KAAI,GACxE,GAAG;EAGP,SAAS,CAAC,WAAW,IAAI,GAAG,SAAS,CAAC,CAAC,KAAI,CAAE;EAC9C;CACD,MAAM,UAAa,SAAwC;EACzD,MAAM,MAAM,QAAkB,QAAQ,KAAK,OAAO;EAClD,IAAI,OAAO,MAAM,UAAU,OAAO,GAAG,CAAC;EACtC,OAAO,OAAc,GAAG,EAAE,EAAE,GAAG,IAAO,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC;CACvD;CACA,MAAM,SAAS,SAA2C;EAExD,MAAM,QAAQ,IAAG,CAAU,CAAC,OAAO,CAAC,CAAC,KAAI;EACzC,OAAO,KACL,EAAE,OAAO,CAAC,SAAS,UAAU,IAAI,CAAC,EAAC,GACnC,IACE,GAAsB,KAAK,CAAC,CAAC,QAAQ,GACrC,QAAQ,IAAI,GACZ,MAAyC;GACvC,OAAO;GACP,IAAI;GACJ,MAAM,MAA+C;IACnD,KAAK,CAAC,OAAO,OAA8B,IAAG,CAAK,CAAC,GAAG,CAAC,CAAC,GAAa,KAAK,CAAC,CAAC,KAAI,CAAE,CAAC;IACpF,OAAO,CAAC,SAAS,IAAG,CAAK,CAAC,GAAG,CAAC,CAAC,KAAI,CAAE;IACtC;GACF,CAAC,CACH;CAEL;CACA,MAAM,cAAc,MAAM,QAAQ;CAClC,MAAM,aAAa,MAAM,OAAO;CAGhC,MAAM,SAAyC,SAAY,IAAG,CAAY,CAAC,IAAI,CAAC,CAAC,KAAI;CACrF,MAAM,QAA6B,SACjC,IAAG,CAAkB,CAAC,IAAI,CAAC,CAAC,GAA2B,KAAK,CAAC,CAAC,KAAI;CACpE,MAAM,WAAgC,SACpC,IAAG,CAAkB,CAAC,IAAI,CAAC,CAAC,GAA6B,OAAO,CAAC,CAAC,KAAI;CACxE,MAAM,OAAO,MAAgE;EAC3E,OAAO,MAAM,SAAS;EACtB,IAAI;EACJ,MAAM,MAAwE;GAC5E,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC;GACtB,QAAQ,CAAC,UAAU,QAAQ,GAAG,CAAC;GAC/B,OAAO,CACL,SACA,MACE,MAAgF;IAC9E,OAAO,OAAwE;KAC7E,MAAM,MAAM,QAAQ;KACpB,IAAI;KACJ,OAAO,IAAI,CAAC;KACZ,MAAM,GAAwD,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;KACnF;IACD,IAAI;IACJ,MAAM,QAAQ,GAAG;IAClB,CAAC;GAGP;EACF;CACD,MAAM,YAAY,MAA8C;EAC9D,OAAO,MAAM,SAAS;EACtB,IAAI;EACJ,MAAM,IAAG,CAAkB,CAAC,IAAI,CAAC,CAAC,GAA2B,KAAK,CAAC,CAAC,KAAI;EACzE;CACD,MAAM,QAAQ,MAAgE;EAC5E,OAAO,OAA2C;GAChD,MAAM,MAAM,QAAQ;GACpB,IAAI;GACJ,MAAM,IACJ,QAAuD,KAAK,GAAG,GAAG,SAAS,CAAC;GAE/E;EACD,IAAI;EACJ,MAAM,MAAwE;GAC5E,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC;GACtB,QAAQ,CAAC,UAAU,GAAG;GACtB,OAAO,CAAC,SAAS,QAAQ,GAAG,CAAC;GAC9B;EACF;CACD,MAAM,QAAQ,KACZ;EACE,SAAS,CAAC,WAAW,WAAW;EAChC,QAAQ,CAAC,UAAU,UAAU;IAE/B,YAA4C,MAAM,KAAK,CAAC;CAE1D,OAAO,cACL,MACE,UACE,KAAK,IAAI,KAAK,GACd,KAAK,IAAI,OAAO,CAAC,CAClB,CACF;AAEL;AAGA,MAAM,WACJ,QACkD,MAAK;AAGzD,MAAM,YACJ,OAEA,MACE,MAAwC;CACtC,KAAK,CAAC,OAAO,EAAE;CACf,OAAO,CAAC,SAAS,MAAoC,EAAE,CAAC;CACzD,CAAC;AA6EN,MAAM,YAQJ,IACA,IAEA,KAEA,QAKE;CAoBF,MAAM,MAAuB,KAAI;CACjC,MAAM,WAA+C,KAAI,CAAK,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CACpF,MAAM,QAAQ,SAAkC,IAAI,GAAY,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI;CAC9F,MAAM,SAAuC,GAAe,MAC1D,aACE,aACE,MAA0B,EAAE,KAAK,CAAC,OAAO,GAAE,CAAK,EAAC,CAAE,GACnD,MAAuB,KAAK,IAAI,CAAC,CAAC,CAAC,GAErC,MAAuB,KAAK,IAAI,CAAC,CAAC,CAAC;CAEvC,MAAM,UACJ,KACA,OACuB;EAIvB,OAAO,MAAgB,KAAK,GAAG,QAAe,GAAG,CAAC;CACpD;CACA,MAAM,WACJ,KACA,QACuB,MAAe,KAAK,GAAG;CAEhD,MAAM,UACJ,KACA,QACA,KACA,SAEA,IACE,QAA+C,KAAK,MAA+B,EAAE,CAAC,GACtF,KACA,QAAyB,QAAQ,IAAI,CAAC;CAE1C,MAAM,UAAU,SAAoC;EAClD,MAAM,YACJ,KAAI,CAAkB,CAAC,GAAuB,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI;EAC9E,MAAM,YACJ,KAAI,CAAsB,CAAC,GAA2B,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI;EACtF,IAAI,CAAC,KAAK;GACR,MAAM,YACJ,KAAI,CAA4B,CAAC,GAAG,EAAE,CAAC,CAAC,GAAkB,IAAI,CAAC,CAAC,KAAI;GACtE,OAAO,QACL,KAAK,IAAI,GACT,OACE,IAAG,GACH,IAAG,GACH,MAAM,OAAO,IAAG,GAAO,GAAG,IAAI,KAC9B,QAAQ,IAAG,GAAO,IAAG,CAAK,CAAC,CAC5B;EAEL;EACA,MAAM,YAAqE;GAKzE,OAAO,QACL,KAAI,CAAK,CAAC,GAAU,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI,GAClD,IAAI,QAAc,GAAG,CAAC;EAE1B;EACA,OAAO,OACL,IAAG,GACH,IAAG,GACH,MAAM,OAAO,IAAG,GAAO,GAAG,IAAI,KAC9B,QAAQ,IAAG,GAAO,IAAG,CAAK,CAAC;CAE/B;CACA,MAAM,SAAS,SACb,IACE,GAAsB,IAAI,GAAY,EAAE,CAAC,CAAC,GAAgB,IAAI,CAAC,CAAC,KAAI,CAAE,CAAC,CAAC,MAAe,EAAE,CAAC,GAC1F,IAAI,IAAI,GACR,IAAI,GAAG,EAAE,CAAC,CAAC,GAA0B,SAAS,CAAC,CAAC,GAA2B,IAAI,CAAC,CAAC,KAAI,CAAE;CAE3F,MAAM,YAA2C,MAAgD;EAC/F,KAAK,CAAC,OAAO,GAAE,CAAE;EACjB,QAAQ,CAAC,UAAU,OAAO,QAAQ,CAAC;EACnC,OAAO,CAAC,SAAS,OAAO,OAAO,CAAC;EAChC,SAAS,CACP,WACA,MAA6B;GAC3B,QAAQ,CAAC,UAAU,MAAM,QAAQ,CAAC;GAClC,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC;GAChC;EAEJ;CAED,OAAO,cAAc,SAAS;AAChC;AAYA,MAAa,gBAQX,IACA,IACA,GACA,cACA,iBAKE;CAIF,MAAM,UACJ,SACA,KACA,QACE;EAGF,OAAO,KAAI,CAAM,CACd,KAAqB,UAAkC,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAC3E,KACC,SAAqE,EAAE,CAAC,CACzE,CACA,KAAkC,SAA+B,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CACnF,KAA2B,WAAU,CAAQ,CAAC,CAAC;CACpD;CACA,MAAM,OACJ,YAEA,OACE,SACA,iBAAiB,QAAQ,cAAwB,YAAY,GAC7D,iBAAiB,QAAQ,cAAwB,YAAY,CAAC;CAElE,IAAI,MAAM,IAAI,OAAO,IAAW,OAAO;CACvC,IAAI,iBAAiB,MAAM,OAAO,IAAO,QAAQ;CACjD,OAAO,IAAW,OAAO;AAC3B;;;AC1iBA,MAAa,WACX,GACA,MACA,SAAS,QAC8D;CAGvE,MAAM,QAAQ;EAAC;EAAQ;EAAQ;CAAO;CACtC,OAAO;EACL,OAAO,KAAI,CAA6B,CACrC,KACC,kBACE,MAAM;GACJ,KAAK,CAAC,OAAO,KAAI,CAAsB,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE;GACxD,MAAM,CAAC,QAAQ,KAAI,CAAsB,CAAC,KAAI,CAAE;GAChD,OAAO,CAAC,SAAS,KAAI,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI,CAAE;GACrD,CAAC,CACH,CACF,CACA,KACC,aACE,QACA,SACA,KAAK,CACN,CACF,CACA,KACC,kBACE,aACE,KAAI,CAA6B,CAAC,GAAG,MAAM,CAAC,CAAC,KAAI,GACjD,OACE;GACE,KAAK,KAAI,CAA6B,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI;GACvD,IAAI,KAAI,CAA6B,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;KAEtD,IAAI,CACL,CACF,CACF,CACF,CAAC;EACJ,MAA2B,MACzB,KAAI,CAA8B,CAC/B,KAA2B,SAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACnD,KACC,MACE,IAAG,CAAwB,CAAO,EAChC,KAAK,CACH,OACA,GACE,SACE,OACA,QACA,KAAI,CAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,GACxB,KAAI,CAAK,CAAC,GAAS,CAAC,CAAC,CAAC,GAAa,KAAK,CAAC,CAAC,KAAI,CAAE,CACjD,IAGN,CAAC,CACH,CAAC,CAAC,CAAC,CACL,CAAC;;AAEV;;;ACpCA,MAAa,gBAaX,EAAE,QAAQ,UACV,EAAE,MAAM,MAAM,SACd,IACA,IACA,GACA,cACA,iBACgE;CAGhE,MAAM,OAAOC,SACV,WAAW,KAAK,CAAC,CACjB,OAAO,KAAK,iBAAiBC,aAAI,KAAK,IAAIA,aAAI,IAAI,CAAC,CAAC,CACpD,OAAO,WAAW;CAIrB,MAAM,kBAAkB,MACtB,GACE,QACE,KAAI,CAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAA6B,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAI,GACnE,OAAmB,IAAI,IAAI,CAAC,CAAC,CAC9B;CAEL,OAAO,KAAI,CAAa,CACrB,KACC,kBAAmC,MAAyB,KAAK,IAAI,KAAI,CAAM,CAAC,KAAI,CAAE,CAAC,CAAC,CAAC,CAC1F,CACA,KACC,MACE,IAAG,CAAS,CAAC;EACX,KAAK,CAAC,OAAO,eAAe,QAAQ,CAAC;EACrC,KAAK,CAAC,OAAO,eAAe,OAAO,CAAC;EACrC,CAAC,CACH,CACF,CACA,KACC,eAAyF;EACvF;EACA,GAAG;EACH,QAAQ;GACN,SAAS,KAAI,CAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,MAAM;GACrD,OAAO,KAAI,CAAS,CAAC,GAAG,KAAK;;EAE/B,MAAM;EACN,UAAU,KAAI,CAAM,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;EAC7C,CAAC,CACH,CACA,KACC,eAQE;EACA;EACA,GAAG;EACH,QAAQ;GACN,SAAS,KAAI,CAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,MAAM;GACrD,OAAO,KAAI,CAAS,CAAC,GAAG,KAAK;;EAE/B,MAAM;EACN,UAAU,KAAI,CAAM,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;EAC7C,CAAC,CACH,CACA,KACC,kBAEI,MAIE;EAIF,MAAM,UACJ,MACA,QACwC;GAMxC,MAAM,OAAO,KAAI;GACjB,OAAO,IACL,QACE,KAAI,CAAkB,CAAC,GAAyB,IAAI,CAAC,CAAC,KAAI,GAC1D,GAAG,GAEL,KACA,MACE,UACE,KAAK,IAAI,KAAK,GAA4B,GAAG,CAAC,CAAC,GAAiB,QAAQ,CAAC,CAAC,KAAI,CAAE,GAChF,KACE,IACA,KAAK,GAAgC,IAAI,CAAC,CAAC,GAAyB,EAAE,CAAC,CAAC,KAAI,CAAE,CAC/E,CACF,CACF;EAEL;EACA,OAAO,MAAM,UAAU,OAAO,SAAS,GAAG,IAAI,OAAO,UAAU,GAAG;CACpE,CAAC,CACF,CACF,CACA,KACC,iBAAiB,OACb,mBAEI,SAIE;EAGF,MAAM,YAAiC,KAAI,CAAK,CAAC,GAC/C,SAAS,UAAU,WAAW,OAAO;EAMvC,MAAM,KAAK,cAAwB,YAAY,CAAC,CAAC,QAAgB,GAAG;EAapE,OATI,QACF,KAAI,CAAK,CAAC,GAAG,IAAI,CAAC,CAAC,KAAI,GACvB,MACE,UACE,KAAK,IAAK,UAA2B,GAAG,EAAE,CAAC,CAAC,KAAI,CAAE,GAClD,KAAK,IAAI,EAAE,CAAC,CACb,CAGE;CACT,CAAC,IAEH,KAAI,CAAyC,CAAC,MAAM,CACzD,CACA,KACC,aAAsC,IAAI,IAAI,GAAG,cAAc,YAAY,CAAC,CAC7E,CAAC;AACN;;;ACjMA,MAAa,cAYT,EAAE,QAAQ,UACV,EAAE,MAAM,MAAM,SACd,IACA,GACA,iBAGA,MAC2E;CAE3E,MAAM,OAAO,KAAI,CAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;CACrC,MAAM,QAAQ,KAAI,CAAK,CAAC,GAAU,EAAE,CAAC,CAAC,GAAoB,KAAK,CAAC,CAAC,KAAI;CACrE,MAAM,WAAW,MAAM;CACvB,MAAM,aACJ,OAAO,MAAM,WAAW,QAAQ,OAAO,MAAM,IAAO,EAAE,EAAE,GAAG,KAAK;CAClE,OAAO,KAAI,CAAc,CACtB,KACC,eAAwD;EACtD;EACA,GAAG;EACH,QAAQ;GACN,OAAO;GACP,SAAS,KAAI,CAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,MAAM;;EAEvD,MAAM;EACN,UAAU,KAAI,CAAM,CACjB,KAAmB,KAAK,CAAC,CACzB,KAA0B,IAAI,CAAC,CAC/B,KAAkB,cAAc,KAAI,CAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,CAAE,CAAC,CAAC,CAAC;EAC7E,CAAC,CAAC,CAAC,CAAC,CACN,CACA,KAA4B,SAA2B,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3E,KACC,WACI,KAAI,CAAa,CAAC,SAClB,MACE,IAAG,CAAmB,CAAO,EAC3B,KAAK,CAAC,OAAO,GAAG,QAAQ,YAAY,IAAI,CAAC,CAAC,GAC3C,CAAC,CACH,CAAC,CAAC,CAAC,CACT,CAAC;AACN;;;AC5DF,MAAa,YACX,MAEA,QAAuC,KAAI,CAAoB,CAAC,GAAG,QAAQ,CAAC;;;ACP9E,MAAM,KAAK,MACT,aAAa,SAAS,GAAG,OAAO,CAAC,IAAI,MAAM,KAAK,EAAC,IAAK,SAAS,GAAG,OAAO,CAAC,IAAI,MAAM,KAAK,EAAC;AAE5F,MAAM,WAAW,MAAY,EAAE,QAAQ,+BAA+B,GAAG,MAAM,EAAE,CAAC,CAAC;AACnF,MAAM,QAAQ,MAAc,QAAQ,KAAK,UAAU,CAAC,CAAC;AAErD,MAAa,OAAO,GAAG,SACrB,QAAQ,oBACN,IAAI,KAAI,GACR,GAAG,KAAK,KAAI,MAAM,OAAO,MAAM,aAAa,EAAE,OAAO,IAAI,KAAK,OAAO,MAAM,WAAW,KAAK,CAAC,IAAI,CAAE,CAAC;;;ACNvG,MAAa,2BAAW,IAAI,IAAG;AAE/B,MAAa,cAAc,OACzB,YACA,WACA,OACE;CACF,MAAM,EAAE,MAAM,GAAG,YAAY,MAAM;CACnC,MAAM,MAAM,SAAS,IAAI,WAAW,cAAc,qBAAK,IAAI,IAAG;CAC9D,SAAS,IAAI,WAAW,gBAAgB,GAAG;CAC3C,MAAM,WAAW,GAAG,KAAK,UAAU,SAAS,EAAC,GAAI,KAAK,UAAU,OAAO;CACvE,IAAI,IAAI,IAAI,QAAQ,GAAG;EACrB,MAAM,IAAI,IAAI,QAAQ;EACtB;CACF;CACA,MAAM,UAAU,qBAAqB,YAAY,WAAW,EAAE;CAC9D,IAAI,IAAI,UAAU,OAAO;CACzB,MAAM;AACR;AACA,MAAM,uBAAuB,OAC3B,YACA,WACA,YACE;CAEF,WAA+C;CAC/C,OAAO,MAAM;EACX,IAAI;GACF,MAAM,WAAW,YAAY,WAAW,OAAO;GAC/C,WAA8C;EAChD,SAAS,GAAQ;GACf,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG;IAG9B,EAA2C,MAC7B,WAAW;IAIzB;GACF;GACA,IAAI,EAAE,QAAQ,OAAO;IAEnB,MAAM,IAAI,SAAQ,QAAO,WAAW,KAAK,GAAG,CAAC;IAC7C;GACF;GACA,WACyB;GAKzB,QAAQ,MAAM,wBAAwB,CAAC;GACvC,MAAM;EACR;EACA;CACF;AACF;AAEA,MAAa,mBAAmB,OAAO,IAAQ,mBAA0B;CACvE,IAAI,CAAE,MAAM,GAAG,gBAAgB,EAAE,MAAM,eAAc,GAAI,EAAE,UAAU,KAAI,CAAE,CAAC,CAAC,KAAI,GAC/E,MAAM,GAAG,iBAAiB,cAAc;AAE5C;;;AChEA,MAAa,OACX,GACA,MACM,OAAO,YAAkB,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAgB,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAE3F,MAAa,SAA+B,EAAE,GAAG,KAAQ,GAAM,MAAc;CAC3E,OAAO,EAAE;CACT,OAAO;EAAE,GAAG;GAAI,IAAI;CAAC;AACvB;AACA,MAAa,WACX,YACE;CAEF,OAAO,IAAyB,UAAS,MAAK,EAAE,KAAI,CAAE;AACxD;AAYA,MAAa,QACX,YACwC;CAGxC,MAAM,WAAmD,OAAO,OAG9D,IAAwD,UAAU,GAAG,QAAO;EAK1E,OAJU,EAAE,KAAK,MACf,WAAU;GAAE;GAAK;EAAK,KACtB,UAAS,IAAI,MAAM,KAAK,CAEnB;CACT,CAAC,CAAC;CAEJ,OAAO,QAAQ,IAAoC,QAAQ,CAAC,CAAC,MAC1D,WAA0B;EACzB,IAAI,kBAAkB,OACpB,MAAM;OAEN,OAAO;CAEX,CAAC;AAEL;;;ACjDA,MAAa,cACX,gBACA,yBACA,SACA,cAC4C;CAC5C,MAAM,EAAE,OAAO,eAAe,QAAQ;CAEtC,IAAI,CAAC,YAAY,GAAG,KAAK,cAAc,KAAK,KAE1C,OAAO,wBAAwB,MAAM,2BAAyB;EAI5D,IAAI,uBAAuB,KAAK,KAC9B,OAAO;GAAE,OAAO;GAAwB;EAAG;EAI7C,OAAO,KAAK,OAAO;CACrB,CAAC;CAEH,OAAO,KAAK,OAAO;AACrB;;;ACtBA,MAAM,cAEF,QACA,WACA,eAEF,YACE,WAAW,QAAQ,WAAW,SAAS,SAAS;AAEpD,MAAM,oBAEF,SACA,QACA,WACA,gBAIG;CACH,MAAM,EAAE,OAAO,QAAQ;CACvB,MAAM,SAAS,MAAM,KAAI;CACzB,OAAO,QAAQ,OAAO,MAAM;CAC5B,OAAO,eAAgC;EACrC,SAAS,MAAiD,SAAS,KAAK,MAAM;EAC9E;EACA,QAAQ,WAAW,QAAQ,OAAO,MAAM,SAAS;EACjD;EACD;AACH;AAMF,MAAM,iBAEF,SACA,WACA,WAID,WAA8E;CAC7E,MAAM,EAAE,OAAO,QAAQ;CACvB,OAAO;EACL,MAAM,iBAAiB,SAAS,QAAQ,WAAW,KAAK;EACxD,MAAM,MAAM;EACZ,MAAM;GAAE;GAAK,OAAO,MAAM;GAAM,KAAK,MAAM,KAAK;EAAG;;AAEvD;AAEF,MAAa,kBAA0E,WAOlC;CACnD,MAAM,EAAE,SAAS,WAAW,SAAS,MAAM,UAAU;CAErD,OAAO;EACL,YAAY,eAAe;GAAE,SAAS,QAAQ,OAAO;GAAG;GAAW;GAAQ;EAAK,CAAE;EAClF,MAAM,OAAO,OAAO,CAAC,CAAC,KAAK,cAAc,SAAS,WAAW,KAAK,CAAC;EACnE,OAAO,YAAW;GAChB,KAAK,MAAM,OAAO,SAChB,MAAM,QAAQ,IAAI,EAAE,MAAK;EAE7B;;AAEJ;;;ACvEA,MAAM,QAAQ,EAAE,QAAQ,MAAK;AAC7B,IAAI,UAAiC;AAMrC,MAAa,mBACX,UACgF;CAChF,MAAM,iBAAgB;EACpB,MAAM,UAA4D,MAAM,KAAuC,SAAQ,KAAI,CAAE;EAG7H,MAAM,UAAkD,OAAO,YAC7D,QAAQ,KAAK,QAAQ,UAAU,CAAC,OAAO,KAAK,GAAQ,MAAM,CAAC,CAAC;EAE9D,OAAO,eAA2C;GAChD;GAEA,YAAW,QAAO;GAClB,OAAO,EACL,QAAQ,OAAO,WAAU;IACvB,IAAI,CAAC,MAAM,KAAK,KAAK;IACrB,IAAI,YAAY,MAAM;KACpB,aAAa,OAAO;KACpB,UAAU;IACZ;IACA,OAAO,KAAK,WAAU;KACpB,IAAI,CAAC,MAAM,KAAK,KAAK;KACrB,IAAI,CAAC,MAAM,QAAQ;MACjB,IAAI,YAAY,MAAM,aAAa,OAAO;MAC1C,UAAU,iBAAgB;OACxB,MAAM,SAAS;OACf,QAAQ,IAAI,QAAQ;MACtB,GAAG,GAAI;KACT;IACF,CAAC;GACH;GAEH;CACH;CACA,OAAO;AACT;;;AC5CA,IAAa,UAAb,MAAoB;CACV;CAER,YAAY,MAA+B;EACzC,KAAK,UAAU,OAAO,CAAC,IAAI,IAAI;CACjC;CAEA,IAAI,GAA2B;EAC7B,KAAK,QAAQ,KAAK,CAAC;CACrB;CAEA,SAAM;EACJ,MAAM,QAAQ,KAAK,QAAQ,QAAO,MAAK,CAAC;EACxC,IAAI,MAAM,WAAW,GACnB,OAAO,MAAM;EAEf,OAAO,gBAA4D,KAAK;CAC1E;CAEA,MAAM,IAAqC;EACzC,MAAM,MAAM,KAAK,OAAM;EACvB,OAAO,QAAQ,KAAK,EAAE;CACxB;;AAGF,MAAa,QAAgB,SAA2C;AAExE,MAAM,UAAU,OACd,IACA,OACkB;CAClB,OAAO,MAAM;EACX,MAAM,EAAE,MAAM,MAAM,GAAG,UAAU,GAAE;EACnC,MAAM,MAAM,MAAM,KAAK,MACrB,UAAS;GAAE,IAAI;GAAM;EAAI,KACzB,SAAQ;GAAE,IAAI;GAAO;EAAG,EAAY;EAEtC,IAAI,CAAC,IAAI,IAAI;GACX,QAAQ,MAAM,IAAI,GAAG;GACrB,QAAQ,KAAK,CAAC;EAChB;EACA,MAAM,EAAE,MAAM,SAAS,IAAI;EAC3B,IAAI,KAAK,IAAI,GAAG;GACd,MAAM,MAAK;GACX,MAAM,IAAI,MAAM,iBAAiB;EACnC;EACA,KAAK;CACP;AACF;;;ACbA,MAAM,SAAuD,EAC3D,SAAS,GACT,SAAS,QAKT,eAA+D,EAAE,SAAS;CAAE;CAAG;AAAC,EAAE,CAAE;AAEtF,MAAM,QAeJ,QACA,cACA,eACA,uBACA,cACkD;CAGlD,MAAM,EAAE,QAAQ,QAAQ,MAAM,OAAO,OAAO;CAC5C,MAAM,iBAAiB;EAAE,QAAQ;EAAQ,QAAQ;CAAM;CAEvD,MAAM,SAAuB,OAAO,OAAO,QAAQ,SAAS;EAAC;EAAQ,OAAO;EAAQ;CAAO;CAE3F,MAAM,iBAIF,SAAS,WAAW,gBAAgB,eAAe,IAAI,QAAQ,SAAS,CAAC;CAC7E,MAAM,oBAAoB,cAAc,cAAc,cAAc;CACpE,MAAM,OAAO,GAAG,KAAK,IAAG;CACxB,MAAM,MAAyB,EAAE,KAAK,IAAG;CACzC,MAAM,SAA6C;EAAE,GAAG;EAAM,GAAG;CAAG;CACpE,OAAO;EACL,SAAQ,YACN,QAAQ,cAAc,mBAAmB,SAAS,sBAAsB,GAAG,CAAC,CAAC;EAC/E,MACE,eACoC;GAEpC,MAAM,cAAc,aAClB;IAFsB,QAAQ;IAAQ,QAAQ;GAE9C,GACA,cACA,SACA,QACA,QACA,SAAS;GAEX,MAAM,cAAc,aAClB,gBACA,eACA,QACA,SACA,QACA,QACA,SAAS;GAEX,MAAM,sBAAsB,aAC1B,kBACE,aACE,KAAI,CAAU,CAAC,GAAG,MAAM,CAAC,CAAC,KAAI,GAC9B,OACE;IACE,GAAG,KAAI,CAAU,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI;IAClC,GAAG,KAAI,CAAU,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI;MAElC,MAAM,CACP,CACF,GAEH,sBAAsB,KAAK;GAE7B,MAAM,eAAe,aAAa,aAAa,mBAAmB;GAClE,MAAM,eAAe,aAAa,aAAa,mBAAmB;GAClE,MAAM,aACJ,GACA,QACA,UAEA,EAAE,IACA;IACE,MAAK,UAAS,aAAa,QAAQ,MAAM,IAAI,KAAK,CAAC;IACnD,UAAU,MAAM;MAElB,YAAW;IACT,IAAI,oCAAoC,aAAa,KAAK,gBAAgB,GACvE,UAAU,OAAO,IAAG,MAAO,GAC7B;IACD,MAAM,YACJ,aAAa,MACb,GAAG,UAAU,OAAO,IAAG,MAAO,EAAC,GAC/B,EAAE,MAAM,UAAU,KAAK,OAAM,GAAG,KAAK,CAAE,CAAC,SAAS,QAAQ,EAAC,CAAE;IAE9D,IAAI,qCAAqC,cAAc,KAAK,gBAAgB,GACzE,UAAU,OAAO,IAAG,MAAO,GAC7B;IACD,MAAM,YACJ,cAAc,MACd,GAAG,UAAU,OAAO,IAAG,MAAO,EAAC,GAC/B,EAAE,MAAM,WAAW,KAAK,OAAM,GAAG,KAAK,CAAE,CAAC,SAAS,QAAQ,EAAC,CAAE;GAEjE,CAAC;GAEL,MAAM,UAAU,UAAU,MAAM,cAAc,UAAU;GACxD,MAAM,UAAU,UAAU,OAAO,cAAc,UAAU;GACzD,aAAa,MAAM;IAAE,SAAS,QAAO;IAAI,SAAS,QAAO;GAAE,CAAE;EAC/D;;AAEJ;AAqCA,MAAM,YAUF,GACA,eAGA,UAEA,EAAE,KAAK,QAEH,YAEA,EAAE,MAAM,QAEJ,YAEA,KACE,GACA,SACA,SACA,OACA,SAAS,CACV,CACJ;AAET,MAAa,WAET,OAEc,MACd,EAAE,OAAO,QACL,SAAyC;CACvC,OAAO,EAAE;CACT,IAAI,EAAE;CACN,QAAQ,EAAE;CACV,QAAQ,KAAI,CAAO,CAAC,GAAG,KAAK;CAC5B,MAAM,EAAE,WAAU,CAAE;CACpB,IAAI;CACL,IACD,SAAgC;CAC9B,IAAI;CACJ,OAAO,EAAE;CACT,IAAI,EAAE;CACN,QAAQ,EAAE;CACV,QAAQ,EAAE;CACV,MAAM,EAAE,WAAU,CAAE;CACpB,QAAQ,EAAE;CACX;AAET,MAAa,gBAET,OAEc,MACd,EAAE,OAAO,QACL,SACE;CACE,OAAO,EAAE;CACT,IAAI,EAAE;CACN,QAAQ,EAAE;CACV,QAAQ,KAAI,CAAM,CAAC,GAAG,KAAK;CAC3B,MAAM,EAAE,WAAU,CAAE;CACpB,IAAI;GAEN,IAAI,IAEN,SACE;CACE,IAAI;CACJ,OAAO,EAAE;CACT,IAAI,EAAE;CACN,QAAQ,EAAE;CACV,QAAQ,EAAE;CACV,MAAM,EAAE,WAAU,CAAE;CACpB,QAAQ,EAAE;GAEZ,IAAI;;;ACjRd,MAAM,YACJ,aACqD;CACrD,OAAO,UAAU,OAAO;CACxB,KAAK,MAAkB,OAAO;CAC9B,KAAK,MAAM,OAAO;;AAQpB,MAAa,cAGT,WAEA,SAA0C,KAAI,CAAS,CAAC,MAAM,CAAC;AAEnE,MAAa,gBACX,UAC+C;CAC/C,OAAO,kBAAkB,IAAI;CAC7B,KAAK,cAAc,IAAI;CACvB,KAAK,cAAc,IAAI;;;;ACTzB,MAAa,YACX,KACA,MACA,KACA,KACA,SACA,UAA4D,MAAK,MAClC;CAO/B,MAAM,SAEF,iBAAgD,MAAK,OAAM,EAAE,KAAK,EAAC,EAAG;CAC1E,MAAM,aAAa,qBAAkC,GAAG;CAExD,OAAO;EACL,WAAU,MACR,EAAqB;GACnB,YAAY;GACZ,QAAQ;GACR,QAAQ,CACN,QACA,CAAC,EAAE,MAAM;IAAE,WAAW;IAAS,WAAW;GAAgB,EAAE,CAAE;GAEjE;EACH,WAAwC;GACtC,MAAM,WAAW,IACf,aACE,MACA,MACE,UAA0B,SAAS;IACjC,WAAW,CAAC,aAAa,GAAG;IAC5B,WAAW,CAAC,aAAa,OAAO;IACjC,CAAC,CACH,CACF;GAGH,OAAO,KAAI,CAAK,CACb,KAAmB,cAAc,QAAQ,CAAC,CAAC,CAC3C,KACC,QAAkB;IAChB,MAAM;IACN,IAAI,KAAI,CAAS,CAAC,GAAG,KAAK;IAC1B,QAAQ;IACR,aAAa,uBAAwC,UAAU,QAAQ,UAAU;IACjF,gBAAgB;IACjB,CAAC,CACH,CAAC;EACN;;AAEJ;AAEA,MAAa,iBACX,KACA,QAC+B;CAG/B,MAAM,UAAU,SACd,MACsB,MAAiC,IAAU,CAAC,CAAC;CAGrE,OAAO,SAAoB,KAAK,KAAI,CAAK,CAAC,KAAI,GAAIJ,MAAI,KAAK,OAAO;AACpE;AAEA,MAAa,eACX,KACA,QACsC;CAGtC,MAAM,UAAU,SACd,MACsB,MAAiC,IAAU,CAAC,CAAC;CAErE,OAAO,SACL,KACA,cAA2B,KAAI,CAAY,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,CAAE,IAC9D,MACE,IACE,GAAuB,KAAI,CAAY,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,CAAE,CAAC,CAAC,GAAG,GAC/D,MACE,UAAsC,SAAS;EAC7C,WAAW,CAAC,aAAa,OAAO;EAChC,KAAK,CACH,OACA,cAAc,KAAI,CAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAmB,KAAK,CAAC,CAAC,KAAI,CAAE;EAE9E,WAAW,CAAC,aAAa,OAAO;EACjC,CAAC,GAEJ,CAAC,GAEL,KACA,OAAO;AAEX;AAEA,MAAa,WACX,QACuC,YAAY,KAAK,EAAE;AAE5D,MAAM,iBAAoC,SAA4B;;;AC9HtE,MAAa,aACX,IACA,YACA,OAMA,WAAW,MACX,QAAQ,KAAK,IAAG,MAEhB,OAA0C,EAAE,MAAM,YAAW;CAC3D,MAAM,MAAM;EACV,WAAW,KAAK;EAChB,UAAU;EACV,QAAQ;EACR,GAAI,YAAY,EAAE,aAAa,EAAE,OAAO,WAAU,EAAE;;CAEtD,IAAI,QAAQ,YAAY,GAAG;CAI3B,MAAM,SAAS,KAAK,IAAG;CACvB,OAAO,GAAG,QAAkC,GAAG,CAAC,CAC7C,MACC,WAAS;EACP,IAAI,WAAW,YAAY,KAAK,IAAG,IAAK,KAAK;EAC7C,IAAI,YAAY,YAAY,SAAS,KAAK;EAC1C,MAAM,IAAI;EACV,IACE,UACA,aACC,YACC,QACE,KAAK,UAAU,GAAG,CAAC,CAAC,WAClB,sBACA,KAAK,UAAU,EAAE,OAAO,aAAa,CAAC,CACvC,GAEL,QACA,QACA,KAAK,IAAG,IAAK,KAAK;EAEpB,OAAO;CACT,GACA,OAAM,QAAM;EACV,IAAI,OAAO,KAAK,GAAG;EACnB,QAAQ,MAAM,GAAG;EACjB,MAAM,IAAI,cAAa,CAAE,CAAC;EAC1B,MAAM,IAAI,MAAM,GAAG;CACrB,CAAC;AAEP,CAAC;;;ACxDH,MAAa,eAAwB,IAAuB,OAA+C;CACzG,IAAI,CAAC,IAAI,OAAO;CAChB,aAAY;EACV,MAAM,EAAE,MAAM,MAAM,UAAU,GAAE;EAEhC,OAAO;GACL,MAAMK,KAAE,MAAM,EAAE,MAAM,GAAG,WAAW;IAAE,MAAM,YAAY,MAAM,EAAE;IAAG,GAAG;GAAG,EAAG;GAC5E,aAAa,GAAE,GAAI,KAAI;GACvB,OAAO,YAAW;IAChB,MAAM,GAAE;IACR,MAAM,MAAK;GACb;;CAEJ;AACF;;;ACAA,MAAM,SAAS,OAAe,IAAI,SAAc,MAAK,WAAW,GAAG,EAAE,CAAC;AAEtE,MAAM,qBAAqB,KAAK,OAAM,GAAG,UAAW,qBAAmB;AAEvE,MAAa,sBAAsB,OAAO,OAA8B;CAItE,QAAO,MAFS,GAAG,MACQ,CAAO,CAAC,QAAsC,EAAE,cAAc,EAAC,CAAE,GACxE;AACtB;AAEA,eAAe,mBAAmB,SAAkB;CAIlD,QAAO,MAHc,QAAQ,QAE1B,EAAE,kBAAkB,EAAC,CAAE,GACZ,SAAS,qBAAqB,MAAM;AACpD;AAEA,eAAsB,oBACpB,IACA,SACA,EAAE,SAAS,GAAG,YAAY,QAAoD,IAAE;CAEhF,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO;CACpC,MAAM,WAAW,KAAK,IAAG,IAAK;CAE9B,OAAO,MAAM;EACX,MAAM,SAAS,MAAM,mBAAmB,OAAO;EAC/C,IAAI,UAAU,OAAO,KAAK,OAAO,KAAK,GAAG;EAEzC,IAAI,KAAK,IAAG,IAAK,UACf,MAAM,IAAI,MAAM,kEAAkE;EAEpF,MAAM,MAAM,MAAM;CACpB;AACF;AAEA,gBAAuB,UAAU,IAAM;CACrC,IAAI,SAAS,MAAM,oBAAoB,EAAE;CACzC,MAAM,gBAAgB;CAEtB,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,WAAuB,UAAU;CAEpE,OAAO,MAAM;EACX,MAAM,SAAS,KAAK,KAClB;GACE,IAAI,EAAE,KAAK,OAAM;GACjB,KAAK,CACH;IACE,IAAI,OAAO,IAAI,GAAG,UAAS,mCAAoC;IAC/D,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,EAAC;MAEvB;IACE,IAAI;IACJ,IAAI;IACJ,cAAc,EACZ,YAAY;KACV,IAAI,OAAO,IAAI,GAAG,UAAS,mCAAoC;KAC/D,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,EAAC;;;KAM/B;GACE,UAAU;GACV,WAAW;GACX,iBAAiB;GAClB;EAGH,IAAI;GACF,WAAW,MAAM,QAAQ,QACvB,KAAK,MAAM,OAAO,KAAK,OAAO,MAAO,KAAK,EAAE,cAA+B,CAAC,IAAI,GAAG;IACjF,IAAI,KAAK,KAAK;IACd,IAAI,IAAI,OAAO,OAAO,SAAS,IAAI,GAAG;KACpC,MAAM,SAAS,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;KACzC,OAAO,OAAO,KAAK;KACnB,MAAM;MAAE;MAAQ;KAAG;IACrB,OAAO;KAEL,IAAI,IAAI,EAAE,UAAU,GAClB,MAAM,IAAI,MAAM,mCAAmC,KAAK,UAAU,GAAG,GAAG;KAE1E,MAAM,gBAAgB;KACtB,MAAM,OAAO,IAAI,EAAE;KACnB,KAAK,MAAM,YAAY,MACrB,IAAK;MAAC;MAAK;MAAK;KAAG,CAAW,CAAC,SAAS,QAAQ,GAC9C,cAAc,KAAK,GAAG,OAAO,KAAK,KAAK,SAA0B,CAAC;UAC7D,IAAI,SAAS,WAAW,GAAG,GAChC,cAAc,KAAK,SAAS,MAAM,CAAC,CAAC;KAGxC,MAAM;MAAE,QAAQ,IAAI,IAAI,aAAa;MAAG;KAAG;IAC7C;GACF;EAEJ,SAAS,GAAG;GACV,IAAI,oDAAoD;GACxD,QAAQ,MAAM,CAAC;GACf,SAAS,MAAM,oBAAoB,EAAE;GACrC,MAAM;EAER,UAAU;GACR,IAAI,kBAAkB;GACtB,MAAM,OAAO,MAAK,CAAE,CAAC,YAAW,CAAE,CAAC;EACrC;EAEA,MAAM,MAAM,aAAa;CAC3B;AACF;AAEA,MAAM,2BAAW,IAAI,IAAG;AAYxB,IAAI,UAAU;AAEd,MAAM,oBAAsB;CAC1B,IAAI,gBAAiC,CAAE;CAEvC,OAAO;EAAE,aADS,SAAW,MAAM,UAAU,CACpC;EAAS;CAAO;AAC3B;AAEA,MAAM,OAAO,OAAO,OAAU;CAC5B,IAAI,qBAAqB;CACzB,IAAI,SAAS,YAAW;CACxB,IAAI,QAAwB;CAC5B,MAAM,MAAM,YAAW;EACrB,WAAW,MAAM,SAAS,UAAU,EAAE,GAAG;GACvC,IAAI,OAAO,OAAO,SAAS,GAAG;GAC9B,QAAQ,SAAS,QAAQ,CAAC,GAAG,OAAO,KAAK,IAAI;GAC7C,OAAO,QAAO;EAChB;CACF;CACA,IAAG;CACH,MAAM,OAAO,mBAAe;EAC1B,OAAO,MAAM;GACX,MAAM,OAAO;GACb,MAAM,IAAI;GACV,QAAQ;GACR,SAAS,YAAW;GACpB,MAAM;EACR;CACF;CACA,WAAW,MAAM,UAAU,KAAI,GAAI;EACjC,IAAI,CAAC,QAAQ;GACX,IAAI,0CAA0C;GAC9C,KAAK,MAAM,KAAK,SAAS,OAAM,GAC7B,KAAK,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAM,CAAE,GACjC,GAAG,IAAI;GAGX;EACF;EACA,KAAK,MAAM,EAAE,QAAQ,SAAS,QAAQ;GACpC,MAAM,IAAI,SAAS,IAAI,IAAI,EAAE;GAC7B,IAAI,CAAC,GAAG;GACR,KAAK,MAAM,EAAE,IAAI,MAAM,KAAK,WAAW,CAAC,GAAG,EAAE,OAAM,CAAE,GACnD,IAAI,CAAC,SAAS,IAAI,OAAO,MAAO,QAAQ,OAAO,OAAQ,KAAK,MAAK,MAAK,OAAO,IAAI,CAAC,CAAC,IAAI;IACrF,GAAG,GAAG;IACN,IAAG;GACL;EAEJ;CACF;AACF;AAEA,MAAM,YACJ,MACA,MACA,OACA,OACE;CACF,MAAM,KAAK,KAAK;CAChB,IAAI,IAAI,SAAS,IAAI,EAAE;CACvB,IAAI,CAAC,GAAG,SAAS,IAAI,IAAK,oBAAI,IAAI,IAAG,CAAG;CACxC,MAAM,KAAK,OAAO,WAAU;CAC5B,MAAM,YAAW;EACf,EAAG,OAAO,EAAE;EACZ,IAAI,EAAG,SAAS,GAAG,SAAS,OAAO,EAAE;CACvC;CACA,EAAE,IAAI,IAAI;EAAE;EAAI;EAAM;EAAO;CAAG,CAAE;CAClC,IAAI,CAAC,SAAS;EACZ,UAAU;EACV,KAAK,KAAK,EAAE,EAAE;CAChB;CACA,OAAO;AACT;AAOA,IAAI,iBAAuC;AAE3C,MAAa,kBAAkB,OAC7B,EAAE,YAAY,YAAY,GAAG,WAAW,KACxC,eACE;CACF,MAAM,EAAE,OAAO,WAAW;CAC1B,OAAO,mBAAmB,QAAQ,KAC/B,MAAM,GAAG,gBAAgB,IAAI,EAAE,UAAU,KAAI,CAAE,CAAC,CAAC,QAAO,GAAI,KAC3D,MACE,KAAK,GACF,WAAW,EAAE,IAAI,CAAC,CAClB,WAAW,EAAE,WAAW,aAAY,EAAE,GAAI,CAAC,EAAE,MAAM,EAAE,WAAW,iBAAgB,EAAE,CAAE,CAAC,CAAC,CAC5F,CACF,CAAC,WAAU,CAAE,CAAC;CAEf,MAAM,aAA2C;EAAE,GAAI,IAAI,iBAAkD,IAAG,MAAK,CAAC,IAAI;EAAK,WAAW;CAAC;CAE3I,IAAI,SAAS,YAAW;CACxB,SAAS,YAAY,IAAI,OAAO,KAAK,UAAU,IAAI,MAAM,IAAG,QAAM;EAChE,IAAI,YAAY,mBAAmB,GAAG;EACtC,OAAO,QAAQ,GAAG;CACpB,CAAC;CAED,OAAO;EACL,SAAS,YAAW;GAClB,MAAM,MAAM,MAAM,OAAO;GAEzB,MAAM,QAAQ,KAAK,IAAG;GACtB,IAAI,KAAK,MAAM,oBAAoB,WAAW,EAAE,IAAI,IAAI,EAAE;GAC1D,IAAI,YAAY,oBAAoB,KAAK,IAAG,IAAK,KAAK;GACtD,OAAO,OAAO;EAChB;EACA,OAAO,YAAW,CAAE;;AAExB;;;ACzOA,MAAa,UAKT;CACF,aAAa,GAAG,SAAS,CACvB,EAAE,WAAW,GAAG,IAAI,GACpB;EAAC,OAAO,EAAE,eAAc;EAAqB;EAAM;CAAG;CAExD,aAAa,GAAG,SAAS,CACvB,EAAE,WAAW,GAAG,IAAI,GACpB;EAAC,OAAO,EAAE,eAAc;EAAqB;EAAM;CAAG;;;;ACZ1D,MAAM,mBAAmB,kBAAsE;CAC7F,QAAQ,IAAI,SAAS,cAAc,IAAI,KAAK,OAAO,OAAO,CAAC;AAC7D;AACA,MAAM,WACH,IAAc,6BACE,GAAG,SAAwC;CAC1D,MAAM,aAAa,wBAAqC,IAAI,IAAI;CAChE,OAAO,cAAe,EAAE,MAAK,UAAS,YAAW,MAAK,EAAE,IAAI,KAAK,CAAC,EAAC;AACrE;AACF,MAAM,OAAkC,IAAc,MACpD,EAAE,WAAW,IACT,UACsB,MAAkC,WAAU,CAAU,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,EAAC,CAAE;AACrG,MAAMC,WAAiC,IAAI,MAAO,EAAE,WAAW,KAAI,MAAK,EAAE,EAAE,EAAG,IAAI,IAAI,IAAI,CAAC;AAC5F,MAAa,OAAiB,QAAQ,QAAQ,gBAAgBA,OAAK,CAAC;AACpE,MAAa,OAAiB,QAAQ,QAAQ,gBAAgB,GAAG,CAAC;AAClE,MAAa,MAAgB,QAAQ,OAAO,gBAAgBA,OAAK,CAAC;;;ACvBlE,MAAa,YAAY,OAAkB,KAAK,OAAM,GAAG,UAAW;CAAE,GAAG,GAAG,OAAO;CAAI,GAAG;AAAC,CAAE;AAE7F,MAAa,kBACX,MACA,UACE;CAIF,MAAM,EAAE,YAAY,WAAW,KAAK,UAAU;CAC9C,MAAM,eAAe,cAAc,UACjC,OAA0D,YAAY;EACpE,WAAW,CAAC,aAAa,CAAC;EAC1B,KAAK,CAAC,OAAO,CAAC;EACf,CAAC;CAGJ,MAAM,iCAA6D,cAAc,OAAO,OACtF,iBAAgE,aAAa,GAAG,MAC7E,MAAM,MAAM,EAAE,WAAW,GAAG,IAAK,KAAI,CAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAC5E;CAEH,MAAM,YAAY,iCAAiC,KAAK,KAAK,GAAG,8BAA8B,IAAI;CAClG,MAAM,eACJ,QACA,YAAY,UACgC;EAC5C,MAAM,YAAY,KAChB,SACI,KAAI,CAAS,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,MAAM,SAAS,OAAO,EAAE,CAAC,CAAC,IAC5D,KAAI,CAAK,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,IAAmB,IAAI,CAAC,GAC1D,SAAS,OAAO,SAAS,MAAM,KAAK,GACpC,YAAY,MAAM,SAAS;EAE7B,MAAM,KAAK,KAAI,CAAW,CACvB,KAAK,QAAQ,SAAS,CAA6B;EACtD,OAAQ,eAAe,GAAG,KAAK,YAAY,IAAI;CACjD;CACA,OAAO;EAAE;EAAa;CAAS;AACjC;;;ACAA,MAAa,cAA4B;AACzC,MAAMC,cAMJ,MACA,OACA,YACA,OAAO,OACP,OACA,QAAoC,OAC6B;CAGjE,MAAM,EAAE,YAAY,YAAY,UAAU;CAE1C,MAAM,EAAE,aAAa,cAAc,eAAe,MAAM,KAAK;CAE7D,MAAM,KAAK,WAAW,EAAE,IACtB,OAAO,WAAW;CAEpB,MAAM,OAAOJ,SACV,WAAW,KAAK,CAAC,CACjB,wBAAO,IAAI,MAAK,GAAG,QAAQ,EAAE,CAAC,CAC9B,OAAO,WAAW;CACrB,IAAI,CAAC,YAAY,aAAa,YAAY,cAAc;MACnD,IAAI,YAAY,eAAe,MAAM,MAAM,IAAI,MAAM,cAAc,WAAU,cAAe;CAEjG,MAAM,OAAO,GAAG,WAAiB,QAAQ;CACzC,MAAM,qBAAqB,GAAG,WAAsB,OAAO,MAAM,aAAa,WAAW;CAEzF,MAAM,MAAM;CACZ,MAAM,OACJ,YACA,UACsC;EAKtC,MAAM,eAAe,YAAW;GAC9B,MAAM,mBAAmB,KAAI,CAAE,CAAC,MAAM,IAAI;GAC1C,IACE,+BACA,YACA,OAAO,mBAAmB,eAAc,UAAW;GAErD,IACE,QACA,CAAC,GAAI,SAAS,IAAI,mBAAmB,cAAc,CAAC,EAAE,KAAI,KAAM,EAAG,GACnE,gCAAgC;GAElC,SAAS,OAAO,mBAAmB,cAAc;EACnD;EACA,MAAM,QAAQ,YAAY,QAAQ,IAAI,CAAC,aAAY,GAAI,KAAK,UAAU,EAAE,KAAK,WAAU,CAAE,CAAC,CAAC;EAE3F,MAAM,YAAY,MAAiC,OAAgC;GACjF,OAAO,mBAAmB;IAAE;IAAM,MAAM,KAAI;IAAI;GAAK,IAAK,EAAE;EAC9D;EACA,MAAM,YACH,MAA0B,SAC1B,MAAkB,OAAe,QAAsC;GACtE,MAAM,SAAS,MAAM,EAAE;GACvB;GACA,MAAM;IAAE;IAAK,OAAO,GAAG,WAAU,MAAO,WAAW,eAAc,IAAK;GAAO;;EAEjF,MAAM,OAAO,SAAS,IAAI,GAAG;EAE7B,MAAM,OAAe;GACnB,OAAO,MAAM;GACb,iBAAiB,WAAW,IAAI,IAAI;GACpC,YAAY,WAAW,IAAI,KAAK;GAChC,OAAO,KAAK,OAAO,IAAI,KAAI,CAAE,CAAC,CAAC,IAAG;GAClC,SAAS;GACT,UAAU,WAAW,UAClB,OAAiB;IAChB,YAAY,EAAE,WAAW;IACzB,QAAQ,EAAE;IACV,QAAQ,EAAE;KACV;;EAKN,MAAM,cAAc,QAAQ,QAAQ,KAAK,OAAO,sBAAsB,CAAC;EACvE,MAAM,OAAW,SAAS,KAAK;EAG/B,MAAM,QAAQ,YAAiB;GAC7B,IACE,oBACA,YACA,OAAO,mBAAmB,eAAc,2EAA4E;GAEtH,MAAM,mBAAmB,WACvB,EAAE,SAAS,KAAI,GACf,EAAE,MAAM;IAAE,SAAS;IAAO,OAAO;GAAI,EAAE,CAAE;GAE3C,IAAI,yBAAyB,UAAU;GAEvC,OAAO,KAAK,OAAO,iBAAiB;EACtC;EAEA,MAAM,cACJ,QAAQ,IAAI,CACV,KAAK,QAAQ;GAAE,KAAK;GAAY;GAAM,KAAK;EAAI,CAAE,GACjD,KAAK,QAAQ,EAAE,KAAK,WAAU,CAAE,EACjC,CAAC,CAAC,MAAK,OACN,KACE,QAAQ,EAAE,GACV,GAAG,KACC,sCAAsC,GAAG,EAAE,CAAC,OAC5C,GAAG,KACD,oBACA,aAAa,CACpB;EAEL,MAAM,WACH,CAAC,MAAM,YACR,YAAiB;GACf,MAAM,iBAAiB,OACrB,SACE;IACF,IAAI,CAAC,KAAK,MAAM;IAChB,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,QAAQ,MAAM,KAAK,KAAK;IAC1D,MAAM,EAAE,YAAY,QAAQ,WAAW;KACrC,YAAY,GAAG,WAAc,CAAC;KAC9B,QAAQ;KACR,QAAQ;;IAEV,MAAM,CAAC,QAAQ,OAAO,QAAQ,OAAO,CAAC,YAAY,MAAM;IACxD,IAAI,YAAY,OAAO,mBAAmB,eAAc,YAAa,GAAG,GAAG;IAC3E,MAAM,QAAQ,IAAI,CAAC,aAAY,GAAI,MAAM,CAAC;IAC1C,IAAI,iBAAiB,OAAO,mBAAmB,eAAc,YAAa,GAAG,GAAG;GAClF;GACA,IAAI,CAAC,MAAM;IACT,IAAI,sBAAsB,YAAY,IAAI;IAC1C,MAAM,eAAe,UAAU,EAAE,KAAI,CAAE;GACzC;GACA,IAAI,kBAAkB;GAEtB,MAAM,YACJ,oBACA,EAAE,QAAQ,EAAC,GACX;IACE,yBAAyB,EAAE,QAAQ,KAAI;IACvC,MAAM,YAAY,KAAI;IACvB;GAGH,MAAM,YACJ,oBACA,EAAE,SAAS,EAAC,GACZ;IACE,yBAAyB,EAAE,SAAS,KAAI;IACxC,MAAM,aAAa,KAAI;IACxB;GAGH,MAAM,YACJ,oBACA;IAAE,SAAS;IAAG,OAAO;IAAG,QAAQ;GAAC,GACjC;IACE,yBAAyB;KAAE,SAAS;KAAM,OAAO;KAAM,QAAQ;IAAI;IACnE,MAAM,mBAAmB,KAAI;IAC9B;GAGH,MAAM,YACJ,oBACA;IAAE,SAAS;IAAG,OAAO;GAAC,GACtB;IACE,yBAAyB;KAAE,SAAS;KAAM,OAAO;IAAI;IACrD,MAAM,sBAAsB,KAAI;IACjC;GAGH,MAAM,YACJ,oBACA,EAAE,SAAS,EAAC,GACZ;IACE,yBAAyB;KAAE,SAAS;KAAM,OAAO;KAAM,QAAQ;IAAI;IACnE,MAAM,mBAAmB,KAAI;IAC9B;GAEH,MAAM,iBAAiB,IAAI,IAAI;GAC/B,MAAM,GAAG,QAAQ;IACf,SAAS;IACT,8BAA8B,EAAE,SAAS,KAAI;IAC9C;GACD,MAAM,YACJ,YACA,EAAE,WAAW,EAAC,GACd,YACI;IACE,yBAAyB,UAAU,IAAI,KAAI,CAAE;IAC7C,MAAM,oBAAoB,KAAI;OAEhC,EAAE;GAER,MAAM,QAAO;GAEb,MAAM,QAAO;GACb,OAAO,SAAS,EAAE,CAAC,CAAC,YAAW;IAE7B,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,GAAI,CAAC;IACtD,OAAO,KAAK,MAAM,IAAI,GAAG,2BAA2B;GACtD,GAAG,oCAAoC;EACzC;EAGF,MAAM,SAAS,WAAkD,YAAiB;GAChF,MAAM,aAAwC,GAC5C,QAAQ,KAAI,CAAK,CAAC,GAAG,WAAW,CAAC,CAAC,KAAI,GAAI,GAAG,CAAC,CAC/C,CAAC,GAAG;GACL,MAAM,QAAQ,QAAQ,IAAW,YAAY,KAAK,IAAI;GAEtD,MAAM,aAA2C,cAC/C,MAAsB;IACpB,OAAO,CAAC,SAAS,SAAS,IAAI,OAAO,KAAI,CAAK,CAAC,KAAI,GAAI,GAAG,IAAI,KAAI,CAAK,CAAC,KAAI,CAAE;IAC9E,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC;IAC9B,KAAK,CAAC,OAAO,KAAI,CAAS,CAAC,GAAG,KAAK,CAAC,CAAC,KAAI,CAAE;IAC5C,CAAC;GAGJ,MAAM,eAAe,YAAY,MAAM,CAAC,CACrC,KAAK,UAAU,CAAC,CAChB,KACC,QAA8C;IAC5C,MAAM;IACN,IAAI,KAAI,CAAa,CAAC,GAAG,KAAK;IAC9B,QAAQ;IACR,MAAM,EACJ,KAAK,CAAC,OAAO,KAAI,CAAW,CAAC,KAAI,CAAE;IAErC,aAAa,KAAI,CAA+B,CAAC,KAC/C,cACE,IACE,GAAuC,KAAI,CAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,CAAE,CAAC,CAC3E,IAAG,CAAW,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,KAAI,CAAE,GAE1C,KAAI,CAAa,CAAC,KAAI,GACtB,aAAa,KAAI,CAAa,CAAC,KAAI,GAAI,IAAG,CAAW,CAAC,KAAK,CAAC,CAAC,KAAI,CAAE,CAAC,CACrE,CACF,CACF,CAAC;IACF,gBAAgB;IACjB,CAAC,CACH,CAAC;GAEJ,MAAM,SAAS,MAAM,WAAU;GAE/B,MAAM,IAAI,MAAM,UAAiB,IAAI,aAAY,MAC/C,EAAE;IAAE,MAAM;IAAY,OAAO;GAAY,CAAE,CAAC;GAE9C,MAAM,QAAQ,KAAK,IAAG;GACtB,MAAM,MAAM,MAAM,mBAAmB,WAAW;IAAE,SAAS;IAAM,OAAO;IAAM,QAAQ;GAAI,CAAE;GAC5F,IACE,4CACA,KAAK,IAAG,IAAK,OACb,KACA,OAAO,mBAAmB,eAAc,4DAA6D;GAEvG,OAAO,KAAK,MAAM;IAAE,QAAQ;IAAG,IAAI,QAAQ;IAAI;GAAM,CAAE,GAAG,6BACxD,OAAO,MAAK,CAAE;EAElB;EAMA,MAAM,mBAA+B,gBAAgB,MAAM,UAAU;EACrE,MAAM,SACH,SACD,YAAiB;GACf,MAAM,EAAE,QAAQ,IAAI,WAAW;GAC/B,MAAM,QAAQ,KAAK,IAAG;GAEtB,IAAI,YAAY,YAAY,sBAAsB,KAAK,IAAG,IAAK,KAAK;GACpE,MAAM,QAAQ,OAAO;GACrB,MAAM,SAAS,WAAW,IAAI,KAAK;GACnC,MAAM,KAAK,UAAU,EAAE,KAAK,WAAU,GAAI,EAAE,MAAM,EAAE,KAAK,EAAC,EAAE,GAAI,EAAE,QAAQ,KAAI,CAAE;GAEhF,MAAM,UAAU,OAAO,QAAO;GAC9B,MAAM,YAAY,MAAM,UACtB,IACA,aACA,MACE,EAAmC;IACjC,MAAM;IACN,OAAO,KAAI,CAAwB,CAChC,KAAK,QAAQ,KAAI,CAAwB,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,IAAa,IAAI,CAAC,CAAC,CAAC,CAAC,CACjF,KACC,MACE,IAAG,CAA6B,CAAC,EAC/B,QAAQ,CACN,UACA,GAAG,QAAQ,KAAI,CAAwB,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,GAAI,GAAG,CAAC,IAEpE,CAA0C,CAC5C,CACF,CACA,KAAK,MAAM,KAAK,CAAC,CACjB,KAAK,MAAM,CAAC,CAAC;IACjB,GACH,OACA,KAAK;GAEP,OAAO,KACL,MAAM;IAAE,IAAI,OAAO,OAAO;IAAe;IAAW;IAAQ;IAAS;GAAK,CAAE,GAC5E,gCAAgC;EAEpC;EAGF,MAAM,SAAS,MAAS,YAAiB;GACvC,IACE,YACA,sCAAsC,mBAAmB,eAAc,8CAA+C;GAExH,MAAM,mBAAmB,WAAW;IAAE,SAAS;IAAM,OAAO;GAAI,CAAE;GAClE,IAAI,iCAAiC;GACrC,OAAO,KAAK,MAAM,CAAC,GAAG,6BAA6B;EACrD;EAUA,MAAM,SAAS,MAAS,YAAiB;GACvC,IACE,+BACA,OAAO,mBAAmB,eAAc,kGAAmG;GAE7I,MAAM,QAAQ,KAAK,IAAG;GACtB,MAAM,mBAAmB,WAAW,EAAE,SAAS,KAAI,GAAI,CACrD,EACE,MAAM;IACJ,SAAS;IACT,OAAO;IACP,QAAQ;OAGb;GACD,IAAI,gCAAgC,KAAK,IAAG,IAAK,KAAK;GACtD,OAAO,KAAK,MAAM,CAAC,GAAG,eAAe;EACvC;EAGA,MAAM,SAAS,MAAS,YAAiB;GACvC,MAAM,QAAQ,KAAK,IAAG;GACtB,MAAM,QAA4B,EAChC,MAAM;IACJ,IAAI,EAAE;IACN,KAAK;;GAGT,IAAI,EAAE,OAAO,MAAM,OAAO;IAAE,GAAG,MAAM;IAAM;GAAI;GAC/C,MAAM,KAAK,UAAU,EAAE,KAAK,WAAU,GAAI,OAAO,EAAE,QAAQ,KAAI,CAAE;GACjE,IACE,kBACA,KAAK,IAAG,IAAK,OACb,OAAO,KAAK,eAAc,uBAAwB,WAAU,QAC5D,OACA,qBAAqB;GAEvB,OAAO,MAAM,CAAC;EAChB;EAEA,MAAM,SAAS,MAAgB;GAC7B,OAAO,SAAS,EAAE,UAAU,OAAO,UAAU,CAAC,OAE1C,EAAE,QAAQ,MAAK,QACb,MACI,KAAK,MAAM;IAAE,KAAK;IAAY,IAAI,EAAE;GAAE,CAAE,GAAG,SAAS,IACpD,MAAM;IAAE,GAAG;IAAG,SAAS,EAAE,OAAO,QAAO;GAAE,CAAE,CAAC,GAEpD,iBAAiB;EAErB;EACA,OAAO,OACH,eAAe,QAAQ,QAAQ,KAAK,MAAM,IAAI,GAAG,2BAA2B,CAAC,CAAC,IAC9E;CACN;CACA,MAAM,YAAY,KAAI,CAAa,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAW,IAAI,CAAC;CACrE,OAAO;EACL,SAAQ,MACN,EAAwB;GACtB,MAAM;GACN,OAAO,QAAQ,SAAS;GACxB,MAAM,SAAS,MAAM,GAAG;GACzB;EACH,KAAK;;AAET;AASA,MAAa,WACX,MAGA,YACA,OAAO,OACP,UAEA,MACE,UAASI,WAAS,MAAM,OAAO,YAAY,MAAM,OAAO,KAAK,KAAK,GAClE,WAAU,GACV,aACA,UAAU;;;ACzbd,MAAMA,cAMJ,MACA,OACA,YACA,UAC+D;CAC/D,MAAM,OAAOJ,SACV,WAAW,KAAK,CAAC,CACjB,wBAAO,IAAI,MAAK,GAAG,QAAQ,EAAE,CAAC,CAC9B,OAAO,WAAW;CACrB,IAAI,CAAC,YAAY,aAAa,YAAY,cAAc;MACnD,IAAI,YAAY,eAAe,MAAM,MAAM,IAAI,MAAM,yBAAyB;CAEnF,MAAM,EAAE,YAAY,YAAY,WAAW,KAAK,UAAU;CAE1D,MAAM,iCACJ,cACA,OAAO,OACL,iBAAgE,aAAa,GAAG,MAC7E,MAAM,MAAM,EAAE,WAAW,GAAG,IAAK,KAAI,CAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAC5E;CAEL,MAAM,YAAY,iCACd,KAAK,KAAK,GAAG,8BAA8B,IAC3C;CAEJ,MAAM,MAAM;CACZ,MAAM,KAAK,WAAW,EAAE,IACtB,OAAO,WAAW;CACpB,MAAM,OAAO,GAAG,WAAiB,QAAQ;CAIzC,MAAM,eACJ,cACA,UACE,OAA2C,YAAY;EACrD,WAAW,CAAC,aAAa,CAAC;EAC1B,KAAK,CAAC,OAAO,CAAC;EACf,CAAC;CAEN,MAAM,aAAa,KAAI,CAAK,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,IAAmB,IAAI,CAAC;CAEzE,MAAM,UAAU,WAAiD;EAC/D,MAAM,YAAkC,KACtC,UAAU,KAAI,CAAS,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,OAAO,SAAS,OAAO,EAAE,CAAC,CAAC,GACvE,WACA,YACA,SAAS,MAAM,KAAK,CAAC;EAEvB,MAAM,KAAK,KAAI,CAAW,CAAC,KAAK,QAAQ,SAAS,CAAmC;EACpF,QAAQ,eAAe,GAAG,KAAK,YAAY,IAAI,IAAI,KAAsB,KAAK;CAChF;CAEA,MAAM,OACJ,eACsC;EAKtC,MAAM,QAAQ,YAAW,CAAE;EAC3B,MAAM,YAAY,MAAiC,OAAgC;GACjF,OAAO,mBAAmB;IAAE;IAAM,MAAM,KAAI;IAAI;GAAK,IAAK,EAAE;EAC9D;EACA,MAAM,QAAQ,MAAkB,OAAe,QAAsC;GACnF,MAAM,SAAS,MAAM,EAAE;GACvB,MAAM;GACN,MAAM;IAAE;IAAK;GAAK;;EAGpB,MAAM,OAAe;GACZ;GACP,iBAAiB,WAAW,IAAI,IAAI;GACpC,YAAY,WAAW,IAAI,KAAK;GAChC,OAAO,KAAK,OAAO,IAAI,KAAI,CAAE,CAAC,CAAC,IAAG;GAClC,SAAS;GACT,UAAU,WAAW,UAClB,OAAiB;IAChB,YAAY,EAAE,WAAW;IACzB,QAAQ,EAAE;IACV,QAAQ,EAAE;KACV;;EAKN,MAAM,cAAc,QAAQ,QAAQ,KAAK,OAAO,iBAAiB,CAAC;EAClE,MAAM,OAAW,SAAS,KAAK;EAG/B,MAAM,QAAQ,YAAiB;GAC7B,IAAI,kBAAkB;GACtB,MAAM,iBAAiB,IAAI,IAAI;GAC/B,MAAM,GAAG,QAAQ;IACf,SAAS;IACT,8BAA8B,EAAE,SAAS,KAAI;IAC9C;GAED,MAAM,YACJ,YACA,EAAE,WAAW,EAAC,GACd;IACE,yBAAyB,EAAE,WAAW,EAAE,KAAK,KAAI,EAAE;IACnD,MAAM,eAAe,KAAK,OAAM,GAAG,KAAK,CAAE,CAAC,SAAS,QAAQ;IAC7D;GAGH,IAAI,kBAAkB;IAAE;IAAY;GAAI,CAAE;GAC1C,MAAM,KAAK,MAAM,QAAQ,IAAI,CAC3B,KAAK,QAAQ;IAAE,KAAK;IAAY;GAAI,CAAE,GACtC,KAAK,QAAQ,EAAE,KAAK,WAAU,CAAE,EACjC;GACD,IAAI,mBAAmB;IAAE;IAAY;GAAE,CAAE;GACzC,OAAO,KAAK,QAAQ,EAAE,GAAG,iBAAiB;EAC5C;EACA,MAAM,WACH,CAAC,MAAM,YACR,YAAiB;GACf,MAAM,iBAAiB,OACrB,SACE;IACF,IAAI,CAAC,KAAK,MAAM;IAChB,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,QAAQ,MAAM,KAAK,KAAK;IAC1D,MAAM,EAAE,YAAY,QAAQ,WAAW;KACrC,YAAY,GAAG,WAAc,CAAC;KAC9B,QAAQ;KACR,QAAQ;;IAEV,MAAM,CAAC,QAAQ,OAAO,QAAQ,OAAO,CAAC,YAAY,MAAM;IACxD,IAAI,YAAY,GAAG,GAAG;IACtB,MAAM;IACN,IAAI,iBAAiB,GAAG,GAAG;GAC7B;GACA,IAAI,UAAU,CAAC,MAAM,MAAM,eAAe,MAAM;GAChD,OAAO;IACL,MAAM,SAAS,YAAW;KACxB,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,GAAI,CAAC;KACtD,OAAO,KAAK,MAAM,IAAI,GAAG,2BAA2B;IACtD,CAAC;IACD,MAAM;IACN,MAAM;KAAE,OAAO;KAAsC,KAAK;IAAS;;EAEvE;EAIF,MAAM,mBAA+B,gBAAgB,MAAM,UAAU;EACrE,MAAM,SAAS,WAAkD,YAAiB;GAChF,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC,KAAK,WAAW,IAAI,WAAW,IAAI,CAAC,CAAC,CAAC;GACjE,MAAM,SAAS,MAAM,WAAU;GAE/B,MAAM,UAAU,OAAO,QAAO;GAC9B,MAAM,YAAY,MAAM,UAAmB,IAAI,aAAY,MACzD,EAAoB;IAClB,MAAM;IACN,OAAO;IACR,CAAC;GAGJ,OAAO,KACL,MAAM;IAAE;IAAW,IAAI,UAAU,OAAO;IAAe;IAAQ;GAAO,CAAE,GACxE,uBACM,OAAO,MAAK,CAAE;EAExB;EAUA,MAAM,SAAS,MAAS,YAAiB;GACvC,MAAM,KAAK,UAAU,EAAE,KAAK,WAAU,GAAI,EAAE,MAAM;IAAE,IAAI,EAAE;IAAI;GAAI,EAAE,GAAI,EAAE,QAAQ,KAAI,CAAE;GACxF,OAAO,MAAM,CAAC;EAChB;EAEA,MAAM,SAAS,MAAgB;GAC7B,OAAO;IACL,MAAM,EAAE,UAAU,OAAO;IACzB,MAAM;KAAE,KAAK;KAAW,OAAO;IAAiB;IAChD,MAAM,eACJ,EAAE,QAAQ,MAAK,QACb,MACI,KAAK,MAAM;KAAE,KAAK;KAAY,IAAI,EAAE;IAAE,CAAE,GAAG,SAAS,IACpD,MAAM;KAAE,GAAG;KAAG,SAAS,EAAE,OAAO,QAAO;IAAE,CAAE,CAAC,CACjD;;EAGP;EACA,OAAO;CACT;CACA,OAAO,EACL,KAAK;AAET;AAQA,MAAM,kBAAqB,EAAE,KAAK,KAAI,CAAiB,CAAC,OAAM;AAC9D,MAAa,QACX,MACA,YACA,QAAoC,OAEpC,MACE,UAASI,WAAS,MAAM,MAAM,KAAK,YAAY,KAAK,GACpD,EAAE,KAAK,KAAI,CAAkC,CAAC,OAAM,IACnD,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,GAAG,CAAC,EAAC,IACtD,QAAQ;;;AC9OZ,MAAM,YAMJ,MACA,OACA,UACwB;CAExB,MAAM,EAAE,gBAAgB,eAAe,MAAM,KAAK;CAClD,MAAM,EAAE,eAAe;CACvB,QACE,eACqC;EACrC,MAAM,QAAiC,MAAM,IAAc,IAAI;EAC/D,MAAM,SAAS,YAAY,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;EACpE,QAAO,MACL,EAAoB;GAClB,MAAM;GACN,OAAO,KAAI,CAAW,CAAC;GACvB,MAAM;GACP;CACL;AACF;AAEA,MAAa,UACX,MACA,QAAoC,OAEpC,MACE,UAAS,SAAS,MAAM,OAAO,KAAK,GACpC,WAAU,GACV,aACA,UAAU","names":["id","concat","assertNotNull","crypto","str","n","first","executes"],"ignoreList":[],"sources":["../lib/expression/expr-base.ts","../lib/expression/arith.ts","../lib/utils/json.ts","../lib/utils/map-object.ts","../lib/expression/val.ts","../lib/expression/logic.ts","../lib/field/field.ts","../lib/accumulators/index.ts","../lib/aggregate/prefix.ts","../lib/expression/concat.ts","../lib/expression/array.ts","../lib/aggregate/raws.ts","../lib/aggregate/mongo-stages.ts","../lib/aggregate/group/utils/sub-group.ts","../lib/expression/date.ts","../lib/expression/range.ts","../lib/update/updater.ts","../lib/utils/coll.ts","../lib/aggregate/out.ts","../lib/aggregate/$merge.ts","../lib/aggregate/group/utils/sub-merge.ts","../lib/aggregate/group/$group-merge.ts","../lib/aggregate/set/$replace-with-each.ts","../lib/aggregate/set/$set-delta.ts","../lib/utils/guard.ts","../lib/predicate/utils.ts","../lib/predicate/$eq.ts","../lib/predicate/$expr.ts","../lib/predicate/$in.ts","../lib/aggregate/match/$match-delta.ts","../lib/aggregate/match/$match.ts","../lib/aggregate/unwind/$unwind-delta.ts","../lib/aggregate/unwind/index.ts","../lib/aggregate/lookup/$lookup-delta.ts","../lib/aggregate/lookup/$lookup-raw.ts","../lib/utils/before.ts","../lib/utils/log.ts","../lib/utils/db-indexes.ts","../lib/utils/merge/utils.ts","../lib/utils/merge/next-winner.ts","../lib/utils/merge/merge.ts","../lib/utils/merge/combiners.ts","../lib/machine.ts","../lib/aggregate/lookup/index.ts","../lib/aggregate/set/$set.ts","../lib/aggregate/$upsert.ts","../lib/stream/aggregate.ts","../lib/utils/tear-down.ts","../lib/watch.ts","../lib/boot/boot-utils.ts","../lib/query/logic.ts","../lib/boot/first-stages.ts","../lib/boot/boot.ts","../lib/boot/boot-simpl.ts","../lib/boot/single.ts"],"sourcesContent":["import type { rawItem } from '../../types'\nimport type { BoolExpr, Expr, ExprRaw } from '../types'\n\nexport const asExprRaw = <T, Doc, Ctx>(raw: rawItem) => ({ get: () => raw }) as ExprRaw<T, Doc, Ctx>\nexport const asExpr = <T, Doc, Ctx = unknown>(r: Pick<Expr<T, Doc, Ctx>, 'raw'>) =>\n r as Expr<T, Doc, Ctx>\n\nexport const asBoolExpr = <D1, D2, Ctx = unknown>(r: Pick<BoolExpr<D1, D2, Ctx>, 'raw'>) =>\n r as BoolExpr<D1, D2, Ctx>\n","import type { N } from '../..';\nimport type { Expr } from '../types'\nimport { asExpr, asExprRaw } from './expr-base'\n\nexport const max = <D, C>(...expr: Expr<number, D, C>[]) =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $max: expr.map(e => e.raw(f).get()) }),\n })\nexport const min = <D, C>(...expr: Expr<number, D, C>[]) =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $min: expr.map(e => e.raw(f).get()) }),\n })\n \nexport const lt: {\n <D, C>(...expr: [Expr<Date, D, C>, Expr<Date, D, C>]): Expr<boolean, D, C>\n <D, C>(...expr: [Expr<number, D, C>, Expr<number, D, C>]): Expr<boolean, D, C>\n} = <D, C>(...expr: [Expr<number | Date, D, C>, Expr<number | Date, D, C>]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $lt: expr.map(e => e.raw(f).get()) }),\n })\nexport const gt: {\n <D, C>(...expr: [Expr<Date, D, C>, Expr<Date, D, C>]): Expr<boolean, D, C>\n <D, C>(...expr: [Expr<number, D, C>, Expr<number, D, C>]): Expr<boolean, D, C>\n} = <D, C>(...expr: [Expr<number | Date, D, C>, Expr<number | Date, D, C>]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $gt: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const lte: {\n <D, C>(...expr: [Expr<Date | N, D, C>, Expr<Date | N, D, C>]): Expr<boolean, D, C>\n <D, C>(...expr: [Expr<number | N, D, C>, Expr<number | N, D, C>]): Expr<boolean, D, C>\n} = <D, C>(...expr: [Expr<number | Date | N, D, C>, Expr<number | Date | N, D, C>]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $lte: expr.map(e => e.raw(f).get()) }),\n })\nexport const gte: {\n <D, C>(...expr: [Expr<Date | N, D, C>, Expr<Date | N, D, C>]): Expr<boolean, D, C>\n <D, C>(...expr: [Expr<number | N, D, C>, Expr<number | N, D, C>]): Expr<boolean, D, C>\n} = <D, C>(...expr: [Expr<number | Date | N, D, C>, Expr<number | Date | N, D, C>]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $gte: expr.map(e => e.raw(f).get()) }),\n })\n\ntype Num = number | null | undefined\n\nexport function subtract<D, C>(\n ...expr: [Expr<number, D, C>, Expr<number, D, C>]\n): Expr<number, D, C>\nexport function subtract<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C>\n\nexport function subtract<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $subtract: expr.map(e => e.raw(f).get()) }),\n })\n}\n\nexport function add<D, C>(...expr: [Expr<number, D, C>, Expr<number, D, C>]): Expr<number, D, C>\nexport function add<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C>\n\nexport function add<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $add: expr.map(e => e.raw(f).get()) }),\n })\n}\n\nexport function divide<D, C>(...expr: [Expr<number, D, C>, Expr<number, D, C>]): Expr<number, D, C>\nexport function divide<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C>\n\nexport function divide<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $divide: expr.map(e => e.raw(f).get()) }),\n })\n}\n\nexport function multiply<D, C>(\n ...expr: [Expr<number, D, C>, Expr<number, D, C>]\n): Expr<number, D, C>\nexport function multiply<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C>\nexport function multiply<D, C>(...expr: [Expr<Num, D, C>, Expr<Num, D, C>]): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $multiply: expr.map(e => e.raw(f).get()) }),\n })\n}\n\nexport function floor<D, C>(expr: Expr<number, D, C>): Expr<number, D, C>\nexport function floor<D, C>(expr: Expr<Num, D, C>): Expr<Num, D, C>\nexport function floor<D, C>(expr: Expr<Num, D, C>): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $floor: expr.raw(f).get() }),\n })\n}\n\nexport function ceil<D, C>(expr: Expr<number, D, C>): Expr<number, D, C>\nexport function ceil<D, C>(expr: Expr<Num, D, C>): Expr<Num, D, C>\nexport function ceil<D, C>(expr: Expr<Num, D, C>): Expr<Num, D, C> {\n return asExpr<Num, D, C>({\n raw: f => asExprRaw({ $ceil: expr.raw(f).get() }),\n })\n}\n","import type { AsLiteral, Rec } from '../../types'\n\nexport const safeNarrow = <V>() => {\n return <T>(x: T & V) => x\n}\nexport const id = <T>(x: T) => x\nexport const defined = <T>(x: T | undefined | null): x is T => x != null\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const noop = () => {}\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const anoop = async () => {}\n\nexport const asRec = <K extends string, T>(x: Record<K, T>) => x as Rec<K, T>\n\nexport const map1 = <K extends string, Im>(k: AsLiteral<K>, to: Im) => {\n const k2: K = k\n return { [k]: [k2, to] } as { readonly [P in K]: [P, Im] } & { readonly [_: string]: [K, Im] }\n}\n","import type { App, Dict, HKT, I, IdHKT, Omit, RORec, StrKey } from '../../types'\nimport { id } from './json'\n\n\nexport type ExactPart<T, F extends HKT<T[StrKey<T>]>> = MapOPart<T, MappedHKT<T, F>>\n\nexport type ExactPart1<T, F extends HKT<StrKey<T>>> = {\n readonly [K in StrKey<T>]: App<F, K>\n}\n\ntype s = string\n\nexport type ExactKeys<K extends string> = Exact<RORec<K, 1>, IdHKT>\n\nexport type MapO<T, F extends HKT<K>, K extends StrKey<T> = StrKey<T>> = MapOPart<T, F, K> & {\n readonly [P: string]: readonly [K, unknown]\n}\n\nexport type MapK<K extends s, F extends HKT<K>> = MapO<RORec<K>, F>\n\nexport type MapOPart<T, F extends HKT<K>, K extends keyof T = StrKey<T>> = {\n readonly [P in K]: readonly [P, App<F, P & string>]\n}\nexport type MapKPart1<T, F extends HKT<K>, K extends StrKey<T> = StrKey<T>> = {\n readonly [P in K]: App<F, P>\n}\n\nexport type Exact<T, F extends HKT<T[StrKey<T>]>> = MapO<T, MappedHKT<T, F>>\n\nexport interface MappedHKT<T, F extends HKT<T[StrKey<T>]>> extends HKT<StrKey<T>> {\n readonly out: App<F, T[I<StrKey<T>, this>]>\n}\n\nexport const mapExactToObject0 = <T, F extends HKT<K>, G extends HKT<K>, K extends StrKey<T> = StrKey<T>>(\n x: MapO<T, F, K>,\n f: <P extends K>(v: App<F, P>, k: P) => App<G, P>,\n): MapKPart1<T, G, K> => {\n const filter = <T extends Dict<{ 0: unknown }>, V extends T>(x: readonly Entry<T>[]) =>\n x.filter((x): x is Entry<V> => x[0] === x[1][0])\n const matched = filter<MapO<T, F, K>, MapOPart<T, F, K>>(Object.entries(x))\n return Object.fromEntries<MapKPart1<T, G, K>, 0>(\n matched.map<K, MapOPart<T, F, K>, MapKPart1<T, G, K>, 2>(([k, v]) => [k, f(v[1], k)]),\n )\n}\n\nexport const mapExactToObject1 = <K extends string, F extends HKT<K>, G extends HKT<K>>(\n x: MapK<K, F>,\n f: <P extends K>(v: App<F, P>, k: P) => App<G, P>,\n): MapKPart1<RORec<K>, G> => mapExactToObject0<RORec<K>, F, G>(x, f)\n\nexport interface WithKey1<K extends string, G extends HKT<K>> extends HKT<K> {\n readonly out: readonly [I<K, this>, App<G, I<K, this>>]\n}\n\nexport const mapExact0 = <T, F extends HKT<StrKey<T>>, G extends HKT<StrKey<T>>>(\n x: MapO<T, F>,\n f: <P extends StrKey<T>>(v: App<F, P>, k: P) => App<G, P>,\n): MapO<T, G> => mapExactToObject0<T, F, WithKey1<StrKey<T>, G>>(x, (v, k) => [k, f(v, k)])\n\nexport const mapExact1 = <K extends s, F extends HKT<K>, G extends HKT<K>>(\n x: MapK<K, F>,\n f: <P extends K>(v: App<F, P>, k: P) => App<G, P>,\n): MapK<K, G> => mapExactToObject1<K, F, WithKey1<K, G>>(x, (v, k) => [k, f(v, k)])\n\nexport const mapExactToObject = <T, F extends HKT<T[StrKey<T>]>, G extends HKT<StrKey<T>>>(\n x: Exact<T, F>,\n f: <P extends StrKey<T>>(v: App<F, T[P]>, k: P) => App<G, P>,\n): ExactPart1<T, G> => mapExactToObject0<T, MappedHKT<T, F>, G>(x, f)\n\ninterface WithKey<T, G extends HKT<T[StrKey<T>]>> extends HKT<StrKey<T>> {\n readonly out: readonly [I<StrKey<T>, this>, App<G, T[I<StrKey<T>, this>]>]\n}\n\nexport const mapExact = <T, F extends HKT<T[StrKey<T>]>, G extends HKT<T[StrKey<T>]>>(\n x: Exact<T, F>,\n f: <P extends StrKey<T>>(v: App<F, T[P]>, k: P) => App<G, T[P]>,\n): Exact<T, G> => mapExactToObject<T, F, WithKey<T, G>>(x, (v, k) => [k, f(v, k)])\n\ntype Dom<T, V> = HKT<T[StrKey<T>] | V[StrKey<V>]>\nexport const spread = <T, V, F extends Dom<T, V>, EK extends symbol = never, EE = unknown, No extends keyof V = never>(\n a: Exact<Omit<T, No>, F>,\n b: Exact<V, F>,\n) => ({ ...a, ...mapExact(b, id) }) as Exact<V & Omit<T, keyof V> & Record<EK, EE>, F>\n\nexport interface MergeHKT<T, V, F1 extends HKT<StrKey<Omit<T, No>>>, F2 extends HKT<StrKey<V>>, No extends keyof V = never,>\n extends HKT<StrKey<V & Omit<T, No>>> {\n readonly out: I<StrKey<V & Omit<T, No>>, this> extends StrKey<V>\n ? App<F2, I<StrKey<V>, this>>\n : App<F1, I<StrKey<Omit<T, No>>, this>>\n}\n\nexport const spread0 = <\n T,\n V,\n F1 extends HKT<StrKey<Omit<T, No>>>,\n F2 extends HKT<StrKey<V>>,\n E = unknown,\n No extends keyof V = never,\n>(\n a: MapO<Omit<T, No>, F1>,\n b: MapO<V, F2>,\n) =>\n ({ ...a, ...mapExact0(b, id) }) as MapO<\n V & Omit<T, No> & Pick<E, symbol & keyof E>,\n MergeHKT<T, V, F1, F2, No>\n >\n","import type { Timestamp } from '../../types'\nimport type { Arr, ConstHKT, N, O, StrKey, jsonItem, notObj, rawItem } from '../../types'\nimport type { Expr } from '../types'\nimport { asExpr, asExprRaw } from './expr-base'\nimport type { ExprHKT, ExprsExact } from './concat'\nimport { mapExactToObject } from '../utils/map-object'\n\nexport const val = <T extends rawItem>(val: T): Expr<T, unknown> =>\n asExpr({\n raw: () =>\n asExprRaw<T, unknown, unknown>(\n (val && typeof val === 'object' && !(val instanceof Date)) ||\n (typeof val === 'string' && val[0] === '$')\n ? { $literal: val }\n : val,\n ),\n })\n\nexport const current: Expr<Timestamp, unknown> = asExpr({\n raw: () => asExprRaw<Timestamp, unknown, unknown>('$$CLUSTER_TIME'),\n})\nexport const $let = <T, D, C, V extends object>(\n vars: ExprsExact<V, D, C>,\n inExpr: Expr<T, D, C & V>,\n) =>\n asExpr<T, D, C>({\n raw: f =>\n asExprRaw({\n $let: {\n vars: mapExactToObject<V, ExprHKT<D, C>, ConstHKT<rawItem>>(vars, v => v.raw(f).get()),\n in: inExpr.raw(f).get(),\n },\n }),\n })\n\nexport const nil = val(null)\n\nexport const $getField: {\n <T, K extends StrKey<T>, D, C = unknown>(expr: Expr<T, D, C>, field: K): Expr<T[K], D, C>\n <T, K extends StrKey<T>, D, C = unknown>(\n expr: Expr<T | N, D, C>,\n field: K,\n ): Expr<T[K] | null, D, C>\n} = <T, K extends StrKey<T>, D, C = unknown>(expr: Expr<T | N, D, C>, field: K) =>\n asExpr<T[K] | null, D, C>({\n raw: f =>\n asExprRaw({\n $getField: {\n field: field,\n input: expr.raw(f).get(),\n },\n }),\n })\n\nexport type AddO<T> = T extends notObj ? T : T extends Array<infer U> ? Arr<AddO<U>> : O<{[K in keyof T]: AddO<T[K]>}> \n\nexport const func = <T extends jsonItem, A extends readonly jsonItem[], D, C = unknown>(\n f: (...args: A) => T,\n ...args: { [X in keyof A]: Expr<AddO<A[X]>, D, C> }\n) =>\n asExpr<AddO<T>, D, C>({\n raw: field =>\n asExprRaw({\n $function: {\n body: f.toString(),\n args: args.map(x => x.raw(field).get()),\n lang: 'js',\n },\n }),\n })\n\nexport const rand = function () {\n const s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n return Array(17)\n .fill(0)\n .map(() => s[Math.floor(Math.random() * 62)])\n .join('')\n}\nexport const $rand = func(rand)\n","import type { App, HKT, O, RawObj, U, Undef, jsonItem, rawItem } from '../../types'\nimport type { Field } from '../field'\nimport type { BoolExpr, Expr } from '../types'\nimport { safeNarrow } from '../utils/json'\nimport { asBoolExpr, asExpr, asExprRaw } from './expr-base'\nimport { nil, val } from './val'\n\nexport const ite = (<T, D1, D2, C>(\n cond: BoolExpr<D1, D2, C>,\n then: Expr<T, D1 | D2, C>,\n orelse: Expr<T, D2 | D2, C>,\n) =>\n asExpr<T, D1 | D2, C>({\n raw: <DeltaD extends O, I extends U, Ctx>(f: Field<DeltaD, D1 | D2 | Undef<I>, Ctx>) =>\n asExprRaw<T, DeltaD, C & Ctx>({\n $cond: {\n if: cond.raw(f).get(),\n then: then.raw(f as Field<DeltaD, D1>).get(),\n else: orelse.raw(f as Field<DeltaD, D2>).get(),\n },\n }),\n })) as {\n <T, D, C = unknown>(\n cond: Expr<unknown, D, C>,\n then: Expr<T, D, C>,\n orelse: Expr<T, D, C>,\n ): Expr<T, D, C>\n <T, R1, R2, F extends HKT<R1 | R2>, C = unknown>(\n cond: BoolExpr<App<F, R1>, App<F, R2>, C>,\n then: Expr<T, App<F, R1>, C>,\n orelse: Expr<T, App<F, R2>, C>,\n ): Expr<T, App<F, R1 | R2>, C>\n}\n\nexport const and = <D, C = unknown>(...expr: Expr<boolean, D, C>[]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $and: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const or = <D, C = unknown>(...expr: Expr<boolean, D, C>[]) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $or: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const not = <D, C = unknown>(expr: Expr<boolean, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $not: expr.raw(f).get() }),\n })\n\nexport const eq =\n <T, D, C = unknown>(a: Expr<T, D, C>) =>\n (b: Expr<T, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $eq: [a.raw(f).get(), b.raw(f).get()] }),\n })\n\nexport const sub = <T, D, Ctx, P extends O>(a: Expr<T, D, Ctx>, f: Field<P, D, Ctx>) =>\n asExpr<T, P, Ctx>({\n raw: <DeltaD extends O, I extends undefined, C = unknown>(g: Field<DeltaD, P | Undef<I>, C>) =>\n asExprRaw<T | I, DeltaD, Ctx & C>(a.raw(g.with<P, D, I, Ctx, 2>(f)).get()),\n })\n\nexport const eqTyped = <\n T1 extends Dom,\n T2 extends Dom,\n F extends HKT<Dom>,\n C = unknown,\n Dom = jsonItem,\n>(\n a: Expr<T1 | T2, App<F, T1 | T2>, C>,\n b: Expr<T1, App<F, T1 | T2>, C>,\n): BoolExpr<App<F, T1>, App<F, T2>, C> =>\n asBoolExpr({\n raw: <DeltaD extends O>(f: Field<DeltaD, App<F, T1> | App<F, T2>>) =>\n asExprRaw<never, DeltaD, C>({ $eq: [a.raw(f).get(), b.raw(f).get()] }),\n })\n\nexport const ne =\n <T, D, C = unknown>(a: Expr<T, D, C>) =>\n <K>(b: Expr<K, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $ne: [a.raw(f).get(), b.raw(f).get()] }),\n })\n\nexport const notNull = <T, D, C>(a: Expr<T, D, C>) => ne($ifNull(a, nil))(nil)\n\nexport const $ifNull: {\n <R, D, C = unknown>(\n ...expr: [...Expr<R | null | undefined, D, C>[], Expr<R, D, C>]\n ): Expr<R, D, C>\n <R, D, C = unknown>(\n ...expr: [Expr<R, D, C>, ...Expr<R | null | undefined, D, C>[]]\n ): Expr<R, D, C>\n} = <R, D, C>(...expr: [...Expr<R | null | undefined, D, C>[]]) =>\n asExpr<R, D, C>({\n raw: f => asExprRaw({ $ifNull: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const exprMapVal = <K extends string, T extends Partial<Record<K, rawItem>>, D, C>(\n expr: Expr<K, D, C>,\n map: { readonly [P in K]: Expr<T[P], D, C> },\n or?: Expr<T[K], D, C>,\n) =>\n asExpr<T[K & keyof T], D, C>({\n raw: f =>\n asExprRaw({\n $switch: {\n branches: Object.entries(map).map(([k, v]) =>\n safeNarrow<RawObj>()({\n case: { $eq: [expr.raw(f).get(), { $literal: k }] },\n then: v.raw(f).get(),\n }),\n ),\n ...(or && { default: or.raw(f).get() }),\n },\n }),\n })\n\nexport const mapVal = <K extends string, T extends Partial<Record<K, rawItem>>, D, C>(\n expr: Expr<K, D, C>,\n map: T,\n or: T[K & keyof T],\n): Expr<T[K & keyof T], D, C> =>\n exprMapVal<K, T, D, C>(\n expr,\n Object.fromEntries<{ readonly [P in K]: Expr<T[P], D, C> }>(\n Object.entries(map as Pick<T, K>).map(([k, v]) => [k, val(v)]),\n ),\n val(or),\n )\n\nexport const setField = <K extends string, T, V, D, C>({\n field,\n input,\n value,\n}: {\n field: Expr<K, D, C>\n input: Expr<T, D, C>\n value: Expr<V, D, C>\n}) =>\n asExpr<T & Record<K, V>, D, C>({\n raw: f =>\n asExprRaw({\n $setField: {\n field: field.raw(f).get(),\n input: input.raw(f).get(),\n value: value.raw(f).get(),\n },\n }),\n })\n","import type { Arr, AsLiteral, N, O, RORec, StrKey, U, Undef } from '../../types'\nimport { asExpr, asExprRaw } from '../expression/expr-base'\nimport type { Expr, ExprRaw, Query } from '../types'\nimport type { Predicate } from '../types/predicate'\nimport { id } from '../utils/json'\n\ntype Concat = <P, R, V, C, C2>(f1: Field<P, R, C>, f2: Field<R, V, C2>) => Field<P, V, C & C2>\n\nexport class Field<in R, out V, in C = unknown> {\n has<R extends O>(this: Field<R, V>, p: Predicate<V>): Query<R, C>\n has<R extends O, V>(this: Field<R, Arr<V>>, p: Predicate<V>): Query<R, C>\n has<R extends O>(this: Field<R, V | Arr<V>>, p: Predicate<V | Arr<V>>): Query<R, C> {\n return { raw: f => ({ [f.with(this).str()]: p.raw }) }\n }\n private constructor(\n private field: string,\n private raw: (x: string) => string,\n private concat: Concat,\n ) {}\n static root = <T extends O>() => {\n const concat: Concat = (f1, f2) =>\n new Field([f1.field, f2.field].filter(id).join('.'), f1.raw, f1.concat)\n return new Field<T, T>('', s => (s ? `$${s}` : '$$ROOT'), concat)\n }\n static ctx =\n <T>() =>\n <K extends string>(k: K) => {\n const concat: Concat = (_, f2) => new Field(f2.field, f2.raw, f2.concat)\n return new Field<unknown, T, RORec<K, T>>(k, s => `$$${s}`, concat)\n }\n public of<V, K extends keyof V, _ extends 0 = 0>(\n this: Field<R, Arr<V>, C>,\n k: AsLiteral<K>,\n ): Field<R, Arr<V[K]>, C>\n public of<V, K extends keyof V, _ extends 1 = 1>(this: Field<R, O<V>, C>, k: K): Field<R, V[K], C>\n public of<V, K extends keyof V, I extends N = never, _ extends 2 = 2>(\n this: Field<R, Arr<V> | Undef<I>, C>,\n k: K,\n ): Field<R, Arr<V[K]> | I, C>\n public of<V, K extends keyof V, I extends N = never, _ extends 3 = 3>(\n this: Field<R, O<V> | Undef<I>, C>,\n k: K,\n ): Field<R, V[K] | I, C>\n\n public of<K extends StrKey<V>>(k: K): Field<R, V[K] | Arr<V[K]> | N, C> {\n return new Field([this.field, k].filter(id).join('.'), this.raw, this.concat)\n }\n\n public with<V, W, C2 = unknown, _ extends 0 = 0>(\n this: Field<R, O<V>, C>,\n k: Field<O<V>, W, C2>,\n ): Field<R, W, C & C2>\n public with<V, W, C2 = unknown, _ extends 1 = 1>(\n this: Field<R, Arr<V>, C>,\n k: Field<O<V>, Arr<W> | O<W>, C2>,\n ): Field<R, Arr<W>, C & C2>\n public with<V, W, I extends N = never, C2 = unknown, _ extends 2 = 2>(\n this: Field<R, O<V> | Undef<I>, C>,\n k: Field<O<V>, W, C2>,\n ): Field<R, W | I, C & C2>\n public with<V, W, I extends N = never, C2 = unknown, _ extends 3 = 3>(\n this: Field<R, Arr<V> | Undef<I>, C>,\n k: Field<O<V>, Arr<W> | O<W>, C2>,\n ): Field<R, Arr<W> | I, C & C2>\n public with<W>(k: Field<O<V>, W, C>): Field<R, W, C> {\n return k.concat<R, O<V>, W, C, C>(this as Field<R, O<V>, C>, k)\n }\n\n str(this: Field<R, V>) {\n return this.field\n }\n private exprRaw(): ExprRaw<V, R, C> {\n return asExprRaw(this.raw(this.field))\n }\n expr<R, V, C = unknown>(this: Field<R, V, C>): Expr<V, R, C>\n expr<R extends O, V, Ctx = unknown>(this: Field<R, V, Ctx>): Expr<V, R, Ctx> {\n return asExpr<V, R, Ctx>({\n raw: <DeltaD extends O, I extends U, C = unknown>(\n f: Field<DeltaD, R | Undef<I>, C>,\n ): ExprRaw<V | I, DeltaD, Ctx & C> => f.with<R, V, I, Ctx, 2>(this).exprRaw(),\n })\n }\n}\n\nexport const { root, ctx } = Field\n","import type { AppMap, ConstHKT, N, O, PRRec, RawObj, rawItem } from '../../types'\nimport { add, subtract } from '../expression/arith'\nimport type { ExprHKT } from '../expression/concat'\nimport { $ifNull, ite, sub } from '../expression/logic'\nimport { func, val, type AddO } from '../expression/val'\nimport { root } from '../field'\nimport type { Accumulator, AccumulatorRaw, DeltaAccumulator, Expr, Part } from '../types'\n\ntype AddOs<A extends readonly unknown[]> = {[K in keyof A]: AddO<A[K]>}\ntype PushSides<V> = { 0: V[]; 1: V[] }\ntype PushDict<V> = PRRec<string, PushSides<V>>\n\nconst asAccumulator = <T, V, C = unknown>(x: RawObj) => x as AccumulatorRaw<T, V, C>\n\nconst $sum_ = <D extends O, C = unknown>(\n expr: Expr<number | N, D, C>,\n): Accumulator<D, number, C> => ({ raw: f => asAccumulator({ $sum: expr.raw(f).get() }) })\nexport const $sum = <D extends O, C = unknown>(\n expr: Expr<number | N, D, C>,\n): DeltaAccumulator<D, number, C> => ({\n group: $sum_(\n ite(\n root<Part<D>>().of('deleted').expr(),\n val(0),\n ite(\n root<Part<D>>().of('old').expr(),\n subtract(val(0), $ifNull(sub(expr, root<Part<D>>().of('v')), val(0))),\n sub(expr, root<Part<D>>().of('v')),\n ),\n ),\n ),\n merge: (x, y) => add($ifNull(x, val(0)), y),\n})\n\nconst $accumulator_ = <D, T, Ctx, A extends readonly unknown[]>(\n init: () => T,\n accumulateArgs: AppMap<ExprHKT<D, Ctx>, AddOs<A>>,\n accumulate: (a: T, ...args: A) => T,\n merge: (...args: [T, T]) => T,\n): Accumulator<D, AddO<T>, Ctx> => {\n return {\n raw: f =>\n asAccumulator({\n $accumulator: {\n init: init.toString(),\n initArgs: [],\n accumulate: accumulate.toString(),\n accumulateArgs: accumulateArgs.map<AddOs<A>, ExprHKT<D, Ctx>, ConstHKT<rawItem>, 1>(e =>\n e.raw(f).get(),\n ),\n merge: merge.toString(),\n lang: 'js',\n },\n }),\n }\n}\n\nexport const $accumulator = <D, T, Ctx, A extends readonly unknown[]>(\n init: () => T,\n accumulateArgs: AppMap<ExprHKT<Part<D>, Ctx>, AddOs<A>>,\n accumulate: (a: T, ...args: A) => T,\n merge: (...args: [T | N, T]) => T,\n): DeltaAccumulator<D, AddO<T>, Ctx> => ({\n group: $accumulator_(init, accumulateArgs, accumulate, merge),\n merge: <D, C>(a: Expr<AddO<T> | N, D, C>, b: Expr<AddO<T>, D, C>): Expr<AddO<T>, D, C> =>\n func<T, [T | N, T], D, C>(merge, a, b),\n})\n\nexport const $countDict = <D extends O, K extends string = string, C = unknown>(\n expr: Expr<AddO<K>, D, C>,\n): DeltaAccumulator<D, AddO<PRRec<K, number>>, C> =>\n $accumulator<D, PRRec<K, number>, C, [K, boolean, true | N]>(\n function () {\n return {}\n },\n [\n sub(expr, root<Part<D>>().of('v')),\n root<Part<D>>().of('old').expr(),\n root<Part<D>>().of('deleted').expr(),\n ],\n function (a, k, old, deleted) {\n if (deleted) return a\n let y = (a[k] || 0) + (old ? -1 : 1)\n return y ? (a[k] = y) : delete a[k], a\n },\n function (a, b) {\n return Object.keys(b).reduce<PRRec<K, number>>((a, k) => {\n let y = (a[k] || 0) + b[k]!\n return y ? (a[k] = y) : delete a[k], a\n }, a || {})\n },\n )\nexport const $countDictArray = <D extends O, K extends string = string, C = unknown>(\n expr: Expr<AddO<K[]>, D, C>,\n): DeltaAccumulator<D, AddO<PRRec<K, number>>, C> =>\n $accumulator<D, PRRec<K, number>, C, [K[], boolean, true | N]>(\n function () {\n return {}\n },\n [\n sub(expr, root<Part<D>>().of('v')),\n root<Part<D>>().of('old').expr(),\n root<Part<D>>().of('deleted').expr(),\n ],\n function (a, keys, old, deleted) {\n if (deleted) return a\n keys.forEach(k => {\n const y = (a[k] || 0) + (old ? -1 : 1)\n if (y) a[k] = y\n else delete a[k]\n })\n return a\n },\n function (a, b) {\n return Object.keys(b).reduce<PRRec<K, number>>((a, k) => {\n let y = (a[k] || 0) + b[k]!\n return y ? (a[k] = y) : delete a[k], a\n }, a || {})\n },\n )\nexport const $pushDict = <D extends O, V, C = unknown>(\n key: Expr<string, D, C>,\n value: Expr<AddO<V>, D, C>,\n) =>\n // '1' => 'old'\n $accumulator<D, PushDict<V>, C, [string, V, boolean, true | N]>(\n function () {\n return {}\n },\n [\n sub(key, root<Part<D>>().of('v')),\n sub(value, root<Part<D>>().of('v')),\n root<Part<D>>().of('old').expr(),\n root<Part<D>>().of('deleted').expr(),\n ],\n function (ra, k, v, old, deleted) {\n if (deleted) return ra\n let a: PRRec<string, PushSides<V>> = { ...ra }\n //@ts-ignore\n const equal = (a, b) => {\n if (!a || !b) return a === b\n if (a instanceof Date) return b instanceof Date && a.getTime() === b.getTime()\n if ([a, b].some(a => Object.getPrototypeOf(a) != Object.prototype)) return a.valueOf() === b.valueOf()\n const keys = Object.keys(a)\n //@ts-ignore\n return keys.length === Object.keys(b).length && keys.every(k => equal(a[k], b[k]))\n }\n const delta = (a[k] ||= { 0: [], 1: [] }),\n addR = delta[old ? 1 : 0],\n rmR = delta[old ? 0 : 1],\n idx = rmR.findIndex(x => equal(x, v))\n if (idx !== -1) rmR.splice(idx, 1)\n else addR.push(v)\n return a\n },\n function (acc: PushDict<V> | N, b: PushDict<V>): PushDict<V> {\n return Object.keys(b).reduce<PushDict<V>>((a, k) => {\n return Object.entries({ ...b[k] }).reduce<PushDict<V>>(\n (a, [p, v]) =>\n v!.reduce<PushDict<V>>((a, v) => {\n //@ts-ignore\n const equal = (a, b) => {\n if ([a, b].some(a => !a || typeof a != 'object')) return a === b\n const keys = Object.keys(a)\n //@ts-ignore\n return keys.length === Object.keys(b).length && keys.every(k => equal(a[k], b[k]))\n }\n const delta = (a[k] ||= { 0: [], 1: [] }),\n addR = delta[p],\n rmR = delta[+p ? 0 : 1],\n idx = rmR.findIndex(x => equal(x, v))\n if (idx !== -1) rmR.splice(idx, 1)\n else addR.push(v)\n return a\n }, a),\n a,\n )\n }, acc || {})\n },\n )\n\nexport const $keys = <D extends O, K extends string = string, C = unknown>(\n expr: Expr<AddO<PRRec<K, number>>, D, C>,\n): Expr<AddO<K[]>, D, C> =>\n func<K[], [PRRec<K, number>], D, C>(function (obj) {\n return Object.keys(obj) as K[]\n }, expr)\n\nexport const $entries = <D extends O, V, C = unknown>(\n expr: Expr<AddO<PushDict<V>>, D, C>,\n): Expr<AddO<{ k: string; v: V }[]>, D, C> =>\n func<{ k: string; v: V }[], [PushDict<V>], D, C>(function (obj) {\n return Object.entries({ ...obj }).flatMap(([k, v]) => (v as PushSides<V>)[0].map(v => ({ k, v })))\n }, expr)\n","import type { App, HKT, O2, O3, O } from '../../types'\nimport type { Delta, DeltaStages, FRawStages, RawStages, Stream, TStages } from '../types'\nimport type { Equal } from '../utils/guard'\n\ntype n = number\nexport const asStages = <Q, T extends Q, V extends Q, C = unknown, M extends n = n>(\n x: RawStages<Q, T, V, C, M>,\n): RawStages<Q, T, V, C, M> => x\n\nexport const same = <\n T extends Dom,\n V extends Dom,\n F extends HKT<Dom, Q>,\n Dom = unknown,\n Q = unknown,\n C = unknown,\n M extends n = n,\n>(\n _: Equal<Dom, T, V>,\n) => asStages<Q, App<F, T>, App<F, V>, C, M>([])\n\nexport const concatStages = <Q, T extends Q, V extends Q, W extends Q, C, M extends n = n>(\n part1: RawStages<Q, T, V, C, M>,\n part2: RawStages<Q, V, W, C, M>,\n): RawStages<Q, T, W, C, M> => asStages([...part1, ...part2])\n\nexport const concatFStages =\n <Q, T extends Q & O, V extends Q & O, W extends Q & O, C, M extends n = n>(\n part1: FRawStages<Q, T, V, C, M>,\n part2: FRawStages<Q, V, W, C, M>,\n ): FRawStages<Q, T, W, C, M> =>\n f =>\n concatStages(part1(f), part2(f))\n\nexport const concatDelta = <Q extends O, T extends Q, V extends Q, W extends Q>(\n part1: DeltaStages<Q, T, V>,\n part2: DeltaStages<Q, V, W>,\n): DeltaStages<Q, T, W> => ({\n delta: concatStages(part1.delta, part2.delta),\n raw: f => concatStages(part1.raw(f), part2.raw(f)),\n})\n\nexport type Concat<out Q, in T extends Q, out V extends Q, in out C, in out M extends n = n> = {\n with: <Q2, W extends Q2>(extra: RawStages<Q | Q2, V, W, C, M>) => Concat<Q | Q2, T, W, C, M>\n stages: RawStages<Q, T, V, C, M>\n}\ntype FConcat<out Q, in T extends Q & O, out V extends Q & O, in out C, in out M extends n = n> = {\n with: <Q2, W extends Q2 & O>(extra: FRawStages<Q | Q2, V, W, C, M>) => FConcat<Q | Q2, T, W, C, M>\n stages: FRawStages<Q, T, V, C, M>\n}\nexport type DeltaPipe<Q extends O, T extends Q, F extends HKT<O2>, G extends HKT<O3>> = {\n with: <Q2 extends O, V extends Q2>(\n map: (a: Stream<Q, T, F, G>) => Stream<Q | Q2, V, F, G>,\n ) => DeltaPipe<Q | Q2, V, F, G>\n then: <Q2 extends O, V extends Q2>(next: App<G, [Q2 | T, T, V]>) => DeltaPipe<Q | Q2, V, F, G>\n get: () => App<F, [Q, T]>\n}\n\nexport const pipe = <Q extends O, S extends Q, T extends Q, F extends HKT<O2>, G extends HKT<O3>>(\n stream: Stream<Q, S, F, G>,\n s: App<G, [Q, S, T]>,\n concat: <Q extends O, T extends Q, V extends Q, W extends Q>(\n part1: App<G, [Q, T, V]>,\n part2: App<G, [Q, V, W]>,\n ) => App<G, [Q, T, W]>,\n empty: <T extends Q>() => App<G, [Q, T, T]>,\n) => {\n const acc: DeltaPipe<Q, T, F, G> = {\n with: <Q2 extends O, V extends Q2>(\n map: (a: Stream<Q, T, F, G>) => Stream<Q | Q2, V, F, G>,\n ): DeltaPipe<Q | Q2, V, F, G> =>\n pipe<Q | Q2, V, V, F, G>(\n map(i => stream(concat(s, i))),\n empty(),\n concat,\n empty,\n ),\n then: <Q2 extends O, V extends Q2>(next: App<G, [T | Q2, T, V]>): DeltaPipe<Q | Q2, V, F, G> =>\n pipe<Q | Q2, S, V, F, G>(stream, concat(s, next), concat, empty),\n get: () => stream(s),\n }\n return acc\n}\nconst concat = <Q, T extends Q, V extends Q, C = unknown, M extends n = n>(\n stages: RawStages<Q, T, V, C, M>,\n): Concat<Q, T, V, C, M> => ({\n with: extra => concat(concatStages(stages, extra)),\n stages,\n})\nconst fconcat = <Q, T extends Q & O, V extends Q & O, C = unknown, M extends n = n>(\n stages: FRawStages<Q, T, V, C, M>,\n): FConcat<Q, T, V, C, M> => ({\n with: extra => fconcat(concatFStages(stages, extra)),\n stages,\n})\n\ntype Link = <T, C = unknown, M extends n = n>() => Concat<T, T, T, C, M>\ntype FLink = <T extends O, C = unknown, M extends n = n>() => FConcat<T, T, T, C, M>\n\nexport const link: Link = () => ({\n with: extra => concat(extra),\n stages: asStages([]),\n})\n\nexport const flink: FLink = () => ({\n with: extra => fconcat(extra),\n stages: () => asStages([]),\n})\n\nexport const emptyDelta = <T extends O>() => ({\n delta: link<Delta<T>>().stages,\n raw: <F extends HKT<O>>() => link<App<F, T>>().stages,\n})\n\nexport const concatTStages = <S, Q, B extends Q, T extends Q, V extends Q>(\n { coll, exec, input }: TStages<S, Q, B, T>,\n stages: RawStages<Q, T, V>,\n): TStages<S, Q, B, V> => ({ coll, input, exec: concatStages(exec, stages) })\n","import type {\n App,\n ConstHKT,\n HKT,\n I,\n IdHKT,\n N,\n O,\n Omit,\n RawObj,\n RORec,\n StrKey,\n U,\n Undef,\n rawItem,\n} from '../../types'\nimport type { Field } from '../field'\nimport type { Expr } from '../types'\nimport { safeNarrow } from '../utils/json'\nimport {\n mapExactToObject,\n spread,\n type Exact,\n type ExactPart,\n type MapO,\n type MergeHKT,\n spread0,\n} from '../utils/map-object'\nimport { asExpr, asExprRaw } from './expr-base'\nimport { val } from './val'\n\nexport const concat: {\n <D, C>(...expr: Expr<string, D, C>[]): Expr<string, D, C>\n <D, C>(...expr: Expr<string | N, D, C>[]): Expr<string | null, D, C>\n} = <D, C>(...expr: Expr<string | N, D, C>[]) =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $concat: expr.map(e => e.raw(f).get()) }),\n })\n\nexport const $substr = <D, C>(\n expr: Expr<string, D, C>,\n start: Expr<number, D, C>,\n length: Expr<number, D, C>,\n) =>\n asExpr<string, D, C>({\n raw: f =>\n asExprRaw({\n $substrCP: [expr.raw(f).get(), start.raw(f).get(), length.raw(f).get()],\n }),\n })\nexport const padLeft = <D, C>(expr: Expr<string, D, C>, pad: string) =>\n asExpr<string, D, C>({\n raw: f =>\n asExprRaw({\n $let: {\n vars: {\n x: {\n $concat: [{ $literal: pad }, expr.raw(f).get()],\n },\n },\n in: { $substrCP: ['$$x', { $subtract: [{ $strLenCP: '$$x' }, pad.length] }, pad.length] },\n },\n }),\n })\nexport const regex = <D, C>(\n expr: Expr<string, D, C>,\n regex: Expr<string, D, C>,\n options?: Expr<string, D, C>,\n) =>\n asExpr<boolean, D, C>({\n raw: f =>\n asExprRaw({\n $regexMatch: {\n input: expr.raw(f).get(),\n regex: regex.raw(f).get(),\n options: options?.raw(f).get(),\n },\n }),\n })\nexport const str = <D, C>(expr: Expr<unknown, D, C>) =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $toString: expr.raw(f).get() }),\n })\nexport const toInt = <D, C>(expr: Expr<unknown, D, C>) =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $toInt: expr.raw(f).get() }),\n })\n\nexport const fieldM = <\n M extends RORec<Dom, Ref>,\n T extends RORec<Ref, unknown>,\n D,\n Dom extends string = StrKey<M>,\n Ref extends string = StrKey<T>,\n C = unknown,\n>(\n expr: { readonly [K in Ref]: Expr<T[K], D, C> },\n m: Pick<M, Dom>,\n) =>\n asExpr<O<{ readonly [K in Dom]: T[M[K]] }>, D, C>({\n raw: <DeltaD extends O, I extends U, Ctx>(f: Field<DeltaD, D | Undef<I>, Ctx>) =>\n asExprRaw<O<{ readonly [K in Dom]: T[M[K]] }>, DeltaD, C>(\n Object.fromEntries(\n Object.entries(m).flatMap(<K extends Dom>([dom, ref]: readonly [K, M[K]]) =>\n expr[ref] ? [[dom, expr[ref].raw(f).get()]] : [],\n ),\n ),\n ),\n })\n\nexport type Exprs<out T, in D, in C = unknown> = {\n readonly [K in StrKey<T>]: Expr<T[K], D, C>\n}\ntype MergeExactArgs<T1, T2, F extends HKT<T1[StrKey<T1>] | T2[StrKey<T2>]>> = readonly [\n Exact<Omit<T1, keyof T2>, F>,\n Exact<T2, F>,\n]\nexport const mergeExact = <T1, T2, F extends HKT<T1[StrKey<T1>] | T2[StrKey<T2>]>, EK extends symbol = never, EE = unknown>(\n ...[exprsExact1, exprsExact2]: MergeExactArgs<T1, T2, F>\n): Exact<T2 & Omit<T1, keyof T2> & Record<EK, EE>, F> =>\n spread<T1, T2, F, EK, EE, keyof T2>(exprsExact1, exprsExact2)\n\nexport type MergeMapOArgs<\n T1,\n T2,\n F1 extends HKT<StrKey<Omit<T1, StrKey<T2>>>>,\n F2 extends HKT<StrKey<T2>>,\n> = readonly [MapO<Omit<T1, StrKey<T2>>, F1>, MapO<T2, F2>]\nexport const mergeExact0 = <\n T1,\n T2,\n F1 extends HKT<StrKey<Omit<T1, StrKey<T2>>>>,\n F2 extends HKT<StrKey<T2>>,\n E = unknown,\n>(\n ...[exprsExact1, exprsExact2]: MergeMapOArgs<T1, T2, F1, F2>\n): MapO<\n T2 & Omit<T1, StrKey<T2>> & Pick<E, symbol & keyof E>,\n MergeHKT<T1, T2, F1, F2, StrKey<T2>>\n> => spread0<T1, T2, F1, F2, E, StrKey<T2>>(exprsExact1, exprsExact2)\n\nexport const mergeExpr = <T1, T2, D, C = unknown, EK extends symbol = never, EE = unknown>(\n ...exprs: MergeExactArgs<T1, T2, ExprHKT<D, C>>\n): ExprsExact<T2 & Omit<T1, keyof T2> & Record<EK, EE>, D, C> =>\n mergeExact<T1, T2, ExprHKT<D, C>, EK, EE>(...exprs)\n\nexport type ExprsPart<T, D, C> = ExactPart<T, ExprHKT<D, C>>\nexport interface ExprHKT<D, C = unknown, F extends HKT = IdHKT> extends HKT<unknown> {\n readonly out: Expr<App<F, I<unknown, this>>, D, C>\n}\n\nexport type ExprsExact<T, D, C = unknown, F extends HKT = IdHKT> = Exact<T, ExprHKT<D, C, F>>\nexport interface ExprsExactHKT<E, D, C = unknown, F extends HKT = IdHKT> extends HKT {\n readonly out: ExprsExact<E & I<unknown, this>, D, C, F>\n}\n\nexport const fieldF =\n <F extends HKT>() =>\n <T extends object, D, C = unknown>(exprs: ExprsExact<T, D, C, F>) =>\n Object.keys(exprs).length\n ? asExpr<O<{ [K in keyof T]: App<F, T[K]> }>, D, C>({\n raw: f =>\n asExprRaw(\n mapExactToObject<T, ExprHKT<D, C>, ConstHKT<rawItem>>(exprs, e => e.raw(f).get()),\n ),\n })\n : asExpr<O<{ [K in keyof T]: App<F, T[K]> }>, D, C>(\n val(safeNarrow<RawObj>()({})),\n )\nexport const field: <T extends object, D, C = unknown>(\n exprs: ExprsExact<T, D, C>,\n) => Expr<O<T>, D, C> = fieldF<IdHKT>()\n","import type { App, Arr, HKT, N, O, RORec, Rec, notArr } from '../../types'\nimport { ctx } from '../field'\nimport type { Expr } from '../types'\nimport { gte, add } from './arith'\nimport { field } from './concat'\nimport { asBoolExpr, asExpr, asExprRaw } from './expr-base'\nimport { eq, ite } from './logic'\nimport { $let, val } from './val'\n\nexport const size = <T, D, C>(expr: Expr<Arr<T>, D, C>) =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $size: expr.raw(f).get() }),\n })\n\nexport const filterDefined = <T, D, C = unknown>(expr: Expr<Arr<T | N>, D, C>) =>\n filter({\n expr,\n as: 'x',\n cond: ctx()('x').expr(),\n }) as Expr<Arr<T>, D, C>\n\nexport const filter = <T, D, K extends string, C = unknown>({\n as,\n cond,\n expr,\n limit,\n}: {\n expr: Expr<Arr<T>, D, C>\n as: K\n cond: Expr<unknown, D, C & RORec<K, T>>\n limit?: Expr<number, D, C>\n}) =>\n asExpr<Arr<T>, D, C>({\n raw: f =>\n asExprRaw({\n $filter: {\n input: expr.raw(f).get(),\n as,\n cond: cond.raw(f).get(),\n ...(limit ? { limit: limit.raw(f).get() } : {}),\n },\n }),\n })\nexport const sortArray = <T, D, C, K extends keyof T>({\n sortBy,\n expr,\n order,\n}: {\n expr: Expr<Arr<T>, D, C>\n sortBy: K\n order?: 1 | -1\n}) =>\n asExpr<Arr<T>, D, C>({ \n raw: f =>\n asExprRaw({ $sortArray: { input: expr.raw(f).get(), sortBy: { [sortBy]: order ?? -1 } } }),\n })\n\nexport const isArray = <T extends notArr, D, C, F extends HKT<T | Arr<T>>>(\n expr: Expr<T | Arr<T>, D & (App<F, T> | App<F, Arr<T>>), C>,\n) =>\n asBoolExpr<D & App<F, Arr<T>>, D & App<F, T>, C>({\n raw: f => asExprRaw<never, unknown, C>({ $isArray: expr.raw(f).get() }),\n })\n\nexport const inArray = <T, D, C>(item: Expr<T, D, C>, expr: Expr<Arr<T>, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $in: [item.raw(f).get(), expr.raw(f).get()] }),\n })\n\nexport const array = <T, D, C = unknown>(...exprs: Expr<T, D, C>[]) =>\n asExpr<Arr<T>, D, C>({\n raw: f => asExprRaw(exprs.map(x => x.raw(f).get())),\n })\n\nexport const concatArray = <T, D, C>(...exprs: Expr<Arr<T>, D, C>[]) =>\n asExpr<Arr<T>, D, C>({\n raw: f => asExprRaw({ $concatArrays: exprs.map(x => x.raw(f).get()) }),\n })\n\nexport const first = <T, D, C>(expr: Expr<Arr<T>, D, C>) =>\n asExpr<T | null, D, C>({\n raw: f => asExprRaw({ $first: expr.raw(f).get() }),\n })\nexport const firstSure = first as <T, D, C>(expr: Expr<Arr<T>, D, C>) => Expr<T, D, C>\nexport const last = <T, D, C>(expr: Expr<Arr<T>, D, C>) =>\n asExpr<T | null, D, C>({\n raw: f => asExprRaw({ $last: expr.raw(f).get() }),\n })\n\nexport type NullToOBJ<N extends null> = N extends null ? O : N\n\nexport const mergeObjects = <T1, T2, D, C = unknown, N extends null = never>(\n ...exprs: readonly [Expr<T1 | N, D, C>, ...[...Expr<T1 | T2 | N, D, C>[], Expr<T2, D, C>]]\n) =>\n asExpr<(T1 | NullToOBJ<N>) & T2, D, C>({\n raw: f => asExprRaw({ $mergeObjects: exprs.map(x => x.raw(f).get()) }),\n })\n\nexport const anyElementTrue = <D, C = unknown>(expr: Expr<Arr<boolean>, D, C>) =>\n asExpr<boolean, D, C>({\n raw: f => asExprRaw({ $anyElementTrue: expr.raw(f).get() }),\n })\n\ntype Reduce<T, V> = RORec<'value', V> & RORec<'this', T>\nexport const $reduce = <T, V, D, C>(\n input: Expr<Arr<T>, D, C>,\n initialValue: Expr<V, D, C>,\n inExpr: Expr<V, D, C & Reduce<T, V>>,\n) =>\n asExpr<V, D, C>({\n raw: f =>\n asExprRaw({\n $reduce: {\n input: input.raw(f).get(),\n initialValue: initialValue.raw(f).get(),\n in: inExpr.raw(f).get(),\n },\n }),\n })\n\nconst indexOfArray = <T, D, C>(array: Expr<Arr<T>, D, C>, item: Expr<T, D, C>) =>\n asExpr<number, D, C>({\n raw: f =>\n asExprRaw({\n $indexOfArray: [array.raw(f).get(), item.raw(f).get()],\n }),\n })\ntype DiffArr<T> = Rec<'out' | 'except', Arr<T>>\nexport const slice = <T, D, C>(\n array: Expr<Arr<T>, D, C>,\n start: Expr<number, D, C>,\n end: Expr<number, D, C>,\n) =>\n asExpr<Arr<T>, D, C>({\n raw: f =>\n asExprRaw({\n $slice: [array.raw(f).get(), start.raw(f).get(), end.raw(f).get()],\n }),\n })\nexport const except = <T, D, C>(a: Expr<Arr<T>, D, C>, b: Expr<Arr<T>, D, C>) => {\n type C1 = C & Reduce<T, DiffArr<T>>\n type C2 = C1 & RORec<'indexInExcept', number>\n const value = ctx<DiffArr<T>>()('value')\n const out = value.of('out').expr()\n const except = value.of('except').expr()\n const curr = ctx<T>()('this').expr()\n const indexInExcept = ctx<number>()('indexInExcept').expr()\n return $let<Arr<T>, D, C, RORec<'res', DiffArr<T>>>(\n {\n res: [\n 'res',\n $reduce<T, DiffArr<T>, D, C>(\n a,\n field({ out: ['out', array<T, D>()], except: ['except', b] }),\n $let<DiffArr<T>, D, C1, RORec<'indexInExcept', number>>(\n {\n indexInExcept: ['indexInExcept', indexOfArray<T, D, C1>(except, curr)],\n },\n ite<DiffArr<T>, D, C2>(\n gte(indexInExcept, val(0)),\n field({\n out: ['out', out],\n except: [\n 'except',\n concatArray<T, D, C2>(\n ite<Arr<T>, D, C2>(\n eq(indexInExcept)(val(0)),\n array<T, D>(),\n slice<T, D, C2>(except, val(0), indexInExcept),\n ),\n slice<T, D, C2>(except, add(indexInExcept, val(1)), size(except)),\n ),\n ],\n }),\n field({\n out: ['out', concatArray<T, D, Reduce<T, DiffArr<T>>>(out, array(curr))],\n except: ['except', except],\n }),\n ),\n ),\n ),\n ],\n },\n ctx<DiffArr<T>>()('res').of('out').expr(),\n )\n}\n","import type {\n App,\n Arr,\n ConstHKT,\n HKT,\n IdHKT,\n O,\n RORec,\n RawObj,\n Rec,\n StrKey,\n rawItem,\n} from '../../types'\nimport type { ExprHKT, ExprsExact } from '../expression/concat'\nimport { root, type Field } from '../field'\nimport type {\n AccumulatorHKT,\n Accumulators,\n Expr,\n FRawStages,\n LookupArgs,\n Query,\n RawStages,\n} from '../types'\nimport type { Updater } from '../update/updater'\nimport { id } from '../utils/json'\nimport { mapExactToObject, type ExactKeys } from '../utils/map-object'\nimport { asStages } from './prefix'\n\ntype s = string\nexport const $match1 =\n <T extends O, C = unknown>(query?: Query<T, C>): FRawStages<T, T, T, C> =>\n f =>\n asStages(query ? [{ $match: query.raw(f<T>()) }] : [])\n\nexport const $set1 =\n <Q, T extends Q & O, V extends Q & O, C = unknown>(\n updater: Updater<T, T, V, C>,\n ): FRawStages<Q, T, V, C, 1> =>\n f =>\n asStages([\n {\n $set: Object.fromEntries(\n updater.raw(f<T>()).map(([k, v]) => [\n f<T>()\n .of(k.slice(1) as keyof T)\n .str(),\n v,\n ]),\n ),\n },\n ])\n\nexport const $project1 = <T extends O, K extends StrKey<T>>(\n projection: ExactKeys<K>,\n): RawStages<T, T, T, unknown, 1> =>\n asStages([\n {\n $project: mapExactToObject<RORec<K, 1>, IdHKT, ConstHKT<1>>(projection, () => 1),\n },\n ])\n\nexport const $replaceWith1 =\n <T extends O, V extends O, C = unknown>(expr: Expr<V, T, C>): FRawStages<O, T, V, C, 1> =>\n f => {\n const parts = f<T>().str().split('.').filter(id)\n return asStages([\n { $replaceWith: parts.reduce((v, k) => ({ [k]: v }), expr.raw(f<T>()).get()) },\n ])\n }\n\nexport const $unwind1 =\n <T extends O, K extends s, R, Null extends null = never>(\n k: K,\n includeNull?: Null,\n ): FRawStages<T, T & Rec<K, Arr<R>>, T & Rec<K, R | Null>> =>\n f => {\n const path = `$${f<Rec<K, Arr<R>>>().of(k).str()}`\n return asStages([\n { $unwind: includeNull === null ? { path, preserveNullAndEmptyArrays: true } : path },\n ])\n }\n\nexport const $group1 =\n <T extends O, ID, V extends O, C>(id: Expr<ID, T, C>, args: Accumulators<T, V, C>) =>\n <F extends HKT<O, O>>(\n f: <T extends O>() => Field<App<F, T>, T>,\n ): RawStages<O, App<F, T>, Rec<'_id', ID> & V, C, 1> =>\n asStages([\n {\n $group: {\n _id: id.raw(f()).get(),\n ...mapExactToObject<V, AccumulatorHKT<T, C>, ConstHKT<RawObj>>(args, v => v.raw(f<T>())),\n },\n },\n ])\n\nexport const $documents1 =\n <Q extends O, T extends Q & O, C>(docs: Expr<Arr<T>, unknown, C>) =>\n <F extends HKT<O, O>>(\n f: <T extends O>() => Field<App<F, T>, T>,\n ): RawStages<unknown, null, App<F, T>, C, 1> =>\n asStages([{ $documents: docs.raw(f<never>()).get() }])\n\nexport const rawVars = <T, Ctx, C, V extends O>(\n vars: ExprsExact<Ctx, T, C>,\n f: Field<V, T, unknown>,\n) => mapExactToObject<Ctx, ExprHKT<T, C>, ConstHKT<rawItem>>(vars, v => v.raw(f).get())\n\nexport const $simpleLookup1 =\n <T extends O, U extends O, R, K extends s, Ctx, C = unknown, S = string>(\n args: LookupArgs<T, U, R, K, Ctx, C, S>,\n ): FRawStages<T, T, T & Rec<K, Arr<U>>, C, 1> =>\n f => {\n const { coll, k, vars, fields, ...etc } = args\n const letVars = rawVars(vars, f<T>())\n return asStages([\n {\n $lookup: {\n ...(coll && { from: coll.collectionName }),\n ...(fields && {\n localField: f<T>().with(fields.local).str(),\n foreignField: root<R & O>().with(fields.foreign).str(),\n }),\n as: f<Rec<K, Arr<U>>>().of(k).str(),\n ...(Object.keys(letVars).length > 0 && { let: letVars }),\n ...etc,\n },\n },\n ])\n }\n","import type { Arr, IdHKT, O, Rec } from '../../types'\nimport { root } from '../field'\nimport type { Accumulators, Expr, LookupArgs, Query, RawStages } from '../types'\nimport type { Updater } from '../update/updater'\nimport {\n $documents1,\n $group1,\n $match1,\n $project1,\n $replaceWith1,\n $set1,\n $simpleLookup1,\n $unwind1,\n} from './raws'\nexport * from './raws'\n\ntype s = string\n\nexport const $match_ = <T extends O, C = unknown>(\n query?: Query<T, C>,\n): RawStages<O<T>, T, T, C> => $match1(query)<IdHKT<O>>(root)\n\nexport const $set_ = <Q, T extends Q & O, V extends Q & O, C = unknown>(\n updater: Updater<T, T, V, C>,\n): RawStages<O<Q>, T, V, C, 1> => $set1<Q, T, V, C>(updater)<IdHKT<O>>(root)\n\nexport const $replaceWith_ = <T extends O, V extends O, C = unknown>(\n expr: Expr<V, T, C>,\n): RawStages<O, T, V, C, 1> => $replaceWith1(expr)<IdHKT<O>>(root)\n\nexport const $unwind_ = <T extends O, K extends s, U, Null extends null = never>(\n k: K,\n includeNull?: Null,\n): RawStages<O<T>, T & Rec<K, Arr<U>>, T & Rec<K, Null | U>> =>\n $unwind1<T, K, U, Null>(k, includeNull)<IdHKT<O>>(root)\n\nexport const $group_ =\n <V extends O>() =>\n <ID, T extends O, C = unknown>(\n id: Expr<ID, T, C>,\n args: Accumulators<T, V, C>,\n ): RawStages<O, T, Rec<'_id', ID> & V, C, 1> =>\n $group1<T, ID, V, C>(id, args)<IdHKT<O>>(root)\n\nexport const $documents_ = <T extends O, C>(docs: Expr<Arr<T>, unknown, C>) =>\n $documents1(docs)<IdHKT<O>>(root)\n\nexport const $project_ = $project1\n\nexport const $simpleLookup_ = <\n T extends O,\n U extends O,\n R,\n K extends s,\n Ctx,\n C = unknown,\n S = string,\n>(\n args: LookupArgs<T, U, R, K, Ctx, C, S>,\n): RawStages<O<T>, T, T & Rec<K, Arr<U>>, C, 1> => $simpleLookup1(args)<IdHKT<O>>(root)\n","import type { Arr, ID, O, RORec, Rec, RecHKT } from '../../../../types'\nimport { array, filterDefined } from '../../../expression/array'\nimport { field, type ExprHKT, type ExprsExact } from '../../../expression/concat'\nimport { eqTyped, ite, sub } from '../../../expression/logic'\nimport { $getField, nil, val } from '../../../expression/val'\nimport { root } from '../../../field'\nimport type { AccumulatorHKT, After, Deleted, DeletedFlags, Delta, Expr, Part as AccPart, RawStages } from '../../../types'\nimport type { DeltaAccumulatorHKT, DeltaAccumulators } from '../../../types/accumulator'\nimport { mapExact } from '../../../utils/map-object'\nimport { $group_, $replaceWith_, $unwind_ } from '../../mongo-stages'\nimport { link } from '../../prefix'\n\nexport type WithItem<V, Grp> = Rec<'_id', Grp> & Rec<'item', O<V>>\n\nexport const subGroup = <T extends O, Grp, V extends O, GID extends string>(\n id: Expr<Grp, T>,\n args: DeltaAccumulators<T, V>,\n addGrp: <D extends Rec<'_id', Grp>>(src: ExprsExact<V, D>) => ExprsExact<RORec<GID, Grp> & V, D>,\n): RawStages<unknown, Delta<T>, Rec<GID, Grp> & V> => {\n type Extra = ID & Deleted\n type Part = AccPart<T>\n type AfterKeep = Rec<'after', T> & Extra\n type BeforeKeep = Rec<'before', T> & Extra\n type GrpId = Rec<'_id', Grp>\n type WithGrpId = GrpId & V\n type HasItem = WithGrpId\n\n const part = filterDefined<Part, Delta<T>>(\n array<Part | null, Delta<T>>(\n ite<Part | null, null, T, RecHKT<'after', unknown, Extra>>(\n eqTyped<null, T, RecHKT<'after', unknown, Extra>>(root<After<T>>().of('after').expr(), nil),\n nil,\n field<Part, AfterKeep>({\n v: ['v', root<AfterKeep>().of('after').expr()],\n old: ['old', val(false)],\n deleted: [\n 'deleted',\n root<AfterKeep>()\n .of<Deleted, 'deleted', null>('deleted')\n .of<DeletedFlags, 'after', null>('after')\n .expr(),\n ],\n }),\n ),\n ite<Part | null, null, T, RecHKT<'before', unknown, Extra>>(\n eqTyped<null, T, RecHKT<'before', unknown, Extra>>(\n root<Rec<'before', T | null> & Extra>().of('before').expr(),\n nil,\n ),\n nil,\n field<Part, BeforeKeep>({\n v: ['v', root<BeforeKeep>().of('before').expr()],\n old: ['old', val(true)],\n deleted: [\n 'deleted',\n root<BeforeKeep>()\n .of<Deleted, 'deleted', null>('deleted')\n .of<DeletedFlags, 'before', null>('before')\n .expr(),\n ],\n }),\n ),\n ),\n )\n\n const replaceWith = <X extends O, A extends O>(expr: Expr<X, A>) => $replaceWith_(expr)\n\n return link<Delta<T>, unknown>()\n .with<unknown, Rec<'part', Arr<Part>>>(\n $replaceWith_(\n field({\n part: ['part', part],\n }),\n ),\n )\n .with<unknown, Rec<'part', Part>>($unwind_<O, 'part', Part>('part'))\n .with<unknown, Part>($replaceWith_(root<Rec<'part', Part>>().of('part').expr()))\n .with<unknown, WithGrpId>(\n $group_<V>()(\n sub(id, root<Part>().of('v')),\n mapExact<V, DeltaAccumulatorHKT<T>, AccumulatorHKT<Part>>(args, v => v.group),\n ),\n )\n .with<unknown, Rec<GID, Grp> & V>(\n replaceWith(\n field(\n addGrp<Rec<'_id', Grp> & HasItem>(\n mapExact<V, DeltaAccumulatorHKT<T>, ExprHKT<WithGrpId>>(args, (_, k) =>\n $getField(root<HasItem>().expr(), k),\n ),\n ),\n ),\n ),\n ).stages\n}\n","import type { Arr } from '../../types'\nimport type { Expr } from '../types'\nimport { asExpr, asExprRaw } from './expr-base'\n\nexport const dayAndMonthPart = <D, C>(date: Expr<Date, D, C>): Expr<string, D, C> =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%m-%d' } }),\n })\nexport const now = <D, C>(): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f => asExprRaw('$$NOW'),\n })\nexport const monthPart = <D, C>(date: Expr<Date, D, C>): Expr<string, D, C> =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%m' } }),\n })\nexport const weekPart = <D, C>(date: Expr<Date, D, C>): Expr<string, D, C> =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%U' } }),\n })\nexport const year = <D, C>(date: Expr<Date, D, C>): Expr<number, D, C> =>\n asExpr<number, D, C>({\n raw: f => asExprRaw({ $year: date.raw(f).get() }),\n })\nexport const dateAdd = <D, C>(\n date: Expr<Date, D, C>,\n amount: Expr<number, D, C>,\n unit: Expr<'year' | 'week' | 'month' | 'day' | 'hour' | 'minute' | 'second', D, C>,\n): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f =>\n asExprRaw({\n $dateAdd: {\n startDate: date.raw(f).get(),\n unit: unit.raw(f).get(),\n amount: amount.raw(f).get(),\n },\n }),\n })\n\nexport const maxDate = <D, C>(expr: Expr<Arr<Date>, D, C>): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f => asExprRaw({ $max: expr.raw(f).get() }),\n })\n\nexport const minDate = <D, C>(expr: Expr<Arr<Date>, D, C>): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f => asExprRaw({ $min: expr.raw(f).get() }),\n })\nexport const datePart = <D, C>(date: Expr<Date, D, C>): Expr<string, D, C> =>\n asExpr<string, D, C>({\n raw: f => asExprRaw({ $dateToString: { date: date.raw(f).get(), format: '%Y-%m-%d' } }),\n })\nexport const startOf = <D, C>(\n startDate: Expr<Date, D, C>,\n freq: Expr<'week' | 'day' | 'month' | 'year', D, C>,\n offset: Expr<number, D, C>,\n): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f =>\n asExprRaw({\n $let: {\n vars: { d: startDate.raw(f).get(), f: freq.raw(f).get(), i: offset.raw(f).get() },\n in: {\n $switch: {\n branches: [\n {\n case: { $eq: ['$$f', 'week'] },\n then: {\n $dateFromParts: {\n isoWeekYear: { $isoWeekYear: '$$d' },\n isoWeek: {\n $add: [\n { $isoWeek: '$$d' },\n {\n $cond: {\n if: {\n $lt: ['$$i', { $isoDayOfWeek: '$$d' }],\n },\n then: 1,\n else: 0,\n },\n },\n ],\n },\n isoDayOfWeek: '$$i', // 1 is default = monday\n },\n },\n },\n {\n case: { $eq: ['$$f', 'month'] },\n then: {\n $dateFromParts: {\n year: { $year: '$$d' },\n month: {\n $add: [\n { $month: '$$d' },\n {\n $cond: {\n if: {\n $lt: ['$$i', { $dayOfMonth: '$$d' }],\n },\n then: 1,\n else: 0,\n },\n },\n ],\n },\n day: '$$i', // 1 is default = 1\n },\n },\n },\n {\n case: { $eq: ['$$f', 'year'] },\n then: {\n $dateFromParts: {\n year: {\n $add: [\n { $year: '$$d' },\n {\n $cond: {\n if: {\n $or: [\n {\n $lt: [{ $floor: { $divide: ['$$i', 100] } }, { $month: '$$d' }],\n },\n {\n $and: [\n {\n $eq: [\n { $floor: { $divide: ['$$i', 100] } },\n { $month: '$$d' },\n ],\n },\n {\n $lt: [{ $mod: ['$$i', 100] }, { $dayOfMonth: '$$d' }],\n },\n ],\n },\n ],\n },\n then: 1,\n else: 0,\n },\n },\n ],\n },\n month: { $floor: { $divide: ['$$i', 100] } }, // 101 is default = 1\n day: { $mod: ['$$i', 100] }, // 101 is default = 1\n },\n },\n },\n ],\n default: {\n $dateFromParts: {\n year: { $year: '$$d' },\n month: { $month: '$$d' },\n day: { $add: [{ $dayOfMonth: '$$d' }, '$$i'] }, // 0 default = 0\n },\n },\n },\n },\n },\n }),\n })\n\nexport const dateDiff = <D, C>({\n end,\n unit,\n start,\n}: {\n start: Expr<Date, D, C>\n end: Expr<Date, D, C>\n unit: Expr<'week' | 'day' | 'month' | 'year', D, C>\n}): Expr<number, D, C> =>\n asExpr<number, D, C>({\n raw: f =>\n asExprRaw({\n $let: {\n vars: {\n f: unit.raw(f).get(),\n end: end.raw(f).get(),\n start: start.raw(f).get(),\n },\n in: {\n $let: {\n vars: {\n diff: {\n $dateDiff: {\n startDate: '$$start',\n endDate: '$$end',\n unit: '$$f',\n },\n },\n },\n in: {\n $switch: {\n branches: [\n {\n case: { $eq: ['$$f', 'month'] },\n then: {\n $cond: {\n if: {\n $lte: [{ $dayOfMonth: '$$start' }, { $dayOfMonth: '$$end' }],\n },\n then: '$$diff',\n else: { $subtract: ['$$diff', 1] },\n },\n },\n },\n {\n case: { $eq: ['$$f', 'week'] },\n then: {\n $cond: {\n if: {\n $lte: [{ $isoDayOfWeek: '$$start' }, { $isoDayOfWeek: '$$end' }],\n },\n then: '$$diff',\n else: { $subtract: ['$$diff', 1] },\n },\n },\n },\n {\n case: { $eq: ['$$f', 'year'] },\n then: {\n $cond: {\n if: {\n $or: [\n {\n $lt: [{ $month: '$$start' }, { $month: '$$end' }],\n },\n {\n $and: [\n {\n $eq: [{ $month: '$$start' }, { $month: '$$end' }],\n },\n {\n $lte: [{ $dayOfMonth: '$$start' }, { $dayOfMonth: '$$end' }],\n },\n ],\n },\n ],\n },\n then: '$$diff',\n else: { $subtract: ['$$diff', 1] },\n },\n },\n },\n ],\n default: '$$diff',\n },\n },\n },\n },\n },\n }),\n })\n\nexport const mapFromPlainDateTime = <D, C>({\n plainDate,\n timezone,\n}: {\n plainDate: Expr<Date, D, C>\n timezone: Expr<string, D, C>\n}): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f =>\n asExprRaw({\n $dateFromString: {\n dateString: {\n $dateToString: { date: plainDate.raw(f).get(), timezone: 'GMT' },\n },\n timezone: timezone.raw(f).get(),\n },\n }),\n })\n\nexport const mapToPlainDateTime = <D, C>(\n date: Expr<Date, D, C>,\n timezone: Expr<string, D, C>,\n): Expr<Date, D, C> =>\n asExpr<Date, D, C>({\n raw: f =>\n asExprRaw({\n $dateFromString: {\n $dateToString: {\n date: date.raw(f).get(),\n timezone: timezone.raw(f).get(),\n },\n },\n }),\n })\n","import type { Arr, RORec } from '../../types'\nimport { ctx, Field } from '../field'\nimport type { Expr } from '../types'\nimport { asExpr, asExprRaw } from './expr-base'\n\n// exclusif\nexport const range = <D, C>(\n start: Expr<number, D, C>,\n end: Expr<number, D, C>,\n step?: Expr<number, D, C>,\n) =>\n asExpr<Arr<number>, D, C>({\n raw: f =>\n asExprRaw({ $range: [start.raw(f).get(), end.raw(f).get(), step?.raw(f).get() ?? 1] }),\n })\n\nexport const $map0 = <K extends string, T, R, D, C>({\n as,\n expr,\n input,\n}: {\n input: Expr<Arr<T>, D, C>\n as: K\n expr: Expr<R, D, RORec<K, T> & C>\n}) =>\n asExpr<Arr<R>, D, C>({\n raw: f =>\n asExprRaw({\n $map: {\n input: input.raw(f).get(),\n as,\n in: expr.raw(f).get(),\n },\n }),\n })\nexport const $map1 = <T, R, D, C>(\n ex: Expr<Arr<T>, D, C>,\n map: (i: Field<unknown, T, RORec<'item', T>>) => Expr<R, D, RORec<'item', T> & C>,\n) => $map0({ input: ex, as: 'item', expr: map(ctx<T>()('item')) })\nexport const $map = <T, R, D, C = unknown>(\n ex: Expr<Arr<T>, D, C>,\n map: (i: Expr<T, D, RORec<'item', T>>) => Expr<R, D, RORec<'item', T> & C>,\n) => $map1(ex, i => map(i.expr()))\n","import type { Arr, Exclude, HKT, I, N, O, StrKey, Type, notArr, rawItem } from '../../types'\nimport { Field } from '../field'\nimport type { Expr } from '../types'\nimport { mapExactToObject0, type MapO } from '../utils/map-object'\n\ntype Omit<T, K extends keyof any> = T extends T ? Pick<T, Exclude<keyof T, K>> : never\n\ndeclare const Updater: unique symbol\nexport type Updater<in R, in T, out V, in C = unknown> = {\n [Type]?(x: typeof Updater, r: R, t: T, c: C): V\n readonly raw: <D extends O>(f: Field<D, R | N>) => readonly (readonly [string, rawItem])[]\n}\n\nexport const subUpdater = <P extends O, D, T, V, Ctx>(\n a: Updater<D, T, V, Ctx>,\n f: Field<P, D>,\n): Updater<P, T, V, Ctx> => ({ raw: <R extends O>(g: Field<R, P | N>) => a.raw(g.with(f)) })\n\nexport interface UpdaterHKT<R, Old, V, C, K extends keyof Old = keyof Old, V2 extends V = V>\n extends UpdaterQHKT<R, Old, V2, StrKey<V>, C, K> {}\n\nexport interface UpdaterQHKT<R, Old, V, KV extends StrKey<V>, C, K extends keyof Old = keyof Old>\n extends HKT<KV> {\n readonly out: Updater<R, Get<Old, I<KV, this>, K>, V[I<KV, this>], C>\n}\n\nexport type Get<T, P extends string, K extends keyof T = never> = P extends K\n ? T[P] // help typescript to make a decision\n : P extends keyof T\n ? T[P]\n : undefined\n\nconst rawSet =\n <R, Old extends notArr, C, V, K extends keyof Old, KV extends StrKey<V>>(\n fields: MapO<V, UpdaterQHKT<R, Old, V, KV, C, K>, KV>,\n ) =>\n <D extends O>(f: Field<D, R | N, unknown>): readonly (readonly [string, rawItem])[] => {\n type U = UpdaterQHKT<R, Old, V, KV, C, K>\n return Object.entries(mapExactToObject0<V, U, U, KV>(fields, v => v)).flatMap(([k, v]) =>\n v.raw(f).map(([l, v]) => [`.${k}${l}`, v]),\n )\n }\n\nexport const set =\n <V>() =>\n <R, Old extends notArr, C = unknown, K extends keyof Old = never>(\n fields: MapO<V, UpdaterHKT<R, Old, V, C, K>>,\n ): Updater<R, Old, O & Omit<Old, StrKey<V>> & V, C> &\n Updater<R, Arr<Old>, Arr<Omit<Old, StrKey<V>> & V>, C> => ({\n raw: rawSet(fields),\n })\n\nexport const setQ = <VV, Q extends O>() => {\n type V = Omit<VV, StrKey<Q>>\n type KV = Exclude<StrKey<VV>, StrKey<Q>>\n return <R extends Q, C = unknown, K extends keyof R = never>(\n fields: MapO<V, UpdaterQHKT<R, R, VV, KV, C, K>, KV>,\n ): Updater<R, R, Q & Omit<R, StrKey<VV>> & V, C> => ({\n raw: rawSet<R, R, C, VV, K, KV>(fields),\n })\n}\nexport const weaken = <R, T, V, C = unknown>(\n updater: Updater<R, T, V, C>,\n): Updater<R | null, T | N, V | null, C> => ({ raw: f => updater.raw(f) })\n\nexport const to = <R, V, C = unknown, T = unknown>(expr: Expr<V, R, C>): Updater<R, T, V, C> => ({\n raw: f => [['', expr.raw(f).get()]],\n})\nexport const items = <R, T, V, C = unknown>(x: Updater<R, T, V, C>) =>\n x as {} as Updater<R, Arr<T>, Arr<V>, C>\n","import type { RawObj, ReadonlyCollection, WriteonlyCollection } from '../../types'\nimport { safeNarrow } from './json';\n\nexport const dbcoll = (x: ReadonlyCollection<unknown> | WriteonlyCollection<never>) => safeNarrow<RawObj>()({\n db: x.dbName,\n coll: x.collectionName,\n})\n","import type { O, RWCollection, ReadonlyCollection, Replace, jsonItem } from '../../types'\nimport type { ExprsExact } from '../expression/concat'\nimport { root, type Field } from '../field'\nimport type { RawStages } from '../types'\nimport { dbcoll } from '../utils/coll'\nimport { asStages } from './prefix'\nimport { rawVars } from './raws'\n\nexport type MergeInto<T extends O, Out extends O, E = unknown> =\n | { whenNotMatched: 'insert'; into: RWCollection<T, Out> & E }\n | { whenNotMatched: 'discard' | 'fail'; into: ReadonlyCollection<Out> & E }\n\n// whenNotMatched == 'insert' || whenMatched == 'replace' => Out extends T\n// whenMatched == 'merge' => Out extends T | into: WriteonlyCollection<Out>\n// whenMatched == 'merge' => Out extends T | into: WriteonlyCollection<Out>\nexport type MergeArgs<T extends O, Out extends O, Ctx, In extends O> = {\n on: Field<T, jsonItem> & Field<Out, jsonItem>\n} & MergeInto<T, Out> &\n (\n | ({ stages?: never } & (\n | { whenMatched: 'keepExisting' | 'fail' }\n | {\n whenMatched: 'replace'\n into: RWCollection<T, Out>\n }\n | {\n whenMatched: 'merge'\n into: RWCollection<Replace<Out, T>, Out>\n }\n ))\n | {\n stages: true\n into: RWCollection<In, Out>\n whenMatched: RawStages<unknown, Out, In, { new: T }>\n }\n | {\n stages: 'ctx'\n vars: ExprsExact<Ctx, T>\n into: RWCollection<In, Out>\n whenMatched: RawStages<unknown, Out, In, Ctx>\n }\n )\n\nexport const $merge_ = <T extends O, Out extends O = T, Ctx = unknown, In extends O = Out>({\n into,\n on,\n whenNotMatched,\n ...notMatched\n}: MergeArgs<T, Out, Ctx, In>) =>\n asStages<unknown, T, 'out'>([\n {\n $merge: {\n into: dbcoll(into),\n on: on.str(),\n ...(whenNotMatched && { whenNotMatched }),\n ...(notMatched.stages && {\n whenMatched: notMatched.whenMatched,\n ...(notMatched.stages === 'ctx' && { let: rawVars(notMatched.vars, root<T>()) }),\n }),\n },\n },\n ])\nexport const $merge2 = <T extends O, Out extends O = T, Ctx = unknown, In extends O = Out>(\n args: MergeArgs<T, Out, Ctx, In>,\n) => $merge_<T, Out, Ctx, In>(args)\n","import type {\n ConstHKT,\n Filter,\n HKT,\n I,\n IdHKT,\n Omit,\n Exclude,\n OPick,\n RWCollection,\n Timestamp,\n WriteonlyCollection,\n} from '../../types'\nimport type { doc, ID, N, O, rawItem, Rec, Replace, RORec, StrKey } from '../../types/json'\nimport { mergeObjects, ne, notNull, or } from '../expression'\nimport { field, type ExprHKT, type ExprsExact } from '../expression/concat'\nimport { $ifNull, and, eq, eqTyped, ite, sub } from '../expression/logic'\nimport { current, nil, val } from '../expression/val'\nimport { ctx, Field, root } from '../field'\nimport type {\n Before,\n DeletedAt,\n Delta,\n Expr,\n IsDeleted,\n Model,\n RawStages,\n StreamRunnerParam,\n TeardownRecord,\n TS,\n} from '../types'\nimport { set, to } from '../update'\nimport { id } from '../utils/json'\nimport { mapExact, mapExactToObject, spread, type Exact, type MappedHKT } from '../utils/map-object'\nimport { $replaceWith_, $set_ } from './mongo-stages'\nimport { $merge_ } from './out'\nimport { link } from './prefix'\n\ntype OutInputE<T, E, A = T | null> = ID & Rec<'after', A> & E\ntype Allowed<K extends string> = Exclude<K, keyof (TS & ID)>\n\nexport type Patch<V, KK extends StrKey<V> = StrKey<V>> = (\n | (OPick<V, Allowed<KK>> & ID)\n | (Rec<Allowed<KK>, N> & ID)\n) &\n TS\ntype TakeDoc<V, E = ID, KK extends StrKey<V> = StrKey<V>> = OPick<V, Allowed<KK>> & E\ntype ND = { readonly deletedAt?: null }\n\ntype SafeE<E> = Omit<E, `$${string}` | keyof ID>\n\ntype Args<P, Out> = [added: Expr<P, unknown, { new: P }>, old: Expr<Out, Out>]\ntype Result<P> = Expr<P, unknown, { new: P }>\ntype Update<P, Out> = (...args: Args<P, Out>) => Result<P>\ntype UpdateF<P, Out> = <K extends keyof IsDeleted>(\n ...args: Args<Replace<P, RORec<K, Timestamp>>, Out>\n) => Result<Replace<P, RORec<K, Timestamp>>>\n\nexport const getSubsetMatchForExt = <\n Out extends Model,\n P extends O & ID & TS,\n E extends Record<keyof E, rawItem>,\n>(\n ext: Exact<E, IdHKT>,\n): null | Expr<boolean, Rec<'old' | 'merged', Out | Replace<Out, P>>> => {\n type OldAndMerged = Rec<'old' | 'merged', Out | Replace<Out, P>>\n const extObj: Record<StrKey<E>, Expr<boolean, OldAndMerged>> = mapExactToObject<\n E,\n IdHKT,\n ConstHKT<Expr<boolean, OldAndMerged>>\n >(ext, (v, k) => {\n return eq<unknown, OldAndMerged>(\n root<OldAndMerged>()\n .of('old')\n .of(k as never)\n .expr() as Expr<unknown, OldAndMerged>,\n )(val(v))\n })\n const checks = Object.values<Expr<boolean, OldAndMerged>>(extObj)\n return checks.length ? (checks.length === 1 ? checks[0]! : and(...checks)) : null\n}\n\nexport const getWhenMatchedForMerge = <\n Out extends Model,\n P extends O & ID & TS,\n K extends keyof IsDeleted,\n>(\n whenNotMatched: 'discard' | 'fail' | 'insert',\n update: Update<Replace<P, RORec<K, Timestamp>>, Out>,\n canWrite: Expr<boolean, Rec<'old' | 'merged', Out | Replace<Out, P>>> | null,\n): RawStages<O, Out, Out | Replace<Out, P>, RORec<'new', Replace<P, RORec<K, Timestamp>>>> => {\n const orNull = <T, C>(e: Expr<Timestamp | N, T, C>) =>\n whenNotMatched === 'discard' ? $ifNull(e, nil) : e\n type PP = Replace<P, RORec<K, Timestamp>>\n\n type Merged = Replace<Out, P>\n type OldAndMerged = Rec<'old' | 'merged', Out | Merged>\n\n const newOrOld: Field<O<DeletedAt>, O<DeletedAt>, RORec<'new', O<DeletedAt>>> = whenNotMatched ===\n 'insert'\n ? ctx<O<DeletedAt>>()('new')\n : root<O<DeletedAt>>()\n const deletedAt = orNull(newOrOld.of('deletedAt').expr()) as Expr<Timestamp | N, Out, { new: PP }>\n const merged = mergeObjects<Out, PP | O<DeletedAt>, Out, { new: PP }>(\n root<Out>().expr(),\n update(ctx<PP>()('new').expr(), root<Out>().expr()),\n field<O<DeletedAt>, Out, { new: PP }>({\n deletedAt: ['deletedAt', deletedAt],\n }),\n ) as Expr<Replace<Out, P>, Out, { new: PP }>\n return link<Out, { new: PP }>()\n .with(\n $replaceWith_<Out, OldAndMerged, { new: PP }>(\n field<OldAndMerged, Out, { new: PP }>({\n old: ['old', root<Out>().expr()],\n merged: ['merged', merged],\n }),\n ),\n )\n .with(getWhenMatched<Out, P>(whenNotMatched, canWrite)).stages\n}\nexport const getWhenMatched = <Out extends Model, P extends O & ID & TS>(\n whenNotMatched: 'discard' | 'fail' | 'insert',\n canWrite: Expr<boolean, Rec<'old' | 'merged', Out | Replace<Out, P>>> | null,\n): RawStages<O, Rec<'old' | 'merged', Out | Replace<Out, P>>, Out | Replace<Out, P>> => {\n const orNull = <T, C>(e: Expr<Timestamp | N, T, C>) =>\n whenNotMatched === 'discard' ? $ifNull(e, nil) : e\n\n type Merged = Replace<Out, P>\n type OldAndMerged = Rec<'old' | 'merged', Out | Merged>\n const preMergeOld: Expr<Out | Merged, OldAndMerged> = mergeObjects<\n Out | Merged,\n O<DeletedAt>,\n OldAndMerged\n >(\n root<OldAndMerged>().of('old').expr(),\n field<O<DeletedAt> & TS, OldAndMerged>({\n deletedAt: ['deletedAt', orNull(root<OldAndMerged>().of('old').of('deletedAt').expr())],\n touchedAt: ['touchedAt', root<OldAndMerged>().of('merged').of('touchedAt').expr()],\n }),\n )\n\n const diff = ne<Out | Merged, OldAndMerged>(preMergeOld)(root<OldAndMerged>().of('merged').expr())\n const useNew = canWrite\n ? and(diff, or(notNull(root<OldAndMerged>().of('old').of('deletedAt').expr()), canWrite))\n : diff\n\n return link<OldAndMerged>().with(\n $replaceWith_<OldAndMerged, Out | Replace<Out, P>>(\n ite(useNew, root<OldAndMerged>().of('merged').expr(), root<OldAndMerged>().of('old').expr()),\n ),\n ).stages\n}\n\ntype MergeCollection<V extends O, Out extends Model> =\n | {\n coll: RWCollection<Out | Replace<Out, Patch<V>> | Replace<Patch<V>, IsDeleted>, Out>\n whenNotMatched: 'discard'\n }\n | {\n coll: RWCollection<Out | Replace<Out, Patch<V>>, Out>\n whenNotMatched: 'fail'\n }\ntype MergeUpdate<V, Out> = UpdateF<\n ((OPick<V, Allowed<StrKey<V>>> & ID) | (Rec<Allowed<StrKey<V>>, N> & ID)) & TS,\n Out\n>\n\nconst $mergeX = <\n V extends O,\n Out extends Model,\n Source extends O,\n SourcePart extends doc,\n EEE extends { [K in StrKey<EEE>]: rawItem },\n Intermediate extends O = Source,\n>(\n out: MergeCollection<V, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, SourcePart>,\n f: Field<Intermediate, SourcePart>,\n map: (x: Expr<Patch<V>, Intermediate>) => Expr<Patch<V>, Source>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n update: MergeUpdate<V, Out>,\n): StreamRunnerParam<Source, 'out'> => {\n type EE = SafeE<EEE>\n type E = Omit<EE, keyof (ND & TS)>\n type K = Allowed<StrKey<V>>\n type T = OPick<V, K> & ID\n type P = (T | (Rec<K, N> & ID)) & TS\n type In1 = Out | Replace<Out, P> | Replace<P, IsDeleted>\n type In2 = Out | Replace<Out, P>\n const patch: ExprsExact<OPick<V, K>, Intermediate> = mapExact<\n OPick<V, K>,\n ExprHKT<SourcePart>,\n ExprHKT<Intermediate>\n >(keys, <P extends StrKey<OPick<V, K>>>(v: Expr<OPick<V, K>[P], SourcePart>) => {\n return $ifNull<OPick<V, K>[P], Intermediate, unknown>(sub(v, f), nil)\n })\n interface EqHKT<Dom = unknown> extends HKT<Dom> {\n readonly out: Record<'$eq', I<Dom, this>>\n }\n const filter: {\n readonly [K in StrKey<E>]: Record<'$eq', E[K]>\n } = mapExactToObject<E, IdHKT, MappedHKT<E, EqHKT>>(ext, v => ({ $eq: v }))\n const sameSubset = getSubsetMatchForExt<Out, P, E>(ext)\n\n const setDeleted = out.whenNotMatched === 'discard'\n\n const replacer: Expr<Patch<V>, Source> = map(\n field<T & TS, Intermediate>(\n spread<Pick<V, K>, ID & TS, ExprHKT<Intermediate>, keyof O, O[keyof O]>(patch, {\n _id: ['_id', f.of('_id').expr()],\n touchedAt: ['touchedAt', current],\n }),\n ),\n )\n\n const sss: RawStages<unknown, P, 'out'> = setDeleted\n ? link<P>()\n .with<O, Replace<P, IsDeleted>>(\n $set_<O, P, Replace<P, IsDeleted>>(\n set<IsDeleted>()({\n deletedAt: ['deletedAt', to<P, Timestamp>(current)],\n }),\n ),\n )\n .with(\n $merge_<Replace<P, IsDeleted>, Out, unknown, In1>({\n into: out.coll,\n on: root<doc>().of('_id'),\n whenNotMatched: 'insert',\n stages: true,\n whenMatched: getWhenMatchedForMerge<Out, P, keyof IsDeleted>(\n out.whenNotMatched,\n update,\n sameSubset,\n ),\n }),\n ).stages\n : link<P>().with(\n $merge_<P, Out, unknown, In2>({\n into: out.coll,\n on: root<doc>().of('_id'),\n whenNotMatched: 'fail',\n stages: true,\n whenMatched: getWhenMatchedForMerge<Out, P, never>(\n out.whenNotMatched,\n update,\n sameSubset,\n ),\n }),\n ).stages\n\n const teardown = <W>(coll: WriteonlyCollection<W>): TeardownRecord<W, 'updateMany'> => ({\n collection: coll,\n method: 'updateMany',\n params: [\n filter as Filter<W>,\n [\n {\n $unset: Object.keys(\n mapExactToObject<TakeDoc<V, unknown>, IdHKT, ConstHKT<1>>(keys, () => 1),\n ),\n },\n ],\n ],\n })\n return {\n raw: (first: boolean): RawStages<unknown, Source, 'out'> =>\n link<Source>().with<unknown, P>($replaceWith_<Source, P>(replacer)).with<unknown, 'out'>(sss)\n .stages,\n teardown: c => c(teardown(out.coll)),\n }\n}\n\nexport const $mergeId =\n <V extends O>() =>\n <\n SourcePart extends doc,\n Out extends Model,\n E = unknown,\n EEE extends { [K in keyof EEE]: rawItem } = {},\n >(\n out: MergeCollection<V, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, SourcePart>,\n id: Expr<string, OutInputE<TakeDoc<V>, E, null>>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<OutInputE<SourcePart, E>, 'out'> => {\n type OutInput<T, A = T | null> = OutInputE<T, E, A>\n interface AfterHKT<T> extends HKT {\n readonly out: OutInput<T> & RORec<'after', I<unknown, this>>\n }\n type KK = StrKey<V>\n type K = Allowed<KK>\n type T = TakeDoc<V>\n type Patch = (T | (Rec<K, N> & ID)) & TS\n\n type Source = OutInputE<SourcePart, E>\n type Intermediate = OutInputE<0, E, SourcePart>\n\n return $mergeX<V, Out, Source, SourcePart, EEE, Intermediate>(\n out,\n keys,\n root<Intermediate>().of('after'),\n or => {\n return ite<Patch, null, SourcePart, AfterHKT<SourcePart>>(\n eqTyped<null, SourcePart, AfterHKT<SourcePart>>(\n root<OutInput<SourcePart>>().of('after').expr(),\n nil,\n ),\n field<RORec<K, N> & ID & TS, OutInput<T, null>>(\n spread<RORec<K, N>, ID & TS, ExprHKT<OutInput<T, null>>>(\n mapExact<OPick<V, Allowed<KK>>, IdHKT, ConstHKT<Expr<null, unknown>>>(\n keys,\n () => nil,\n ),\n {\n _id: ['_id', id],\n touchedAt: ['touchedAt', current],\n },\n ),\n ),\n or,\n )\n },\n ext,\n update,\n )\n }\n\nexport const $simpleMergePart =\n <V extends O>() =>\n <Source extends doc, Out extends Model, EEE extends { [K in StrKey<EEE>]: rawItem }>(\n out: MergeCollection<V, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, Source>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<Source, 'out'> =>\n $mergeX<V, Out, Source, Source, EEE>(out, keys, root(), id, ext, update)\n\nexport const $simpleMerge =\n <V extends O>() =>\n <Source extends doc, Out extends Model>(\n out: RWCollection<Out | Replace<Out, Patch<V>> | Replace<Patch<V>, IsDeleted>, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, Source>,\n whenNotMatched: 'fail' | 'discard' = 'fail',\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<Source, 'out'> =>\n $mergeX<V, Out, Source, Source, {}>({ coll: out, whenNotMatched }, keys, root(), id, {}, update)\n\nexport const $mergePart =\n <V extends O>() =>\n <Out extends Model, SourcePart extends doc, EEE extends { [K in keyof EEE]: rawItem }>(\n out: RWCollection<Out | Replace<Out, Patch<V>>, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, SourcePart>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<Delta<SourcePart>, 'out'> => {\n type Doc = Rec<'before', (doc & SourcePart) | null>\n return $mergeId<V>()<SourcePart, Out, Before<SourcePart | null>, EEE>(\n { coll: out, whenNotMatched: 'fail' },\n keys,\n assertNotNull(\n root<Doc>().of<Doc, 'before', 1>('before').of<doc & SourcePart, '_id', null>('_id').expr(),\n ),\n ext,\n update,\n )\n }\nexport const $merge =\n <V extends O>() =>\n <Out extends Model, SourcePart extends doc>(\n out: RWCollection<Out | Replace<Out, Patch<V>>, Out>,\n keys: ExprsExact<TakeDoc<V, unknown>, SourcePart>,\n update: MergeUpdate<V, Out> = x => x,\n ): StreamRunnerParam<Delta<SourcePart>, 'out'> =>\n $mergePart<V>()<Out, SourcePart, {}>(out, keys, {}, update)\n\nconst assertNotNull = <T, D, C>(expr: Expr<T | N, D, C>) => expr as Expr<T, D, C>\n","import { getWhenMatched } from '../../$merge'\nimport type {\n App,\n AsLiteral,\n HKT,\n ID,\n O,\n RWCollection,\n RORec,\n Rec,\n Replace,\n notArr,\n Omit,\n Exclude,\n} from '../../../../types'\nimport { concat, field, type ExprHKT, type ExprsExact } from '../../../expression/concat'\nimport { $rand, current, nil, val } from '../../../expression/val'\nimport { ctx, root } from '../../../field'\nimport type { DeletedAt, Expr, IsDeleted, Model, RawStages, TS } from '../../../types'\nimport type { DeltaAccumulatorHKT, DeltaAccumulators } from '../../../types/accumulator'\nimport { set, subUpdater, to, type Get, type Updater, type UpdaterHKT } from '../../../update/updater'\nimport { map1 } from '../../../utils/json'\nimport { mapExact0, spread0, type MapO, type MappedHKT, type MergeHKT } from '../../../utils/map-object'\nimport { $replaceWith_, $set_ } from '../../mongo-stages'\nimport { $merge_ } from '../../out'\nimport { link } from '../../prefix'\n\ntype GI<GG> = Exclude<GG, keyof TS>\nexport type IdAndTsKeys = keyof (TS & ID)\n\n// TS & ID & V_Grp & Extra\ntype V<VV, GG extends string> = Omit<VV, IdAndTsKeys | GI<GG>>\nexport type Prepare<Grp, GG extends string> = TS & ID & Rec<GI<GG>, Grp>\ntype Par<T> = { [P in keyof T]?: T[P] | null }\n\nexport type Loose<Grp, VV, GG extends string> = Prepare<Grp, GG> & Par<V<VV, GG>> & DeletedAt\nexport type Strict<Grp, VV, GG extends string, EE> = Prepare<Grp, GG> &\n V<VV, GG> &\n Omit<EE, IdAndTsKeys | GI<GG> | keyof V<VV, GG>>\nexport type V_Grp<VV, GG extends string, Grp> = Rec<GI<GG>, Grp> & V<VV, GG>\nexport type Extra<EE, VV, GG extends string> = Omit<EE, IdAndTsKeys | GI<GG> | keyof V<VV, GG>>\n\ntype OrReplace<T, V> = T | Replace<T, V>\ntype ND = { readonly deletedAt?: null }\n\ntype StrictReady<Grp extends notArr, VV extends O, GG extends string, EE> = TS &\n ID &\n V_Grp<VV, GG, Grp> &\n Extra<EE, VV, GG>\ntype InsertReady<Grp extends notArr, VV extends O, GG extends string, EE> = Replace<\n StrictReady<Grp, VV, GG, EE>,\n ND\n>\ntype DiscardReady<Grp extends notArr, VV extends O, GG extends string, EE> = Replace<\n StrictReady<Grp, VV, GG, EE>,\n IsDeleted\n>\ntype MatchedReady<Out, VV extends O, GG extends string, EE> = Replace<\n Out,\n Replace<V<VV, GG>, Extra<EE, VV, GG>> & Model\n>\ntype MatchedIn<Out, VV extends O, GG extends string, EE> = Out | MatchedReady<Out, VV, GG, EE>\n\nexport type MergedInput<Out, VV, Grp, GG extends string, EE> = OrReplace<\n Replace<Replace<Out, V<VV, GG>>, Extra<EE, VV, GG>> & Model,\n TS & ID & V_Grp<VV, GG, Grp> & Extra<EE, VV, GG>\n>\n\ntype SubMergeInInsert<Out, VV extends O, Grp extends notArr, GG extends string, EE> =\n MatchedIn<Out, VV, GG, EE> | InsertReady<Grp, VV, GG, EE>\ntype SubMergeInDiscard<Out, VV extends O, Grp extends notArr, GG extends string, EE> =\n MatchedIn<Out, VV, GG, EE> | DiscardReady<Grp, VV, GG, EE>\nexport type SubMergeInFail<\n Out,\n VV extends O,\n Grp extends notArr,\n GG extends string,\n EE,\n> = OrReplace<MatchedReady<Out, VV, GG, EE>, StrictReady<Grp, VV, GG, EE>>\n\ntype SubMergeIntoFail<\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE,\n Out extends Loose<Grp, VV, GG>,\n> = RWCollection<MatchedIn<Out, VV, GG, EE>, Out>\n\ntype SubMergeIntoInsert<\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE,\n Out extends Loose<Grp, VV, GG>,\n> = RWCollection<SubMergeInInsert<Out, VV, Grp, GG, EE>, Out>\n\ntype SubMergeIntoDiscard<\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE,\n Out extends Loose<Grp, VV, GG>,\n> = RWCollection<SubMergeInDiscard<Out, VV, Grp, GG, EE>, Out>\n\nexport type SubMergeOut<\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, VV, GG> = Loose<Grp, VV, GG>,\n> =\n | { whenNotMatched: 'insert'; into: SubMergeIntoInsert<Grp, VV, GG, EE, Out> }\n | { whenNotMatched: 'discard'; into: SubMergeIntoDiscard<Grp, VV, GG, EE, Out> }\n | { whenNotMatched: 'fail'; into: SubMergeIntoFail<Grp, VV, GG, EE, Out> }\n\nexport const subMerge = <\n T extends O,\n Grp extends notArr,\n VV extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, VV, GG> = Loose<Grp, VV, GG>,\n>(\n args: DeltaAccumulators<T, V<VV, GG>>,\n out: SubMergeOut<Grp, VV, GG, EE, Out>,\n gid: AsLiteral<GI<GG>>,\n // ExprsExact<Extra, V_Grp>\n extra: ExprsExact<Extra<EE, VV, GG>, V_Grp<VV, GG, Grp>>,\n idPrefix: string,\n first: boolean,\n): RawStages<unknown, V_Grp<VV, GG, Grp>, 'out'> => {\n type GID = GI<GG>\n type V_Grp = Rec<GID, Grp> & V\n // TS & ID & V_Grp & Extra\n type ReadyForMerge = StrictReady<Grp, VV, GG, EE>\n type Denied = IdAndTsKeys | GID\n type V = Omit<VV, Denied>\n type PV = Par<V>\n type New = RORec<'new', ReadyForMerge>\n type Extra = Omit<EE, IdAndTsKeys | GID | keyof V>\n\n const e: ExprsExact<Extra, ReadyForExtra> = extra\n type OldAndNew<T = Out> = Rec<'old', Out> & Rec<'merged', T>\n const mergeOldWithNew: MapO<V, UpdaterHKT<OldAndNew, Out, V, New, never>> = mapExact0<\n V,\n MappedHKT<V, DeltaAccumulatorHKT<T>>,\n UpdaterHKT<OldAndNew, Out, V, New, never>\n >(args, (v, k) =>\n to(\n first\n ? ctx<O<V>>()('new').of(k).expr()\n : v.merge<OldAndNew, New>(\n root<Rec<'old', O<PV>>>().of('old').of(k).expr(),\n ctx<O<V>>()('new').of(k).expr(),\n ),\n ),\n )\n\n const mergeAggregates: RawStages<O, OldAndNew, OldAndNew<Replace<Out, V>>, New> = $set_<\n O,\n OldAndNew,\n OldAndNew<Replace<Out, V>>,\n New\n >(\n set<Rec<'merged', Replace<Out, V>>>()({\n merged: ['merged', set<V>()(mergeOldWithNew)],\n }),\n )\n\n type Update<R, X, C = unknown, Subset extends X = X> = UpdaterHKT<R, R, X, C, never, Subset>\n const gidPath: Expr<Grp, V_Grp> = root<V_Grp>().of(gid).expr()\n\n type ExtraAndId = ID & TS & Extra\n type InsertReady = Replace<ReadyForMerge, ND>\n type DiscardReady = Replace<ReadyForMerge, IsDeleted>\n type ExtraAndIdHKT = MergeHKT<\n Extra,\n ID & TS,\n Update<V_Grp, Extra>,\n Update<V_Grp, ID & TS>\n >\n const mapId = <K extends string, F extends HKT<K>, X>(\n k: AsLiteral<K>,\n v: App<F, K>,\n ): MapO<RORec<K, X>, F> => map1(k, v)\n\n const F1: MapO<ID & TS, Update<V_Grp, ID & TS>> = {\n _id: ['_id', to(idPrefix ? concat(val(idPrefix), $rand) : $rand)],\n touchedAt: ['touchedAt', to(current)],\n }\n const F2: MapO<RORec<GID, Grp>, Update<V_Grp, RORec<GID, Grp>>> = mapId<\n GID,\n Update<V_Grp, RORec<GID, Grp>>,\n Grp\n >(gid, to(gidPath))\n const extraAndId: MapO<ExtraAndId, ExtraAndIdHKT> = spread0<\n Extra,\n ID & TS,\n Update<V_Grp, Extra>,\n Update<V_Grp, ID & TS>\n >(\n mapExact0<Extra, MappedHKT<Extra, ExprHKT<V_Grp>>, Update<V_Grp, Extra>>(extra, to),\n F1,\n )\n const extraIdAndGroup = spread0<\n ExtraAndId,\n RORec<GID, Grp>,\n ExtraAndIdHKT,\n Update<V_Grp, RORec<GID, Grp>>\n >(extraAndId, F2)\n const addExtraAndMerge = extraIdAndGroup as MapO<ReadyForMerge, Update<V_Grp, ReadyForMerge>>\n\n const addTSAndExtra: MapO<Extra, Update<ReadyForExtra, Extra, New>> = {\n ...mapExact0<Extra, MappedHKT<Extra, ExprHKT<ReadyForExtra>>, Update<ReadyForExtra, Extra>>(\n e,\n to,\n ),\n ...(out.whenNotMatched === 'insert' ? { deletedAt: ['deletedAt', to(nil)] } : {}),\n touchedAt: ['touchedAt', to(current)],\n }\n\n type ReadyForExtra = Replace<Out, V>\n type ReadyForWhenMatched = MatchedReady<Out, VV, GG, EE>\n\n const updater = set<Extra>()<ReadyForExtra, ReadyForExtra, New>(addTSAndExtra) as Updater<\n ReadyForExtra,\n ReadyForExtra,\n ReadyForWhenMatched,\n New\n >\n\n type In = MatchedIn<Out, VV, GG, EE>\n\n type WhenMatched = RawStages<\n O,\n Rec<'old' | 'merged', Out | ReadyForWhenMatched>,\n In\n >\n const whenMatched: WhenMatched = getWhenMatched<Out, Replace<V, Extra> & Model>(\n out.whenNotMatched,\n null,\n )\n\n const whenMatchedStages = link<Out, New>()\n .with<O, OldAndNew>(\n $replaceWith_(\n field({\n old: ['old', root<Out>().expr()],\n merged: ['merged', root<Out>().expr()],\n }),\n ),\n )\n .with<O, OldAndNew<ReadyForExtra>>(mergeAggregates)\n .with<O, OldAndNew<ReadyForWhenMatched>>(\n $set_<O, OldAndNew<ReadyForExtra>, OldAndNew<ReadyForWhenMatched>>(\n set<Rec<'merged', ReadyForWhenMatched>>()({\n merged: ['merged', subUpdater(updater, root<OldAndNew<ReadyForExtra>>().of('merged'))],\n }),\n ),\n )\n .with<O, In>(whenMatched).stages\n\n const ready = $set_<O, V_Grp, ReadyForMerge>(\n set<ReadyForMerge>()<V_Grp, V_Grp>(addExtraAndMerge),\n )\n const stages = link<V_Grp>().with<unknown, ReadyForMerge>(ready)\n\n if (out.whenNotMatched === 'insert') {\n const insertMarker = $set_<O, ReadyForMerge, InsertReady>(\n set<ND>()<ReadyForMerge, ReadyForMerge>({\n deletedAt: [\n 'deletedAt',\n to<ReadyForMerge, null, unknown, Get<ReadyForMerge, 'deletedAt'>>(nil),\n ],\n }),\n )\n return stages\n .with<unknown, InsertReady>(insertMarker)\n .with<unknown, 'out'>(\n $merge_<InsertReady, Out, New, In>({\n into: out.into,\n whenNotMatched: 'insert',\n on: root<Out | InsertReady>().of(gid),\n vars: {\n new: [\n 'new',\n root<InsertReady>().expr() as Expr<ReadyForMerge, InsertReady>,\n ],\n },\n stages: 'ctx',\n whenMatched: whenMatchedStages,\n }),\n ).stages\n }\n\n if (out.whenNotMatched === 'discard') {\n const discardMarker = $set_<O, ReadyForMerge, DiscardReady>(\n set<IsDeleted>()<ReadyForMerge, ReadyForMerge>({\n deletedAt: [\n 'deletedAt',\n to<ReadyForMerge, IsDeleted['deletedAt'], unknown, Get<ReadyForMerge, 'deletedAt'>>(\n current,\n ),\n ],\n }),\n )\n return stages\n .with<unknown, DiscardReady>(discardMarker)\n .with<unknown, 'out'>(\n $merge_<DiscardReady, Out, New, In>({\n into: out.into,\n whenNotMatched: 'insert',\n on: root<Out | DiscardReady>().of(gid),\n vars: {\n new: [\n 'new',\n root<DiscardReady>().expr() as Expr<ReadyForMerge, DiscardReady>,\n ],\n },\n stages: 'ctx',\n whenMatched: whenMatchedStages,\n }),\n ).stages\n }\n\n return stages.with<unknown, 'out'>(\n $merge_<ReadyForMerge, Out, New, In>({\n into: out.into,\n whenNotMatched: 'fail',\n on: root<Out | ReadyForMerge>().of(gid),\n vars: { new: ['new', root<ReadyForMerge>().expr()] },\n stages: 'ctx',\n whenMatched: whenMatchedStages,\n }),\n ).stages\n}\n","import type { ConstHKT, Exclude, Omit } from '../../../types'\nimport type { AsLiteral, ID, O, RORec, Rec, doc, notArr } from '../../../types/json'\nimport { mergeExpr, type ExprHKT, type ExprsExact } from '../../expression/concat'\nimport { root } from '../../field'\nimport type { Delta, DeltaAccumulatorHKT, DeltaAccumulators, Expr, StreamRunnerParam, TS } from '../../types'\nimport { map1 } from '../../utils/json'\nimport { mapExactToObject } from '../../utils/map-object'\nimport { link } from '../prefix'\nimport { subGroup } from './utils/sub-group'\nimport {\n subMerge,\n type Extra,\n type IdAndTsKeys,\n type Loose,\n type SubMergeOut,\n type V_Grp,\n} from './utils/sub-merge'\n\ntype Denied<GID = never> = keyof (TS & ID) | GID\ntype WithGRP<V, Grp, GID extends string> = Rec<GID, Grp> & V\nconst addGrp =\n <V extends O, Grp, GID extends string>(gid: AsLiteral<GID>) =>\n <D extends Rec<'_id', Grp>>(\n expr: ExprsExact<O & Omit<V, Denied<GID>>, D>,\n ): ExprsExact<Rec<GID, Grp> & Omit<V, Denied<GID>>, D> => {\n return mergeExpr<Omit<V, Denied<GID>>, RORec<GID, Grp>, D, unknown, keyof O, O[keyof O]>(\n expr,\n map1(gid, root<D>().of('_id').expr()),\n )\n }\ntype GI<GG> = Exclude<GG, keyof TS>\n\nexport type GroupMergeOut<\n Grp extends notArr,\n V extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, V, GG> = Loose<Grp, V, GG>,\n> = SubMergeOut<Grp, V, GG, EE, Out>\n\nexport type GroupMergeCollection<\n WhenNotMatched extends GroupMergeOut<never, never, never>['whenNotMatched'],\n Grp extends notArr,\n V extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, V, GG> = Loose<Grp, V, GG>,\n> = (GroupMergeOut<Grp, V, GG, EE, Out> & { whenNotMatched: WhenNotMatched })['into']\n\nexport const $groupMerge = <\n T extends O,\n Grp extends notArr,\n V extends O,\n GG extends string,\n EE = {},\n Out extends Loose<Grp, V, GG> = Loose<Grp, V, GG>,\n>(\n id: Expr<Grp, T>,\n args: DeltaAccumulators<T, O & Omit<V, Denied<GI<GG>>>>,\n out: GroupMergeOut<Grp, V, GG, EE, Out>,\n gid: AsLiteral<GI<GG>>,\n extra: ExprsExact<Extra<EE, V, GG>, V_Grp<V, GG, Grp>>,\n idPrefix = '',\n): StreamRunnerParam<Delta<T>, 'out'> => ({\n raw: (first: boolean) =>\n link<Delta<T>>()\n .with<unknown, WithGRP<Omit<V, Denied<GI<GG>>>, Grp, GI<GG>>>(\n subGroup<T, Grp, O & Omit<V, Denied<GI<GG>>>, GI<GG>>(\n id,\n args,\n addGrp<V, Grp, GI<GG>>(gid),\n ),\n )\n .with<unknown, 'out'>(\n subMerge<T, Grp, V, GG, EE, Out>(args, out, gid, extra, idPrefix, first),\n ).stages,\n teardown: c =>\n c({\n collection: out.into,\n method: 'updateMany',\n params: [\n {},\n [\n {\n $unset: Object.keys({\n ...mapExactToObject<Extra<EE, V, GG>, ExprHKT<V_Grp<V, GG, Grp>>, ConstHKT<1>>(extra, () => 1),\n ...mapExactToObject<O & Omit<V, Denied<GI<GG>>>, DeltaAccumulatorHKT<T>, ConstHKT<1>>(args, () => 1),\n }),\n },\n ...(out.whenNotMatched === 'insert'\n ? [\n {\n $set: { deletedAt: '$$NOW', touchedAt: '$$CLUSTER_TIME' },\n },\n ]\n : []),\n ],\n ],\n }),\n})\n\nexport type GroupIdCollection<\n V extends O,\n EE = {},\n Out extends Loose<string, V, '_id'> = Loose<string, V, '_id'>,\n> = GroupMergeCollection<'fail', string, V, '_id', EE, Out>\nexport const $groupId = <\n T extends O,\n V extends O,\n EE = {},\n Out extends Loose<string, V, '_id'> = Loose<string, V, '_id'>,\n>(\n id: Expr<string, T>,\n args: DeltaAccumulators<T, O & Omit<V, Denied>>,\n out: GroupIdCollection<V, EE, Out>,\n extra: ExprsExact<Omit<EE, IdAndTsKeys | keyof Omit<V, IdAndTsKeys>>, doc & Omit<V, IdAndTsKeys>>,\n): StreamRunnerParam<Delta<T>, 'out'> =>\n $groupMerge<T, string, V, '_id', EE, Out>(\n id,\n args,\n { into: out, whenNotMatched: 'fail' },\n '_id',\n extra,\n )\n\nexport type GroupCollection<\n Grp extends notArr,\n V extends O,\n EE = {},\n Out extends Loose<Grp, V, '_grp'> = Loose<Grp, V, '_grp'>,\n> = GroupMergeCollection<'insert', Grp, V, '_grp', EE, Out>\nexport const $group = <\n T extends O,\n Grp extends notArr,\n V extends O,\n EE = {},\n Out extends Loose<Grp, V, '_grp'> = Loose<Grp, V, '_grp'>,\n>(\n id: Expr<Grp, T>,\n args: DeltaAccumulators<T, O & Omit<V, Denied<'_grp'>>>,\n out: GroupCollection<Grp, V, EE, Out>,\n extra: ExprsExact<\n Omit<EE, IdAndTsKeys | '_grp' | Exclude<keyof V, IdAndTsKeys | '_grp'>>,\n Rec<'_grp', Grp> & Omit<V, IdAndTsKeys | '_grp'>\n >,\n idPrefix = '',\n): StreamRunnerParam<Delta<T>, 'out'> =>\n $groupMerge<T, Grp, V, '_grp', EE, Out>(\n id,\n args,\n { into: out, whenNotMatched: 'insert' },\n '_grp',\n extra,\n idPrefix,\n )\n","import type { ConstHKT, HKT, I, IdHKT, N, O, Omit, RORec, Rec, jsonItem } from '../../../types'\nimport { $ifNull, eqTyped, ite } from '../../expression/logic'\nimport { nil } from '../../expression/val'\nimport { root } from '../../field'\nimport type { BA, Delta, Expr, FRawStages, RawStages } from '../../types'\nimport { set, to, type Updater, type UpdaterHKT } from '../../update/updater'\nimport { mapExact1, type MapOPart } from '../../utils/map-object'\nimport { $set1 } from '../mongo-stages'\n\nexport interface ParDeltaHKT<K extends BA, T extends jsonItem, E> extends HKT<jsonItem> {\n readonly out: RORec<K, I<jsonItem, this>> & Delta<T> & E\n}\n\nconst deltaExpr =\n <T extends jsonItem, V extends jsonItem, E>(\n expr: <K extends BA>(field: K) => Expr<V | null, Rec<K, T> & Delta<T> & E>,\n ) =>\n <K extends BA>(field: K): Expr<V | null, Delta<T> & E> => {\n type F = ParDeltaHKT<K, T, E>\n return ite<V | null, null, T, F>(\n eqTyped<null, T, F, unknown>($ifNull(root<Delta<T>>().of(field).expr(), nil), nil),\n nil,\n expr(field),\n )\n }\n\ntype Delta2<T extends jsonItem, BA2 extends string> = Delta<T> & RORec<BA2, T | null>\nexport const $setEach1 = <\n T extends jsonItem,\n V extends jsonItem,\n BA2 extends string,\n E = unknown,\n C = unknown,\n>(\n updater: (k: BA) => Updater<Delta<T> & RORec<BA2, T | null> & E, T | N, V | null, C>,\n dict: MapOPart<RORec<BA2>, ConstHKT<BA>>,\n): FRawStages<unknown, Delta2<T, BA2> & E, Rec<BA2, V | null> & Omit<Delta<T> & E, BA2>, C, 1> => {\n type DV = RORec<BA2, V | null>\n type R = Delta<T> & RORec<BA2, T | null> & E\n return $set1<unknown, R, Rec<BA2, V | null> & Omit<R, BA2>, C>(\n set<DV>()(mapExact1<BA2, ConstHKT<BA>, UpdaterHKT<R, R, DV, C, BA2>>(dict, updater)),\n )\n}\n\nexport const $setEach = <\n T extends O,\n V extends jsonItem,\n BA2 extends string,\n E = unknown,\n C = unknown,\n>(\n updater: (k: BA) => Updater<Delta<T> & E, T | N, V | null, C>,\n dict: MapOPart<RORec<BA2>, ConstHKT<BA>>,\n): RawStages<unknown, Delta<T> & E, Delta<T> & Rec<BA2, V | null> & Omit<E, BA2>, C, 1> =>\n $setEach1<T, V, BA2, E, C>(updater, dict)<IdHKT<O>>(root) as RawStages<\n unknown,\n Delta<T> & E,\n Delta<T> & Rec<BA2, V | null> & Omit<E, BA2>,\n C,\n 1\n >\n\nexport const $replaceWithEach1 = <T extends O, V extends jsonItem, E = unknown>(\n t: <K extends BA>(field: K) => Expr<V | null, Delta<T> & E>,\n) => {\n return $setEach<T, V, BA, E>(k => to(t(k)), {\n after: ['after', 'after'],\n before: ['before', 'before'],\n }) as RawStages<unknown, Delta<T> & E, Delta<V> & Omit<E, BA>>\n}\n\nexport const $replaceWithEach = <T extends O, V extends jsonItem, E = unknown>(\n expr: <K extends BA>(field: K) => Expr<V | null, Rec<K, T> & Delta<T> & E>,\n): RawStages<unknown, Delta<T> & E, Delta<V> & Omit<E, BA>> =>\n $replaceWithEach1<T, V, E>(deltaExpr<T, V, E>(expr))\n","import type { App, O, Rec, jsonItem } from '../../../types'\nimport { sub } from '../../expression/logic'\nimport { nil } from '../../expression/val'\nimport { root } from '../../field'\nimport type { BA, Delta, Expr, PreDelta, RawStages } from '../../types'\nimport { subUpdater, to, weaken, type Updater } from '../../update/updater'\nimport { link } from '../prefix'\nimport { $replaceWithEach, $setEach, type ParDeltaHKT } from './$replace-with-each'\n\nexport const $replaceWithDelta = <T extends O, V extends jsonItem>(\n expr: Expr<V, T>,\n): RawStages<unknown, Delta<T>, Delta<V>> =>\n $replaceWithEach<T, V>(<K extends BA>(field: K) =>\n sub(expr, root<App<ParDeltaHKT<K, T, unknown>, T>>().of(field)),\n )\n\nexport const $setDelta = <T extends O, V extends O, C = unknown>(updater: Updater<T, T, V, C>) => {\n const dict = {\n after1: ['after1', 'after'],\n before1: ['before1', 'before'],\n } as const\n type BA1<X = V> = Rec<`${BA}1`, X | null>\n type DD = BA1 & Delta<T>\n const side = (k: BA) => root<Delta<T>>().of<PreDelta<T | null>, BA>(k)\n const update = (k: BA) => subUpdater(weaken(updater), side(k))\n return link<Delta<T>, C>()\n .with<unknown, BA1<T> & Delta<T>>(\n $setEach<T, T, `${BA}1`, unknown, C>(k => to(side(k).expr()), dict),\n )\n .with<unknown, BA1 & Delta<T>>($setEach<T, V, `${BA}1`, unknown, C>(update, dict))\n .with<unknown, Delta<V> & BA1>(\n $replaceWithEach<T, V, BA1>(field => root<DD>().of<BA1, `${BA}1`>(`${field}1`).expr()),\n )\n .with<unknown, Delta<V>>($setEach<V, V, `${BA}1`, unknown, C>(k => to(nil), dict)).stages\n}\n","import type { App, AsLiteral, HKT, IdHKT, N } from '../../types'\n\nexport type Equal<Dom, T extends Dom, V extends Dom> = {\n forward: <F extends HKT<Dom>>(x: App<F, T>) => App<F, V>\n forward1: (x: T) => V\n backward: <F extends HKT<Dom>>(x: App<F, V>) => App<F, T>\n backward1: (x: V) => T\n}\nexport const sym = <Dom, T extends Dom, V extends Dom>(eq: Equal<Dom, T, V>): Equal<Dom, V, T> => ({\n backward: eq.forward,\n forward: eq.backward,\n backward1: eq.forward1,\n forward1: eq.backward1,\n})\nexport const reflex = <Dom, T extends Dom>(): Equal<Dom, T, T> => ({\n backward: id,\n forward: id,\n backward1: id,\n forward1: id,\n})\nconst id = <T>(x: T) => x\nconst assertEqual = <Dom, T extends Dom, V extends Dom>() => reflex() as Equal<Dom, T, V>\n\nexport const fromEq = <Dom, T extends Dom, V extends Dom>(\n eq: Pick<Equal<Dom, T, V>, 'forward' | 'backward'>,\n): Equal<Dom, T, V> => ({\n ...eq,\n backward1: eq.backward<IdHKT<Dom>>,\n forward1: eq.forward<IdHKT<Dom>>,\n})\nexport const literalsEqaul = <T extends keyof any | boolean | N, V extends T>(\n _: AsLiteral<T> & V,\n) => assertEqual<T, T, V>()\n","import type { App, HKT, rawItem } from '../../types'\nimport type { Predicate } from '../types'\n\ntype Operators = '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$in' | '$nin' | '$type' | '$exists'\nexport const operator =\n <\n K extends Operators,\n F extends HKT<Dom2, HKT<Dom1, unknown>>,\n Dom1,\n Dom2 = Dom1,\n G extends HKT<Dom2, HKT<Dom1, unknown>> = F,\n >() =>\n <D2 extends Dom2 = Dom2>(op: K) =>\n <T extends Dom1>(operand: rawItem & App<App<F, D2>, T>): Predicate<App<App<G, D2>, T>> => {\n return {\n raw: { [op]: operand },\n }\n }\n","import type { Arr, ArrHKT, ConstHKT, HKT, I, IdHKT, N, rawItem, RawObj, RConstHKT, Timestamp } from '../../types'\nimport { operator } from './utils'\n\nconst dualEq = operator<'$eq' | '$ne', ConstHKT<IdHKT<unknown>>, unknown>()\n\nexport const $eq = dualEq('$eq')\nexport const $ne = dualEq('$ne')\n\ntype Numeric = number | Timestamp | Date\nexport const comp = operator<'$gt' | '$lt' | '$gte' | '$lte', RConstHKT<Numeric>, Numeric, Numeric>()\n\nexport const $gt = comp<Numeric>('$gt')\nexport const $gtTs = comp<Timestamp>('$gt')\nexport const $gteTs = comp<Timestamp>('$gte')\nexport const $lt = comp<number>('$lt')\nexport const dateLt = comp<Date>('$lt')\nexport const $gte = comp<number>('$gte')\nexport const $lte = comp<number>('$lte')\n\ninterface DictHKT<T> extends HKT<keyof T, unknown> {\n readonly out: T[I<keyof T, this>] | N\n}\n\ndeclare const unknown: unique symbol\ntype MongoTypes = {\n number: number,\n array: Arr<rawItem>,\n string: string,\n object: RawObj,\n [i: number]: unknown\n}\n\nexport type MongoTypeNames = keyof MongoTypes\n\nexport const $type = operator<'$type', ConstHKT<ArrHKT<keyof MongoTypes>>, keyof MongoTypes, unknown, ConstHKT<DictHKT<MongoTypes>> >()('$type')\nexport const $exists = operator<'$exists', ConstHKT<ConstHKT<boolean>>, keyof MongoTypes, unknown, ConstHKT<ConstHKT<unknown>> >()('$exists')\n\n","import type { O, RawObj } from '../../types'\nimport type { Expr, Query } from '../types'\nimport { safeNarrow } from '../utils/json'\n\nexport const $expr = <D extends O, C>(expr: Expr<boolean, D, C>): Query<D, C> => ({\n raw: f => safeNarrow<RawObj>()({ $expr: expr.raw(f).get() }),\n})\n","import type { ArrHKT, ConstHKT, IdHKT } from '../../types'\nimport { operator } from './utils'\n\nconst dualIn = operator<\n '$in' | '$nin',\n ConstHKT<ArrHKT>,\n unknown,\n unknown,\n ConstHKT<IdHKT>\n>()\n\nexport const $in = dualIn('$in')\nexport const $nin = dualIn('$nin')\n","import type { doc } from '../../../types'\nimport { ite, ne } from '../../expression/logic'\nimport { nil } from '../../expression/val'\nimport { root } from '../../field'\nimport { $expr } from '../../predicate'\nimport type { BA, Delta, Expr, RawStages } from '../../types'\nimport { $match_ } from '../mongo-stages'\nimport { concatStages } from '../prefix'\nimport { $replaceWithDelta } from '../set/$set-delta'\n\nexport const $matchDelta = <T extends doc>(query: Expr<boolean, T>) =>\n concatStages<unknown, Delta<T>, Delta<T | null>, Delta<T>, unknown>(\n $replaceWithDelta(ite(query, root<T>().expr(), nil)),\n matchDelta(),\n )\nexport const matchDelta = <D>() => {\n const part = (side: BA) => root<Delta<D | null>>().of(side).expr()\n return $match_<Delta<D | null>>(\n $expr<Delta<D | null>, unknown>(\n ne<D | null, Delta<D | null>, unknown>(part('before'))(part('after')),\n ),\n ) as RawStages<unknown, Delta<D | null>, Delta<D>>\n}\n","import { $matchDelta } from './$match-delta'\nimport type { doc } from '../../../types'\nimport { $expr } from '../../predicate/$expr'\nimport type { DeltaStages, Expr } from '../../types'\nimport { $match1 } from '../raws'\n\nexport const $match = <T extends doc>(query: Expr<boolean, T>): DeltaStages<T, T, T> => ({\n raw: $match1($expr(query)),\n delta: $matchDelta<T>(query),\n})\n","import type { App, Arr, AsLiteral, doc, Exclude, HKT, I, ID, N, O, Rec, RORec } from '../../../types'\nimport { $let, $map0, concat, field, mergeExpr, nil, val } from '../../expression'\nimport { array, concatArray, filter, first, inArray, mergeObjects } from '../../expression/array'\nimport { $ifNull, eq, eqTyped, ite, not } from '../../expression/logic'\nimport { ctx, Field, root } from '../../field'\nimport type {\n BA,\n Deleted,\n DeletedFlags,\n Delta,\n Expr,\n NTrue,\n PreDelta,\n RawStages,\n} from '../../types'\nimport { literalsEqaul, type Equal } from '../../utils/guard'\nimport { map1 } from '../../utils/json'\nimport { matchDelta } from '../match'\nimport { $replaceWith_, $unwind_ } from '../mongo-stages'\nimport { link } from '../prefix'\n\ntype s = string\n\n/** Identity of an unwound join row: one side’s `_id`, or a concat of both. */\nexport type JoinId<K1 extends s, K2 extends s> =\n | K1\n | K2\n | readonly [K1, middle: s, K2]\n | readonly [K2, middle: s, K1]\n\n/** `_id` of a join row for `k`: `k1` / `k2` alone, or `concat` in tuple order. */\nexport const joinIdOf = <K1 extends s, K2 extends s, D, C = unknown>(\n k: JoinId<K1, K2>,\n k1: K1,\n k1Id: Expr<s, D, C>,\n k2Id: Expr<s, D, C>,\n): Expr<s, D, C> => {\n if (k === k1) return k1Id\n if (typeof k === 'string') return k2Id\n const idOf = (key: K1 | K2): Expr<s, D, C> => (key === k1 ? k1Id : k2Id)\n return concat(idOf(k[0]), val<s>(k[1]), idOf(k[2]))\n}\n/** One unwound slot. `_id` is chosen once, when the slot is built. `{}` means that side is deleted. */\ntype Slot<X> = PreDelta<X> & ID\n/** An item, or an empty-side `{}`, already stamped with its slot id. */\ntype Key<X> = { readonly _id: s; readonly value: X }\ntype Keyed<X> = O<Key<X>>\ntype ManyIn<K1 extends s, T extends doc, K2 extends s, U extends doc, N1 extends null> = Delta<\n Rec<K1, T | N1> & Rec<K2, Arr<U>>\n>\n/**\n * If `probe` is null, the root is `App<F, null>` and the result is null.\n * Otherwise the root is `App<F, T>` and `keep` (typed at that root) is the result.\n */\nconst andAlso = <T, V, F extends HKT<null | T>, C = unknown>(\n probe: Expr<null | T, App<F, null | T>, C>,\n keep: Expr<V, App<F, T>, C>,\n): Expr<V | null, App<F, null | T>, C> =>\n ite<V | null, null, T, F, C>(eqTyped<null, T, F, C, null | T>(probe, nil), nil, keep)\n\ntype DDelta<T> = PreDelta<T> & {\n readonly deleted: DeletedFlags | N\n}\n/**\n * `$replaceWith`. Pair `k2` into slots and copy `k1` out as its own delta.\n * A missing `k2` array counts as `[]`.\n * `Pad` is `{}` when the right side is outer (`N2` is `null`), otherwise `never`.\n * Only the outer instantiation inserts the `{}` sentinel.\n *\n * Call shape used below: `slotsMany('left', 'right', ['left', '.', 'right'])`.\n * `L` is `{ _id: 'L' }`. `p1` is `{ _id: 'p1', n: 1 }`. `p1b` is `{ _id: 'p1', n: 2 }`.\n * Each item is stamped with its slot `_id` first. Before and after then match on that id.\n * `k === k1` stamps the document id, so `p1` → `p2` is one slot. `k === k2` stamps the item id.\n * A tuple uses `concat` in that order. The `k1` component is the document `_id`, the `k2` component is the item `_id`.\n * An empty outer side is one entry with the document id, so it meets an item only when that item's slot id is the same.\n * `k === k2` is not padded: an empty side has no item id.\n * A `{}` value is the deleted side. The join writes `deleted` from that, not the slot.\n *\n * Both sides empty. `before: null` is the same split as `right: []`. The left id is `L`.\n * ```\n * { _id: 'inv', before: null, after: { left: L, right: [] } }\n * → { _id: 'inv', before: null, after: { left: L, right: [] },\n * left: { before: null, after: L },\n * right: [{ _id: 'L', before: {}, after: {} }] }\n * ```\n *\n * `[]` → `[p1]`. The empty side is a disappearing sentinel, not paired with `p1`.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [] },\n * after: { left: L, right: [p1] } }\n * → right: [{ _id: 'L', before: {}, after: null },\n * { _id: 'L.p1', before: null, after: p1 }]\n * ```\n *\n * `[p1]` → `[]`. The old item is closed, then a separate appearing sentinel.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [p1] },\n * after: { left: L, right: [] } }\n * → right: [{ _id: 'L.p1', before: p1, after: null },\n * { _id: 'L', before: null, after: {} }]\n * ```\n *\n * Same `_id`, changed body. One slot, no sentinel.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [p1] },\n * after: { left: L, right: [p1b] } }\n * → right: [{ _id: 'L.p1', before: p1, after: p1b }]\n * ```\n *\n * Left id `L` → `M` on that same payment. The slot keeps `before`'s left id.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [p1] },\n * after: { left: { _id: 'M' }, right: [p1] } }\n * → right: [{ _id: 'L.p1', before: p1, after: p1 }]\n * ```\n *\n * `[p1]` → `[p2]`. Delete plus insert, still no sentinel.\n * ```\n * { _id: 'inv',\n * before: { left: L, right: [p1] },\n * after: { left: L, right: [{ _id: 'p2', n: 1 }] } }\n * → right: [{ _id: 'L.p1', before: p1, after: null },\n * { _id: 'L.p2', before: null, after: { _id: 'p2', n: 1 } }]\n * ```\n *\n * `left` is copied beside the slots. On the fresh document above it is\n * `{ before: null, after: L }`. On the others it is `{ before: L, after: L }`,\n * except the `L` → `M` case, where `after` is `{ _id: 'M' }`.\n *\n * `k === 'left'`. One slot, id `L`. `p1` → `p2` does not split.\n * ```\n * { before: { left: L, right: [p1] }, after: { left: L, right: [{ _id: 'p2', n: 1 }] } }\n * → right: [{ _id: 'L', before: p1, after: { _id: 'p2', n: 1 } }]\n * ```\n * Outer, `[]` → `[p1]`. The empty side is `{}` on that same slot. The join marks `deleted.before`.\n * ```\n * → right: [{ _id: 'L', before: {}, after: p1 }]\n * ```\n *\n * `k === 'right'`. Id is the payment id. `p1` → `p2` is a delete plus an insert. No sentinel.\n * ```\n * → right: [{ _id: 'p1', before: p1, after: null },\n * { _id: 'p2', before: null, after: { _id: 'p2', n: 1 } }]\n * ```\n */\nconst slotsMany = <\n K1 extends s,\n T extends doc,\n KK2 extends s,\n U extends doc,\n N1 extends null = never,\n Pad extends O | never = never,\n>(\n k1: AsLiteral<K1>,\n k2: AsLiteral<Exclude<KK2, K1 | BA>>,\n k: JoinId<K1, Exclude<KK2, K1 | BA>>,\n /** Empty side. Outer is one `{ _id: document id, value: {} }`. Inner is `[]`. */\n emptyOf: (\n id: Expr<s, ManyIn<K1, T, Exclude<KK2, K1 | BA>, U, N1>>,\n ) => Expr<Arr<Keyed<U | Pad>>, ManyIn<K1, T, Exclude<KK2, K1 | BA>, U, N1>>,\n): RawStages<\n unknown,\n Delta<Rec<K1, T | N1> & Rec<Exclude<KK2, K1 | BA>, Arr<U>>>,\n Rec<K1, DDelta<T | null>> & Rec<Exclude<KK2, K1 | BA>, Arr<Slot<U | Pad | null>>>\n> => {\n type K2 = Exclude<KK2, K1 | BA>\n type Pair<A, B> = Rec<K1, A> & Rec<K2, B>\n type In = ManyIn<K1, T, K2, U, N1>\n type K1Delta = DDelta<T | null>\n type K2Delta = Slot<U | Pad | null>\n type Deltas = Pair<K1Delta, Arr<K2Delta>>\n\n const emptyArr: Expr<Arr<U>, In> = array<U, In>()\n const src: Field<In, In> = root<In>()\n const k2Arr = (side: BA): Expr<Arr<U> | null, In> =>\n src.of<In, BA>(side).of<Pair<T | N1, Arr<U>>, K2, null>(k2).expr()\n const k2OrEmpty = (side: BA): Expr<Arr<U>, In> =>\n $ifNull<Arr<U>, In, unknown>(k2Arr(side), emptyArr)\n const k1Id: Expr<s, In> = root<In>().of<In, '_id'>('_id').expr()\n const k1Delta: Expr<K1Delta, In> = field<K1Delta, In>({\n before: [\n 'before',\n $ifNull<T | null, In, unknown>(\n src.of<In, 'before'>('before').of<Pair<T | N1, Arr<U>>, K1, null>(k1).expr(),\n nil,\n ),\n ],\n after: [\n 'after',\n $ifNull<T | null, In, unknown>(\n src.of<In, 'after'>('after').of<Pair<T | N1, Arr<U>>, K1, null>(k1).expr(),\n nil,\n ),\n ],\n deleted: ['deleted', src.of('deleted').expr()],\n })\n const itemId = <C>(k2Id: Expr<s, In, C>): Expr<s, In, C> => {\n const at = (key: K1 | K2) => (key === k1 ? k1Id : k2Id)\n if (typeof k === 'string') return at(k)\n return concat<In, C>(at(k[0]), val<s>(k[1]), at(k[2]))\n }\n const keyed = (side: BA): Expr<Arr<Keyed<U | Pad>>, In> => {\n type Items = RORec<'items', Arr<U>>\n const items = ctx<Arr<U>>()('items').expr()\n return $let<Arr<Keyed<U | Pad>>, In, unknown, Items>(\n { items: ['items', k2OrEmpty(side)] },\n ite<Arr<Keyed<U | Pad>>, In, Items>(\n eq<Arr<U>, In, Items>(items)(emptyArr),\n emptyOf(k1Id),\n $map0<'b', U, Keyed<U | Pad>, In, Items>({\n input: items,\n as: 'b',\n expr: field<Key<U | Pad>, In, RORec<'b', U> & Items>({\n _id: ['_id', itemId<RORec<'b', U> & Items>(ctx<U>()('b').of<U, '_id'>('_id').expr())],\n value: ['value', ctx<U>()('b').expr()],\n }),\n }),\n ),\n )\n }\n const beforeKeyed = keyed('before')\n const afterKeyed = keyed('after')\n type KeyedArr = Arr<Keyed<U | Pad>>\n type Vars = RORec<'beforeK' | 'afterK', KeyedArr>\n const bound = <N extends 'beforeK' | 'afterK'>(name: N) => ctx<KeyedArr>()(name).expr()\n const idOf = <N extends 'a' | 'b'>(name: N) =>\n ctx<Keyed<U | Pad>>()(name).of<Key<U | Pad>, '_id', 1>('_id').expr()\n const valueOf = <N extends 'a' | 'b'>(name: N) =>\n ctx<Keyed<U | Pad>>()(name).of<Key<U | Pad>, 'value', 1>('value').expr()\n const kept = $map0<'b', Keyed<U | Pad>, Slot<U | Pad | null>, unknown, Vars>({\n input: bound('beforeK'),\n as: 'b',\n expr: field<Slot<U | Pad | null>, unknown, RORec<'b', Keyed<U | Pad>> & Vars>({\n _id: ['_id', idOf('b')],\n before: ['before', valueOf('b')],\n after: [\n 'after',\n first<U | Pad, unknown, RORec<'b', Keyed<U | Pad>> & Vars>(\n $map0<'a', Keyed<U | Pad>, U | Pad, unknown, RORec<'b', Keyed<U | Pad>> & Vars>({\n input: filter<Keyed<U | Pad>, unknown, 'a', RORec<'b', Keyed<U | Pad>> & Vars>({\n expr: bound('afterK'),\n as: 'a',\n limit: val(1),\n cond: eq<s, unknown, RORec<'a' | 'b', Keyed<U | Pad>> & Vars>(idOf('a'))(idOf('b')),\n }),\n as: 'a',\n expr: valueOf('a'),\n }),\n ),\n ],\n }),\n })\n const beforeIds = $map0<'id', Keyed<U | Pad>, s, unknown, Vars>({\n input: bound('beforeK'),\n as: 'id',\n expr: ctx<Keyed<U | Pad>>()('id').of<Key<U | Pad>, '_id', 1>('_id').expr(),\n })\n const added = $map0<'a', Keyed<U | Pad>, Slot<U | Pad | null>, unknown, Vars>({\n input: filter<Keyed<U | Pad>, unknown, 'a', Vars>({\n expr: bound('afterK'),\n as: 'a',\n cond: not<unknown, RORec<'a', Keyed<U | Pad>> & Vars>(\n inArray<s, unknown, RORec<'a', Keyed<U | Pad>> & Vars>(idOf('a'), beforeIds),\n ),\n }),\n as: 'a',\n expr: field<Slot<U | Pad | null>, unknown, RORec<'a', Keyed<U | Pad>> & Vars>({\n _id: ['_id', idOf('a')],\n before: ['before', nil],\n after: ['after', valueOf('a')],\n }),\n })\n const slots = $let<Arr<Slot<U | Pad | null>>, In, unknown, Vars>(\n {\n beforeK: ['beforeK', beforeKeyed],\n afterK: ['afterK', afterKeyed],\n },\n concatArray<Slot<U | Pad | null>, In, Vars>(kept, added),\n )\n return $replaceWith_<In, Deltas>(\n field<RORec<K1, K1Delta> & RORec<K2, Arr<K2Delta>>, In>(\n mergeExpr<RORec<K2, Arr<K2Delta>>, RORec<K1, K1Delta>, In>(\n map1(k2, slots),\n map1(k1, k1Delta),\n ),\n ),\n )\n}\n\n/** Inner right: an empty side stays empty. */\nconst noEmpty = <K1 extends s, T extends doc, K2 extends s, U extends doc, N1 extends null>(\n _id: Expr<s, ManyIn<K1, T, K2, U, N1>>,\n): Expr<Arr<Keyed<U>>, ManyIn<K1, T, K2, U, N1>> => array<Keyed<U>, ManyIn<K1, T, K2, U, N1>>()\n\n/** Outer right: an empty side is one `{}` entry, id the document id. */\nconst padEmpty = <K1 extends s, T extends doc, K2 extends s, U extends doc, N1 extends null>(\n id: Expr<s, ManyIn<K1, T, K2, U, N1>>,\n): Expr<Arr<Keyed<U | O>>, ManyIn<K1, T, K2, U, N1>> =>\n array<Keyed<U | O>, ManyIn<K1, T, K2, U, N1>>(\n field<Key<O>, ManyIn<K1, T, K2, U, N1>>({\n _id: ['_id', id],\n value: ['value', field<{}, ManyIn<K1, T, K2, U, N1>>({})],\n }),\n )\n\n/**\n * `$replaceWith`. Rebuild each side of the slot as a join row, or null.\n * The row `_id` is the slot `_id` from `slotsMany`, on both sides.\n * A side whose value is `{}` is marked `deleted`.\n *\n * A null `k2` omits that side. `{}` is stored as a null `k2`.\n * A null `k1` omits the side when the left is inner. When the left is outer, the row stays and `k1` is null.\n *\n * Call shape: `joinMany('left', 'right')`.\n *\n * Fresh empty, inner left. `before` is omitted because `left` is null. The slot id is `L`.\n * Outer left keeps that side: `{ _id: 'L', left: null, right: null }`.\n * ```\n * { _id: 'inv', left: { before: null, after: L },\n * right: { _id: 'L', before: {}, after: {} } }\n * → { _id: 'inv',\n * before: null,\n * after: { _id: 'L', left: L, right: null },\n * deleted: { before: true, after: true } }\n * ```\n *\n * `[]` → `[p1]`, sentinel slot. `after` is null, not the new payment.\n * ```\n * { _id: 'inv', left: { before: L, after: L },\n * right: { _id: 'L', before: {}, after: null } }\n * → { _id: 'inv',\n * before: { _id: 'L', left: L, right: null },\n * after: null,\n * deleted: { before: true, after: false } }\n * ```\n *\n * `[]` → `[p1]`, new payment.\n * ```\n * { _id: 'inv', left: { before: L, after: L }, right: { _id: 'L.p1', before: null, after: p1 } }\n * → { _id: 'inv',\n * before: null,\n * after: { _id: 'L.p1', left: L, right: p1 } }\n * ```\n *\n * `[p1]` → `[]`, closed payment.\n * ```\n * { _id: 'inv', left: { before: L, after: L }, right: { _id: 'L.p1', before: p1, after: null } }\n * → { _id: 'inv',\n * before: { _id: 'L.p1', left: L, right: p1 },\n * after: null }\n * ```\n *\n * `[p1]` → `[]`, appearing sentinel.\n * ```\n * { _id: 'inv', left: { before: L, after: L },\n * right: { _id: 'L', before: null, after: {} } }\n * → { _id: 'inv',\n * before: null,\n * after: { _id: 'L', left: L, right: null },\n * deleted: { before: false, after: true } }\n * ```\n *\n * `p1` → `p1b`. Both rows copy `L.p1`.\n * ```\n * { _id: 'inv', left: { before: L, after: L }, right: { _id: 'L.p1', before: p1, after: p1b } }\n * → { _id: 'inv',\n * before: { _id: 'L.p1', left: L, right: p1 },\n * after: { _id: 'L.p1', left: L, right: p1b } }\n * ```\n *\n * Left id `L` → `M`. The slot id was fixed as `L.p1`, so both rows use it.\n * ```\n * { _id: 'inv', left: { before: L, after: { _id: 'M' } },\n * right: { _id: 'L.p1', before: p1, after: p1 } }\n * → { _id: 'inv',\n * before: { _id: 'L.p1', left: L, right: p1 },\n * after: { _id: 'L.p1', left: { _id: 'M' }, right: p1 } }\n * ```\n */\nconst joinMany = <\n K1 extends s,\n T extends doc,\n K2 extends s,\n U extends doc,\n N1 extends null = never,\n N2 extends null = never,\n>(\n k1: AsLiteral<K1>,\n k2: AsLiteral<K2>,\n /** `literalsEqaul<null, N1>(includeNull1)` when the left side is outer. */\n eq1: false | Equal<null, null, N1>,\n /** `literalsEqaul<null, N2>(includeNull2)` when the right side is outer. */\n eq2: false | Equal<null, null, N2>,\n): RawStages<\n unknown,\n Rec<K1, DDelta<T | null>> & Rec<K2, Slot<U | O | null>>,\n Delta<(Rec<K1, T | N1> & Rec<K2, U | N2> & ID) | null>\n> => {\n type Pair<A, B> = Rec<K1, A> & Rec<K2, B>\n type Row<A, B> = Pair<A, B> & ID\n type Join = Row<T | N1, U | N2>\n type K1Delta = DDelta<T | null>\n type K2Delta = Slot<U | O | null>\n type Doc = Pair<K1Delta, K2Delta>\n interface UnwoundK1 extends HKT<T | null> {\n readonly out: Pair<DDelta<I<T | null, this>>, K2Delta>\n }\n type UnwoundK1K2<X extends U | O | null> = Pair<DDelta<T>, Slot<X>>\n interface UnwoundK1K2F extends HKT<U | O | null> {\n readonly out: UnwoundK1K2<I<U | O | null, this>>\n }\n /** `k1` stays `T | null`. Outer left reads it with `$ifNull`. */\n type UnwoundK2<X extends U | O | null> = Pair<K1Delta, Slot<X>>\n interface UnwoundK2F extends HKT<U | O | null> {\n readonly out: UnwoundK2<I<U | O | null, this>>\n }\n\n const doc: Field<Doc, Doc> = root<Doc>()\n const id = <D extends Rec<K2, doc>>(): Expr<s, D> => root<D>().of(k2).of('_id').expr()\n const k1At = (side: BA): Expr<T | null, Doc> => doc.of<Doc, K1>(k1).of<K1Delta, BA>(side).expr()\n const rowOf = <A, B, D extends Rec<K2, doc>>(a: Expr<A, D>, b: Expr<B, D>): Expr<Row<A, B>, D> =>\n mergeObjects<ID & Rec<K1, A>, Rec<K2, B>, D>(\n mergeObjects<ID, Rec<K1, A>, D>(\n field<RORec<'_id', s>, D>({ _id: ['_id', id<D>()] }),\n field<RORec<K1, A>, D>(map1(k1, a)),\n ),\n field<RORec<K2, B>, D>(map1(k2, b)),\n )\n const rowPad = <A, D extends Rec<K2, doc>>(\n k1v: Expr<A, D>,\n n2: Equal<null, null, N2>,\n ): Expr<Row<A, N2>, D> => {\n interface Right extends HKT<null> {\n readonly out: Expr<I<null, this>, D>\n }\n return rowOf<A, N2, D>(k1v, n2.forward<Right>(nil))\n }\n const rowReal = <A, D extends Rec<K2, doc>>(\n k1v: Expr<A, D>,\n k2v: Expr<U, D>,\n ): Expr<Row<A, U>, D> => rowOf<A, U, D>(k1v, k2v)\n /** Null `k2` omits the side. `{}` is stored as null when `eq2` is set, otherwise the side is omitted. */\n const k2join = <A, F extends HKT<U | O | null>>(\n raw: Expr<U | O | null, App<F, U | O | null>>,\n orNull: Expr<U | null, App<F, U | null>>,\n pad: Expr<Row<A, N2> | null, App<F, O>>,\n real: Expr<Row<A, U>, App<F, U>>,\n ): Expr<Row<A, U | N2> | null, App<F, U | O | null>> =>\n ite<Row<A, U | N2> | null, O, U | null, F>(\n eqTyped<O, U | null, F, unknown, U | O | null>(raw, field<O, App<F, U | O | null>>({})),\n pad,\n andAlso<U, Row<A, U>, F>(orNull, real),\n )\n const joinAt = (side: BA): Expr<Join | null, Doc> => {\n const k2t = <X extends U | O | null>() =>\n root<UnwoundK1K2<X>>().of<UnwoundK1K2<X>, K2>(k2).of<Slot<X>, BA>(side).expr()\n const k2w = <X extends U | O | null>() =>\n root<App<UnwoundK2F, X>>().of<App<UnwoundK2F, X>, K2>(k2).of<Slot<X>, BA>(side).expr()\n if (!eq1) {\n const k1t = <X extends U | O | null>() =>\n root<Pair<DDelta<T>, Slot<X>>>().of(k1).of<DDelta<T>, BA>(side).expr()\n return andAlso<T, Join | null, UnwoundK1>(\n k1At(side),\n k2join<T, UnwoundK1K2F>(\n k2t<U | O | null>(),\n k2t<U | null>(),\n eq2 ? rowPad(k1t<O>(), eq2) : nil,\n rowReal(k1t<U>(), k2t<U>()),\n ),\n )\n }\n const k1v = <X extends U | O | null>(): Expr<T | N1, App<UnwoundK2F, X>> => {\n type D = App<UnwoundK2F, X>\n interface Left extends HKT<null> {\n readonly out: Expr<I<null, this>, D>\n }\n return $ifNull<T | N1, D, unknown>(\n root<D>().of<D, K1>(k1).of<K1Delta, BA>(side).expr(),\n eq1.forward<Left>(nil),\n )\n }\n return k2join<T | N1, UnwoundK2F>(\n k2w<U | O | null>(),\n k2w<U | null>(),\n eq2 ? rowPad(k1v<O>(), eq2) : nil,\n rowReal(k1v<U>(), k2w<U>()),\n )\n }\n const isPad = (side: BA): Expr<NTrue, Doc> =>\n ite(\n eq<U | O | null, Doc>(doc.of<Doc, K2>(k2).of<K2Delta, BA>(side).expr())(field<{}, Doc>({})),\n val(true),\n doc.of(k1).of<K1Delta, 'deleted', 1>('deleted').of<DeletedFlags, BA, N, 3>(side).expr(),\n )\n const joinDelta: Expr<Delta<Join | null>, Doc> = field<Rec<BA, Join | null> & Deleted & ID, Doc>({\n _id: ['_id', id()],\n before: ['before', joinAt('before')],\n after: ['after', joinAt('after')],\n deleted: [\n 'deleted',\n field<RORec<BA, NTrue>, Doc>({\n before: ['before', isPad('before')],\n after: ['after', isPad('after')],\n }),\n ],\n })\n\n return $replaceWith_(joinDelta)\n}\n\n/**\n * Unwind a lookup delta.\n * `k` is `k1` (to one), `k2`, or a concat tuple in either order.\n * `N1` / `N2` are `null` for an outer side, `never` for an inner side.\n * Pass `includeNull1` as `null` to keep a row whose `k1` is null.\n * Pass `includeNull2` as `null` to pad an empty right array, except when `k === k2`:\n * that id is the item's, so an empty right emits no row. The pad's id is the document id,\n * and it joins an item only when that item's slot id is the same. The pad value `{}` is stored as null.\n * `slotsMany`, then `$unwind`, then `joinMany`, then `matchDelta`.\n */\nexport const $unwindDelta = <\n K1 extends s,\n T extends doc,\n KK2 extends s,\n U extends doc,\n N1 extends null = never,\n N2 extends null = never,\n>(\n k1: AsLiteral<K1>,\n k2: AsLiteral<Exclude<KK2, K1 | BA>>,\n k: JoinId<K1, Exclude<KK2, K1 | BA>>,\n includeNull1?: N1,\n includeNull2?: N2,\n): RawStages<\n unknown,\n Delta<Rec<K1, T | N1> & Rec<Exclude<KK2, K1 | BA>, Arr<U>>>,\n Delta<Rec<K1, T | N1> & Rec<Exclude<KK2, K1 | BA>, U | N2> & ID>\n> => {\n type K2 = Exclude<KK2, K1 | BA>\n type In = ManyIn<K1, T, K2, U, N1>\n type Join = Rec<K1, T | N1> & Rec<K2, U | N2> & ID\n const stages = <Pad extends O | never>(\n emptyOf: (id: Expr<s, In>) => Expr<Arr<Keyed<U | Pad>>, In>,\n eq1: false | Equal<null, null, N1>,\n eq2: false | Equal<null, null, N2>,\n ) => {\n type Slots = Rec<K1, DDelta<T | null>> & Rec<K2, Arr<Slot<U | Pad | null>>>\n type Unwound = Rec<K1, DDelta<T | null>> & Rec<K2, Slot<U | Pad | null>>\n return link<In>()\n .with<unknown, Slots>(slotsMany<K1, T, KK2, U, N1, Pad>(k1, k2, k, emptyOf))\n .with<unknown, Unwound>(\n $unwind_<Rec<K1, DDelta<T | null>>, K2, Slot<U | Pad | null>, never>(k2),\n )\n .with<unknown, Delta<Join | null>>(joinMany<K1, T, K2, U, N1, N2>(k1, k2, eq1, eq2))\n .with<unknown, Delta<Join>>(matchDelta<Join>()).stages\n }\n const run = <Pad extends O | never>(\n emptyOf: (id: Expr<s, In>) => Expr<Arr<Keyed<U | Pad>>, In>,\n ) =>\n stages<Pad>(\n emptyOf,\n includeNull1 === null && literalsEqaul<null, N1>(includeNull1),\n includeNull2 === null && literalsEqaul<null, N2>(includeNull2),\n )\n if (k === k2) return run<never>(noEmpty)\n if (includeNull2 === null) return run<O>(padEmpty)\n return run<never>(noEmpty)\n}\n","import type { App, Arr, AsLiteral, doc, HKT, O, Omit, Rec, RORec } from '../../../types'\nimport { mergeObjects } from '../../expression/array'\nimport { field, fieldM } from '../../expression/concat'\nimport { root, type Field } from '../../field'\nimport type { Delta, DeltaStages } from '../../types'\nimport { set, to } from '../../update'\nimport { $set1, $unwind1 } from '../mongo-stages'\nimport { link } from '../prefix'\nimport { $replaceWithDelta } from '../set/$set-delta'\nimport { $unwindDelta, joinIdOf } from './$unwind-delta'\n\nexport { $unwindDelta, joinIdOf, type JoinId } from './$unwind-delta'\ntype s = string\n\ntype LR<T, U> = doc & { readonly left: T; readonly right: U }\ntype TOf<TT, K extends string> = doc & Omit<TT, K>\n\nexport const $unwind = <TT extends O, K extends s, U extends doc>(\n k: AsLiteral<K>,\n dict: RORec<K, 'key'> & RORec<'_id', 'id'>,\n middle = '.',\n): DeltaStages<O, TOf<TT, K> & Rec<K, Arr<U>>, TOf<TT, K> & Rec<K, U>> => {\n type T = TOf<TT, K>\n type D = T & Rec<K, U>\n const joinK = ['left', middle, 'right'] as const\n return {\n delta: link<Delta<T & Rec<K, Arr<U>>>>()\n .with<unknown, Delta<LR<T & Rec<K, Arr<U>>, Arr<U>>>>(\n $replaceWithDelta(\n field({\n _id: ['_id', root<T & Rec<K, Arr<U>>>().of('_id').expr()],\n left: ['left', root<T & Rec<K, Arr<U>>>().expr()],\n right: ['right', root<Rec<K, Arr<U>>>().of(k).expr()],\n }),\n ),\n )\n .with<unknown, Delta<LR<T & Rec<K, Arr<U>>, U>>>(\n $unwindDelta<'left', T & Rec<K, Arr<U>>, 'right', U>(\n 'left',\n 'right',\n joinK,\n ),\n )\n .with<unknown, Delta<T & Rec<K, U>>>(\n $replaceWithDelta<LR<T & Rec<K, Arr<U>>, U>, T & Rec<K, U>>(\n mergeObjects<T, Rec<K, U>, LR<T & Rec<K, Arr<U>>, U>>(\n root<LR<T & Rec<K, Arr<U>>, U>>().of('left').expr(),\n fieldM<RORec<K, 'key'> & RORec<'_id', 'id'>, RORec<'key', U> & RORec<'id', string>, LR<T & Rec<K, Arr<U>>, U>>(\n {\n key: root<LR<T & Rec<K, Arr<U>>, U>>().of('right').expr(),\n id: root<LR<T & Rec<K, Arr<U>>, U>>().of('_id').expr(),\n },\n dict,\n ),\n ),\n ),\n ).stages,\n raw: <F extends HKT<O, O>>(f: <X extends O>() => Field<App<F, X>, X>) =>\n link<App<F, T & Rec<K, Arr<U>>>>()\n .with<App<F, T>, App<F, D>>($unwind1<T, K, U>(k)(f))\n .with<App<F, T>, App<F, D>>(\n $set1(\n set<RORec<'_id', string>>()<D, D>({\n _id: [\n '_id',\n to(\n joinIdOf(\n joinK,\n 'left',\n root<D>().of('_id').expr(),\n root<D>().of<D, K>(k).of<U, '_id'>('_id').expr(),\n ),\n ),\n ],\n }),\n )(f),\n ).stages,\n }\n}\n","import crypto from 'crypto'\nimport { canonicalize as str } from 'json-canonicalize'\nimport type {\n App,\n Arr,\n AsLiteral,\n Exclude,\n HKT,\n I,\n ID,\n N,\n O,\n Omit,\n RORec,\n Rec,\n doc,\n notArr,\n} from '../../../types'\nimport { field, mergeExpr } from '../../expression/concat'\nimport { asExpr } from '../../expression/expr-base'\nimport { $ifNull, eqTyped, ite } from '../../expression/logic'\nimport { nil, val } from '../../expression/val'\nimport { Field, root } from '../../field'\nimport type { BA, Before, Delta, Expr, RawStages, TStages, UBefore } from '../../types'\nimport { set, to } from '../../update'\nimport { literalsEqaul } from '../../utils/guard'\nimport { map1 } from '../../utils/json'\nimport { $set_, $simpleLookup_ } from '../mongo-stages'\nimport { link } from '../prefix'\nimport { $replaceWithEach, $replaceWithEach1 } from '../set/$replace-with-each'\nimport { $replaceWithDelta } from '../set/$set-delta'\nimport { $unwindDelta, type JoinId } from '../unwind'\ntype s = string\ntype Both<\n K1 extends s,\n LE,\n KK2 extends s,\n RE,\n N1 extends null = never,\n N2 extends null = never,\n> = Delta<Rec<K1, LE | N1> & Rec<Exclude<KK2, BA | K1>, RE | N2> & ID>\n\nexport const $lookupDelta = <\n LQ extends O,\n LE extends LQ & doc,\n RQ extends O,\n RE extends RQ & doc,\n BRB extends UBefore<RQ>,\n RS extends UBefore<RQ>,\n S extends notArr,\n K1 extends s,\n KK2 extends s,\n N1 extends null = never,\n N2 extends null = never,\n>(\n { field1, field2 }: { field1: Field<LQ, S | N | Arr<S>>; field2: Field<RQ, S | N | Arr<S>> },\n { coll, exec, input }: TStages<RS, UBefore<RQ>, BRB, Before<RE>>,\n k1: AsLiteral<K1>,\n k2: AsLiteral<Exclude<KK2, BA | K1>>,\n k: JoinId<K1, Exclude<KK2, BA | K1>>,\n includeNull1?: N1,\n includeNull2?: N2,\n): RawStages<unknown, Delta<LE>, Both<K1, LE, KK2, RE, N1, N2>> => {\n type K2 = Exclude<KK2, BA | K1>\n type BU = Before<RE>\n const hash = crypto\n .createHash('md5')\n .update(coll.collectionName + str(input) + str(exec))\n .digest('base64url')\n\n type ABIds = Rec<'aId' | 'bId', S | Arr<S>>\n type In = Delta<Rec<K1, LE>>\n const normForeignKey = (f: BA) =>\n to(\n $ifNull(\n root<In>().of(f).of<Rec<K1, LE>, K1, null, 3>(k1).with(field1).expr(),\n asExpr<S, unknown>(val(hash)),\n ),\n )\n return link<Delta<LE>>()\n .with<unknown, Delta<Rec<K1, LE>>>(\n $replaceWithDelta<LE, Rec<K1, LE>>(field<RORec<K1, LE>, LE>(map1(k1, root<LE>().expr()))),\n )\n .with<unknown, Delta<Rec<K1, LE>> & ABIds>(\n $set_<O, Delta<Rec<K1, LE>>, Delta<Rec<K1, LE>> & ABIds>(\n set<ABIds>()({\n bId: ['bId', normForeignKey('before')],\n aId: ['aId', normForeignKey('after')],\n }),\n ),\n )\n .with<unknown, Delta<Rec<K1, LE>> & Rec<'a', Arr<BU>> & ABIds>(\n $simpleLookup_<Delta<Rec<K1, LE>> & ABIds, Before<RE>, RS, 'a', unknown, unknown, S | N>({\n coll,\n k: 'a',\n fields: {\n foreign: root<UBefore<RQ>>().of('before').with(field2),\n local: root<ABIds>().of('aId'),\n },\n vars: {},\n pipeline: link<RS>().with(input).with(exec).stages,\n }),\n )\n .with<unknown, Delta<Rec<K1, LE>> & Rec<'a' | 'b', Arr<BU>>>(\n $simpleLookup_<\n Delta<Rec<K1, LE>> & Rec<'a', Arr<BU>> & ABIds,\n Before<RE>,\n RS,\n 'b',\n unknown,\n unknown,\n S | N\n >({\n coll,\n k: 'b' as const,\n fields: {\n foreign: root<UBefore<RQ>>().of('before').with(field2),\n local: root<ABIds>().of('bId'),\n },\n vars: {},\n pipeline: link<RS>().with(input).with(exec).stages,\n }),\n )\n .with<unknown, Delta<Rec<K1, LE> & Rec<K2, Arr<RE>>>>(\n $replaceWithEach<Rec<K1, LE>, Rec<K1, LE> & Rec<K2, Arr<RE>>, Rec<'a' | 'b', Arr<BU>>>(\n <K extends BA>(\n f: K,\n ): Expr<\n (Rec<K1, LE> & Rec<K2, Arr<RE>>) | null,\n Delta<Rec<K1, LE>> & Rec<'a' | 'b', Arr<BU>>\n > => {\n type R = Delta<Rec<K1, LE>> & Rec<'a' | 'b', Arr<BU>>\n type Side = Rec<K1, LE> | null\n type Row = (Rec<K1, LE> & Rec<K2, Arr<RE>>) | null\n const joined = <S extends 'before' | 'after', A extends 'a' | 'b'>(\n side: S,\n arr: A,\n ): Expr<Row, Omit<R, S> & Rec<S, Side>> => {\n type At<X extends Side> = Omit<R, S> & Rec<S, X>\n interface AtF extends HKT<Side> {\n readonly out: At<I<Side, this>>\n }\n type Present = At<Rec<K1, LE>>\n const here = root<Present>()\n return ite<Row, null, Rec<K1, LE>, AtF>(\n eqTyped<null, Rec<K1, LE>, AtF, unknown, Side>(\n root<App<AtF, Side>>().of<RORec<S, Side>, S, 1>(side).expr(),\n nil,\n ),\n nil,\n field<RORec<K1, LE> & RORec<K2, Arr<RE>>, Present>(\n mergeExpr<RORec<K2, Arr<RE>>, RORec<K1, LE>, Present>(\n map1(k2, here.of<RORec<A, Arr<BU>>, A, 1>(arr).of<BU, 'before'>('before').expr()),\n map1(\n k1,\n here.of<RORec<S, Rec<K1, LE>>, S, 1>(side).of<RORec<K1, LE>, K1, 1>(k1).expr(),\n ),\n ),\n ),\n )\n }\n return f === 'after' ? joined('after', 'a') : joined('before', 'b')\n },\n ),\n )\n .with<unknown, Delta<Rec<K1, LE | N1> & Rec<K2, Arr<RE>>>>(\n includeNull1 === null\n ? $replaceWithEach1<Rec<K1, LE> & Rec<K2, Arr<RE>>, Rec<K1, LE | N1> & Rec<K2, Arr<RE>>>(\n <Part extends BA>(\n part: Part,\n ): Expr<\n (Rec<K1, LE | N1> & Rec<K2, Arr<RE>>) | null,\n Delta<Rec<K1, LE> & Rec<K2, Arr<RE>>>\n > => {\n type R1 = Rec<K1, LE> & Rec<K2, Arr<RE>>\n type R = Delta<R1>\n const otherPart: Field<R, R1 | null> = root<R>().of(\n part === 'after' ? 'before' : 'after',\n )\n\n interface NullK1 extends HKT<null> {\n readonly out: Expr<I<null, this>, R>\n }\n const n1 = literalsEqaul<null, N1>(includeNull1).forward<NullK1>(nil)\n const expr: Expr<\n (Rec<K1, LE | N1> & Rec<K2, Arr<RE>>) | null,\n Delta<Rec<K1, LE> & Rec<K2, Arr<RE>>>\n > = $ifNull<Rec<K1, LE | N1> & Rec<K2, Arr<RE>>, R, unknown>(\n root<R>().of(part).expr(),\n field<RORec<K1, LE | N1> & RORec<K2, Arr<RE>>, R>(\n mergeExpr<RORec<K2, Arr<RE>>, RORec<K1, N1>, R>(\n map1(k2, (otherPart as Field<R, R1>).of(k2).expr()),\n map1(k1, n1),\n ),\n ),\n )\n return expr\n },\n )\n : link<Delta<Rec<K1, LE> & Rec<K2, Arr<RE>>>>().stages,\n )\n .with<unknown, Delta<Rec<K1, LE | N1> & Rec<K2, RE | N2> & ID>>(\n $unwindDelta<K1, LE, KK2, RE, N1, N2>(k1, k2, k, includeNull1, includeNull2),\n ).stages\n}\n","import type { App, Arr, AsLiteral, HKT, ID, N, O, Rec, RORec, notArr } from '../../../types'\nimport { $ifNull, concat, val } from '../../expression'\nimport { root, type Field } from '../../field'\nimport type { Before, RawStages, TStages, UBefore } from '../../types'\nimport { set, to } from '../../update'\nimport { $replaceWith_, $set1, $simpleLookup1, $unwind1 } from '../mongo-stages'\nimport { link } from '../prefix'\nimport { type JoinId } from '../unwind'\n\ntype s = string\n\nexport const $lookupRaw =\n <\n LQ extends O,\n LE extends LQ & ID,\n RQ extends O,\n RE extends RQ & ID,\n BRB extends Before<RQ>,\n RS extends UBefore<RQ>,\n S extends notArr,\n As extends s,\n Null extends null = never,\n >(\n { field1, field2 }: { field1: Field<LQ, S | Arr<S>>; field2: Field<RQ, S | Arr<S>> },\n { coll, exec, input }: TStages<RS, Before<RQ>, BRB, Before<RE>>,\n k2: AsLiteral<As>,\n k: JoinId<'left', 'right'>,\n includeNull?: Null,\n ) =>\n <F extends HKT<O, O>>(\n f: <T extends O>() => Field<App<F, T>, T>,\n ): RawStages<App<F, LQ>, App<F, LE>, App<F, LE & Rec<As, RE | Null> & ID>> => {\n type D = LE & Rec<As, RE | Null>\n const left = root<D>().of('_id').expr()\n const right = root<D>().of<D, As>(k2).of<RE, '_id', Null>('_id').expr()\n const keepLeft = k === 'left'\n const composedId =\n typeof k === 'string' ? right : concat(left, val<s>(k[1]), right)\n return link<App<F, LE>>()\n .with<App<F, LE>, App<F, LE & Rec<As, Arr<RE>>>>(\n $simpleLookup1<LE, RE, RS, As, unknown, unknown, S | N>({\n coll,\n k: k2,\n fields: {\n local: field1,\n foreign: root<UBefore<RQ>>().of('before').with(field2),\n },\n vars: {},\n pipeline: link<RS>()\n .with<unknown, BRB>(input)\n .with<unknown, Before<RE>>(exec)\n .with<unknown, RE>($replaceWith_(root<Before<RE>>().of('before').expr())).stages,\n })(f),\n )\n .with<App<F, LE>, App<F, D>>($unwind1<LE, As, RE, Null>(k2, includeNull)(f))\n .with<App<F, LE>, App<F, D>>(\n keepLeft\n ? link<App<F, D>>().stages\n : $set1(\n set<RORec<'_id', s>>()<D, D>({\n _id: ['_id', to($ifNull(composedId, left))],\n }),\n )(f),\n ).stages\n }\n","import type { O, Rec, RecHKT } from '../../types'\nimport { root } from '../field'\nimport type { Before, FRawStages, RawStages } from '../types'\n\nexport const asBefore = <Q extends O, S extends Q, R extends Q, C = unknown>(\n f: FRawStages<Q, S, R, C>,\n): RawStages<Before<Q>, Before<S>, Before<R>, C> =>\n f<RecHKT<'before'>>(<T extends O>() => root<Rec<'before', T>>().of('before'))\n","const T = (s: string) =>\n `Timestamp(${parseInt(`${BigInt(s) / 2n ** 32n}`)}, ${parseInt(`${BigInt(s) % 2n ** 32n}`)})`\n\nconst replace = (s: string)=>s.replace(/\\{\"\\$timestamp\":\"(\\d+)\"\\}/g, (_, d) => T(d))\nconst json = (a: object) => replace(JSON.stringify(a))\n\nexport const log = (...args: unknown[]) =>\n console.log(\n new Date(),\n ...args.map(a => (typeof a === 'function' ? a(replace) : a && typeof a === 'object' ? json(a) : a)),\n )\n","import type { Collection, CreateIndexesOptions, Db, IndexSpecification } from '../../types'\nimport { type log as log1 } from './log'\n\nexport const indexMap = new Map<string, Map<string, Promise<void>>>()\n\nexport const createIndex = async (\n collection: { readonly createIndex: Collection['createIndex']; collectionName: string },\n indexSpec: IndexSpecification,\n op?: CreateIndexesOptions,\n) => {\n const { name, ...options } = op ?? {}\n const map = indexMap.get(collection.collectionName) ?? new Map<string, Promise<void>>()\n indexMap.set(collection.collectionName, map)\n const indexKey = `${JSON.stringify(indexSpec)}-${JSON.stringify(options)}`\n if (map.has(indexKey)) {\n await map.get(indexKey)\n return\n }\n const promise = createIndexWithRetry(collection, indexSpec, op)\n map.set(indexKey, promise)\n await promise\n}\nconst createIndexWithRetry = async (\n collection: { readonly createIndex: Collection['createIndex']; collectionName: string },\n indexSpec: IndexSpecification,\n options?: CreateIndexesOptions,\n) => {\n const log: typeof log1 = () => {}\n log('Creating index', { collection: collection.collectionName, indexSpec, options })\n while (true) {\n try {\n await collection.createIndex(indexSpec, options)\n log('Index created', { collection: collection.collectionName, indexSpec, options })\n } catch (e: any) {\n if ([85, 276].includes(e.code)) {\n // 85 index exists with different name, just ignore creating\n // 276 operation interrupted, it is ok\n log('Index created with different name', e.code, {\n collection: collection.collectionName,\n indexSpec,\n options,\n })\n break\n }\n if (e.code == 12587) {\n // BackgroundOperationInProgressForNamespace, wait a bit then retry\n await new Promise(res => setTimeout(res, 300))\n continue\n }\n log('Error creating index', {\n collection: collection.collectionName,\n indexSpec,\n options,\n error: e,\n })\n console.error('Error creating index', e)\n throw e\n }\n break\n }\n}\n\nexport const ensureCollection = async (db: Db, collectionName: string) => {\n if (!(await db.listCollections({ name: collectionName }, { nameOnly: true }).next())) {\n await db.createCollection(collectionName)\n }\n}\n","import type { KEYS, RaceWinner, SourceIteratorResults } from './types'\n\nexport const map = <T, K extends string & keyof T & keyof V, V>(\n x: Pick<T, K>,\n f: <P extends K>(v: Required<T>[P], k: P) => V[P],\n): V => Object.fromEntries<V, 0>(Object.entries(x).map<[K, V[K]]>(([k, v]) => [k, f(v, k)]))\n\nexport const patch = <T, K extends keyof T>({ ...x }: T, k: K, v: T[K]): T => {\n delete x[k]\n return { ...x, [k]: v }\n}\nexport const restart = <K extends KEYS, Result, Info extends Record<K, unknown>>(\n sources: SourceIteratorResults<K, Result, Info>,\n) => {\n type Sources = SourceIteratorResults<K, Result, Info>\n return map<Sources, K, Sources>(sources, x => x.stop())\n}\n\n/**\n * Races multiple source iterators against each other, returning the first one to complete.\n *\n * This function takes an object of source iterators and creates a race condition between\n * them using Promise mechanics. It returns the result of the first iterator to complete,\n * along with its corresponding key from the original object.\n *\n * @param sources - An object containing source iterators, each with a next() method that returns a Promise\n * @returns A promise that resolves to the first completed iterator result along with its key and all sources\n */\nexport const race = <W, K extends KEYS, Result, Info extends Record<K, W>>(\n sources: SourceIteratorResults<K, Result, Info>,\n): Promise<RaceWinner<K, Result, Info>> => {\n type Winner = RaceWinner<K, Result, Info>\n type Sources = SourceIteratorResults<K, Result, Info>\n const promises: readonly PromiseLike<Winner | Error>[] = Object.values<\n PromiseLike<Winner | Error>\n >(\n map<Sources, K, Record<K, PromiseLike<Winner | Error>>>(sources, (p, key) => {\n const s = p.next.then(\n frame => ({ key, frame }),\n error => new Error(error),\n )\n return s\n }),\n )\n return Promise.any<readonly (Winner | Error)[], 0>(promises).then<Winner>(\n (result: Winner | Error) => {\n if (result instanceof Error) {\n throw result\n } else {\n return result\n }\n },\n )\n}\n","import type { NextFrame, HasJob } from '../../types'\nimport type { KEYS, RaceWinner, SourceIteratorResults } from './types'\nimport { race } from './utils'\n\nexport const nextWinner = <K extends KEYS, Result, Info extends Record<K, HasJob>>(\n previousWinner: RaceWinner<K, Result, Info>,\n previousWinnerNextFrame: NextFrame<Result, Info[K]>,\n sources: SourceIteratorResults<K, Result, Info>,\n interrupt?: (key: KEYS) => boolean\n): PromiseLike<RaceWinner<K, Result, Info>> => {\n const { frame: previousFrame, key } = previousWinner\n // If we have a non interruptable job, we will wait for it to complete before doing anything else\n if (!interrupt?.(key) && previousFrame.info.job) {\n // If the received iteration is a job, wait for it to complete before doing anything else.\n return previousWinnerNextFrame.then((previousFrameSuccessor)=>{\n \n // If its resulting frame is still a job, don't interrupt, hold with the same flow\n // This means we don't jump to another thread, maintaining the current execution context.\n if (previousFrameSuccessor.info.job) {\n return { frame: previousFrameSuccessor, key }\n }\n // else we will just race the sources again including the current one\n // if this current one wins the race it will be equivalent to the previous return\n return race(sources)\n })\n }\n return race(sources)\n}\n","import type { Frame, IteratorResult, HasJob, NextFrame } from '../../types'\nimport { nextWinner } from './next-winner'\nimport type { KEYS, Race, RaceWinner, SourceIteratorResults, SourceResults } from './types'\nimport { patch, race, restart } from './utils'\n\nconst makeSelect =\n <K extends KEYS, Result, Info extends Record<K, HasJob>>(\n winner: RaceWinner<K, Result, Info>,\n nextFrame: NextFrame<Result, Info[K]>,\n interrupt?: (key: KEYS) => boolean,\n ): Race<K, Result, Info> =>\n sources =>\n nextWinner(winner, nextFrame, sources, interrupt)\n\nconst makeContinuation =\n <K extends KEYS, Result, Info extends Record<K, HasJob>>(\n sources: SourceIteratorResults<K, Result, Info>,\n winner: RaceWinner<K, Result, Info>,\n interrupt?: (key: KEYS) => boolean,\n hooks?: {\n start?: (frame: Frame<Result, Info[K]>, result: IteratorResult<Result, Info[K]>) => void\n },\n ) =>\n () => {\n const { frame, key } = winner\n const result = frame.cont()\n hooks?.start?.(frame, result)\n return mergeIterators<K, Result, Info>({\n sources: patch<SourceIteratorResults<K, Result, Info>, K>(sources, key, result),\n interrupt,\n select: makeSelect(winner, result.next, interrupt),\n hooks,\n })\n }\n/**\n * Reiterates over the results, continuing the iteration process.\n * - `frame`: The resulting frame from the asynchronous source.\n * - `key`: The source key of the data.\n */\nconst makeReiterate =\n <K extends KEYS, Result, Info extends Record<K, HasJob>>(\n sources: SourceIteratorResults<K, Result, Info>,\n interrupt?: (key: KEYS) => boolean,\n hooks?: {\n start?: (frame: Frame<Result, Info[K]>, result: IteratorResult<Result, Info[K]>) => void\n },\n ) =>\n (winner: RaceWinner<K, Result, Info>): Frame<Result, SourceResults<K, Info>> => {\n const { frame, key } = winner\n return {\n cont: makeContinuation(sources, winner, interrupt, hooks),\n data: frame.data,\n info: { key, value: frame.info, job: frame.info.job },\n }\n }\n\nexport const mergeIterators = <K extends KEYS, Result, Info extends Record<K, HasJob>>(params: {\n sources: SourceIteratorResults<K, Result, Info>\n interrupt?: ((key: KEYS) => boolean) | undefined\n select?: Race<K, Result, Info> | undefined\n hooks?: {\n start?: (frame: Frame<Result, Info[K]>, result: IteratorResult<Result, Info[K]>) => void\n } | undefined\n}): IteratorResult<Result, SourceResults<K, Info>> => {\n const { sources, interrupt, select = race, hooks } = params\n // The main `IteratorResult` returned by `mergeItResults`.\n return {\n stop: () => mergeIterators({ sources: restart(sources), interrupt, select, hooks }),\n next: select(sources).then(makeReiterate(sources, interrupt, hooks)),\n clear: async () => {\n for (const key in sources) {\n await sources[key]?.clear()\n }\n },\n }\n}\n","import { mergeIterators } from './merge'\nimport type { Iterator, IteratorResult, HasJob } from '../../types'\nimport type { PRRec } from '../../../types';\n\nconst state = { steady: false }\nlet timeout: NodeJS.Timeout | null = null\n\nexport { mergeIterators } from './merge'\n\ntype ArrK<Arr extends readonly unknown[]> = Extract<keyof Arr, `${number}`>\n\nexport const firstWorksMerge = <Result, Info extends HasJob, Arr extends Iterator<Result, Info>[]>(\n iters: Arr,\n): Iterator<Result, { readonly key: ArrK<Arr>; readonly value: Info } & HasJob> => {\n const iterator = () => {\n const results: {[K in keyof Arr]: IteratorResult<Result, Info>} = iters.map<Arr, IteratorResult<Result, Info>>(iter => iter())\n \n type K = ArrK<Arr> \n const sources: PRRec<K, IteratorResult<Result, Info>> = Object.fromEntries(\n results.map((result, index) => [String(index) as K, result]),\n )\n return mergeIterators<K, Result, Record<K, Info>>({\n sources,\n // interrupt: key => key !== '0',\n interrupt: key => false,\n hooks: {\n start: (frame, result) => {\n if (!frame.info.job) return\n if (timeout !== null) {\n clearTimeout(timeout)\n timeout = null\n }\n result.next.then(() => {\n if (!frame.info.job) return\n if (!state.steady) {\n if (timeout !== null) clearTimeout(timeout)\n timeout = setTimeout(() => {\n state.steady = true\n console.log('steady')\n }, 2000)\n }\n })\n },\n },\n })\n }\n return iterator\n}\n","import type { Iterator, HasJob } from './types'\nimport { firstWorksMerge } from './utils/merge/combiners'\n\nexport class Machine<Result = unknown> {\n private sources: Iterator<Result, HasJob>[]\n\n constructor(root?: Iterator<Result, HasJob>) {\n this.sources = root ? [root] : []\n }\n\n add(x: Iterator<Result, HasJob>): void {\n this.sources.push(x)\n }\n\n runner(): Iterator<Result, HasJob> {\n const items = this.sources.filter(x => x)\n if (items.length === 1) {\n return items[0]!\n }\n return firstWorksMerge<Result, HasJob, Iterator<Result, HasJob>[]>(items)\n }\n\n start(cb?: (info: HasJob) => void | boolean): Promise<never> {\n const run = this.runner()\n return runCont(run, cb)\n }\n}\n\nexport const wrap = <Result>(root: Machine<Result>): Machine<Result> => root\n\nconst runCont = async <T, Info>(\n it: Iterator<T, Info>,\n cb?: (info: Info) => void | boolean,\n): Promise<never> => {\n while (true) {\n const { next, stop: _, clear } = it()\n const res = await next.then(\n next => ({ ok: true, next }) as const,\n err => ({ ok: false, err }) as const,\n )\n if (!res.ok) {\n console.error(res.err)\n process.exit(1)\n }\n const { cont, info } = res.next\n if (cb?.(info)) {\n await clear()\n throw new Error('Machine stopped')\n }\n it = cont\n }\n}\n","import {\n type AsLiteral,\n type ID,\n type O,\n type RORec,\n type Rec,\n type doc,\n type notArr,\n type Arr,\n type N,\n} from '../../../types'\nimport { mergeObjects } from '../../expression/array'\nimport { fieldM } from '../../expression/concat'\nimport { root, type Field } from '../../field'\nimport type { Delta, DeltaStages, HasJob, IteratorResult, Runner, TStages } from '../../types'\nimport type {\n BA,\n Before,\n RawStages,\n SnapshotStream,\n SnapshotStreamExecutionResult,\n StreamRunnerParam,\n UBefore,\n} from '../../types/stream'\nimport { concatStages, concatTStages, emptyDelta } from '../prefix'\nimport { $replaceWithDelta } from '../set/$set-delta'\nimport { $lookupDelta } from './$lookup-delta'\nimport { $lookupRaw } from './$lookup-raw'\nimport { type JoinId } from '../unwind'\n\nimport { asBefore } from '../../utils/before'\nimport { createIndex } from '../../utils/db-indexes'\nimport { driver } from '../../driver'\nimport { mergeIterators } from '../../utils/merge'\nimport { log } from '../../utils'\n\ntype Next<L, R> = ({ key: 'L'; value: L } | { key: 'R'; value: R }) & HasJob\n\nconst merge = <Result, LD extends HasJob, RD extends HasJob>({\n lsource: L,\n rsource: R,\n}: {\n lsource: IteratorResult<readonly Result[], LD>\n rsource: IteratorResult<readonly Result[], RD>\n}): IteratorResult<readonly Result[], Next<LD, RD>> =>\n mergeIterators<'L' | 'R', readonly Result[], { L: LD; R: RD }>({ sources: { L, R } })\n\nconst join = <\n As extends string,\n LQ extends doc,\n Q2 extends O,\n LE extends LQ,\n LS extends UBefore<LQ>,\n BLB extends Before<LQ>,\n RQ extends O,\n RE extends RQ & doc,\n S extends notArr,\n RS extends UBefore<RQ>,\n BRB extends Before<RQ>,\n Result extends Q2,\n Null extends null = never,\n>(\n params: LookupParams<As, LQ, LE, RQ, RE, S>,\n leftSnapshot: TStages<LS, Before<LQ>, BLB, Before<LE>>,\n rightSnapshot: TStages<RS, Before<RQ>, BRB, Before<RE>>,\n stagesUntilNextLookup: DeltaStages<LQ | Q2, LE & RORec<As, RE | Null>, Result>,\n outerLeft?: Null,\n): SnapshotStreamExecutionResult<LQ | Q2, Result> => {\n type L = 'left'\n type R = 'right'\n const { lField, rField, left, right, as } = params\n const rightJoinField = { field1: lField, field2: rField }\n // `to: 'one'` keeps the left `_id`. `to: 'many'` writes `middle` between the two ids.\n const joinId: JoinId<L, R> = params.to === 'one' ? 'left' : ['left', params.middle, 'right']\n type Joined = Rec<L, LE> & Rec<R, RE | Null> & ID\n const joinR_Snapshot: RawStages<\n Before<LQ | Q2>,\n Before<LE>,\n Before<LE & Rec<As, RE | Null> & ID>\n > = asBefore($lookupRaw(rightJoinField, rightSnapshot, as, joinId, outerLeft))\n const resultingSnapshot = concatTStages(leftSnapshot, joinR_Snapshot)\n const dict = { [as]: 'a' } as RORec<As, 'a'>\n const idB: RORec<'_id', 'b'> = { _id: 'b' }\n const dictId: RORec<As, 'a'> & RORec<'_id', 'b'> = { ...dict, ...idB }\n return {\n stages: consume =>\n consume(concatTStages(resultingSnapshot, asBefore(stagesUntilNextLookup.raw))),\n out: <Final>(\n finalInput: StreamRunnerParam<Delta<Result>, Final>,\n ): Runner<readonly Final[], HasJob> => {\n const leftJoinField = { field1: rField, field2: lField }\n const joinL_Delta = $lookupDelta<RQ, RE, LQ, LE, BLB, LS, S, R, L, Null>(\n leftJoinField,\n leftSnapshot,\n 'right',\n 'left',\n joinId,\n outerLeft,\n )\n const joinR_Delta = $lookupDelta<LQ, LE, RQ, RE, BRB, RS, S, L, R, never, Null>(\n rightJoinField,\n rightSnapshot,\n 'left',\n 'right',\n joinId,\n undefined,\n outerLeft,\n )\n const mergeForeignIntoDoc = concatStages(\n $replaceWithDelta<Joined, LE & Rec<As, RE | Null>>(\n mergeObjects<LE, ID & Rec<As, RE | Null>, Joined>(\n root<Joined>().of('left').expr(),\n fieldM<RORec<As, 'a'> & RORec<'_id', 'b'>, { a: RE | Null; b: string }, Joined>(\n {\n a: root<Joined>().of('right').expr(),\n b: root<Joined>().of('_id').expr(),\n },\n dictId,\n ),\n ),\n ),\n stagesUntilNextLookup.delta,\n )\n const lRunnerInput = concatStages(joinR_Delta, mergeForeignIntoDoc)\n const rRunnerInput = concatStages(joinL_Delta, mergeForeignIntoDoc)\n const getRunner = <Q, V extends Q, B, C>(\n f: SnapshotStreamExecutionResult<Q, V>,\n stages: RawStages<unknown, Delta<V, BA>, Delta<B>>,\n final: StreamRunnerParam<Delta<B>, C>,\n ) =>\n f.out(\n {\n raw: first => concatStages(stages, final.raw(first)),\n teardown: final.teardown,\n },\n async () => {\n log('Creating indexes for lookup left', leftSnapshot.coll.collectionName, {\n [`before.${lField.str()}`]: 1,\n })\n await createIndex(\n leftSnapshot.coll,\n { [`before.${lField.str()}`]: 1 },\n { name: 'left_' + new (driver().UUID)().toString('base64') },\n )\n log('Creating indexes for lookup right', rightSnapshot.coll.collectionName, {\n [`before.${rField.str()}`]: 1,\n })\n await createIndex(\n rightSnapshot.coll,\n { [`before.${rField.str()}`]: 1 },\n { name: 'right_' + new (driver().UUID)().toString('base64') },\n )\n },\n )\n const lRunner = getRunner(left, lRunnerInput, finalInput)\n const rRunner = getRunner(right, rRunnerInput, finalInput)\n return () => merge({ lsource: lRunner(), rsource: rRunner() })\n },\n }\n}\n\ntype Params<As extends string, LQ extends O, RQ extends O, RE extends RQ, S extends notArr> = {\n from: SnapshotStreamExecutionResult<RQ, RE>\n as: AsLiteral<As>\n} & (\n | {\n to: 'one'\n localField: Field<LQ, string | N>\n foreignField?: never\n middle?: never\n }\n | {\n to: 'many'\n middle: string\n localField: Field<LQ, S | Arr<S>>\n foreignField: Field<RQ, S | Arr<S>>\n }\n)\ntype LookupParams<\n As extends string,\n LQ extends O,\n LE extends LQ,\n RQ extends O,\n RE extends RQ,\n S extends notArr,\n> = {\n lField: Field<LQ, S | Arr<S>>\n rField: Field<RQ, S | Arr<S>>\n right: SnapshotStreamExecutionResult<RQ, RE>\n as: AsLiteral<As>\n left: SnapshotStreamExecutionResult<LQ, LE>\n} & (\n | { to: 'one'; middle?: never }\n | { to: 'many'; middle: string }\n)\n\nconst $lookup1 =\n <\n As extends string,\n LQ extends doc,\n LE extends LQ,\n RQ extends O,\n RE extends RQ & doc,\n S extends notArr,\n Null extends null = never,\n >(\n p: LookupParams<As, LQ, LE, RQ, RE, S>,\n outerLeft?: Null,\n ): SnapshotStream<LQ, LE & RORec<As, RE | Null>> =>\n <Q2 extends O, Result extends Q2>(\n input: DeltaStages<Q2 | (LE & RORec<As, RE | Null>), LE & RORec<As, RE | Null>, Result>,\n ) =>\n p.left.stages(\n <LS extends UBefore<LQ>, BLB extends Before<LQ>>(\n lStages: TStages<LS, Before<LQ>, BLB, Before<LE>, number>,\n ) =>\n p.right.stages(\n <RS extends UBefore<RQ>, BRB extends Before<RQ>>(\n rStages: TStages<RS, Before<RQ>, BRB, Before<RE>>,\n ) =>\n join<As, LQ, Q2, LE, LS, BLB, RQ, RE, S, RS, BRB, Result, Null>(\n p,\n lStages,\n rStages,\n input,\n outerLeft,\n ),\n ),\n )\nexport const $lookup =\n <As extends string, LQ extends doc, RQ extends doc, RE extends RQ & doc, S extends notArr>(\n p: Params<As, LQ, RQ, RE, S>,\n ) =>\n <LE extends LQ>(l: SnapshotStream<LQ, LE>): SnapshotStream<LQ, LE & RORec<As, RE>> =>\n p.to === 'one'\n ? $lookup1<As, LQ, LE, RQ, RE, string | N>({\n right: p.from,\n as: p.as,\n lField: p.localField,\n rField: root<doc>().of('_id'),\n left: l(emptyDelta()),\n to: 'one',\n })\n : $lookup1<As, LQ, LE, RQ, RE, S>({\n to: 'many',\n right: p.from,\n as: p.as,\n lField: p.localField,\n rField: p.foreignField,\n left: l(emptyDelta()),\n middle: p.middle,\n })\n\nexport const $outerLookup =\n <As extends string, LQ extends doc, RQ extends doc, RE extends RQ & doc, S extends notArr>(\n p: Params<As, LQ, RQ, RE, S>,\n ) =>\n <LE extends LQ>(l: SnapshotStream<LQ, LE>): SnapshotStream<LQ, LE & RORec<As, RE | null>> =>\n p.to === 'one'\n ? $lookup1<As, LQ, LE, RQ, RE, string | N, null>(\n {\n right: p.from,\n as: p.as,\n lField: p.localField,\n rField: root<RQ>().of('_id'),\n left: l(emptyDelta()),\n to: 'one',\n },\n null,\n )\n : $lookup1<As, LQ, LE, RQ, RE, S, null>(\n {\n to: 'many',\n right: p.from,\n as: p.as,\n lField: p.localField,\n rField: p.foreignField,\n left: l(emptyDelta()),\n middle: p.middle,\n },\n null,\n )\n","import type { Exclude, O, Omit, ReplaceQ, StrKey } from '../../../types'\nimport type { DeltaStages, Expr, LinStages } from '../../types'\nimport { setQ, type Updater, type UpdaterQHKT } from '../../update/updater'\nimport type { MapO } from '../../utils/map-object'\nimport { $replaceWith1, $replaceWith_, $set1, $set_ } from '../mongo-stages'\nimport { $replaceWithDelta, $setDelta } from './$set-delta'\n\nconst $setCore = <Q extends O, T extends Q, V extends Q, C = unknown>(\n updater: Updater<T, T, V, C>,\n): DeltaStages<Q, T, V, C> & LinStages<Q, T, V, C> => ({\n delta: $setDelta(updater),\n raw: $set1<Q, T, V, C>(updater),\n lin: $set_(updater),\n})\n\ntype V<VV, Q> = Exclude<StrKey<VV>, StrKey<Q>>\nexport type $Set<VV extends O, Q extends O> = <R extends Q, C = unknown>(\n fields: MapO<Omit<VV, StrKey<Q>>, UpdaterQHKT<R, R, VV, V<VV, Q>, C>, V<VV, Q>>,\n) => DeltaStages<Q, R, Q & ReplaceQ<R, VV, Q>, C> & LinStages<Q, R, Q & ReplaceQ<R, VV, Q>, C>\n\nexport const $set: <VV extends O, Q extends O = O>() => $Set<VV, Q> =\n <VV extends O, Q extends O = O>() =>\n <R extends Q, C = unknown>(\n fields: MapO<Omit<VV, StrKey<Q>>, UpdaterQHKT<R, R, VV, V<VV, Q>, C>, V<VV, Q>>,\n ) =>\n $setCore<Q, R, Q & ReplaceQ<R, VV, Q>, C>(setQ<VV, Q>()(fields))\n\nexport const $replaceWith = <T extends O, V extends O>(\n expr: Expr<V, T>,\n): DeltaStages<O, T, V> & LinStages<O, T, V> => ({\n delta: $replaceWithDelta(expr),\n raw: $replaceWith1(expr),\n lin: $replaceWith_(expr),\n})\n","import type { Filter, HKT, I, IdHKT, Omit, Replace, RWCollection } from '../../types'\nimport type { ID, N, O, StrKey, doc, rawItem } from '../../types/json'\nimport { mergeObjects } from '../expression/array'\nimport { field, mergeExpr, type ExprHKT, type ExprsExact } from '../expression/concat'\nimport { eq, ite } from '../expression/logic'\nimport { current, nil, val } from '../expression/val'\nimport { root } from '../field'\nimport type { DDel, Del, Delta, Expr, RawStages, StreamRunnerParam, TS } from '../types'\nimport { id } from '../utils/json'\nimport { mapExact, mapExactToObject, type Exact, type MappedHKT } from '../utils/map-object'\nimport { getSubsetMatchForExt, getWhenMatchedForMerge } from './$merge'\nimport { $replaceWith_ } from './mongo-stages'\nimport { $merge_ } from './out'\nimport { link } from './prefix'\n\ntype ND = { readonly deletedAt?: null }\n\ntype SafeE<E> = Omit<E, `$${string}` | keyof ID>\nexport type Merge<T extends doc, E> = Omit<SafeE<E>, keyof (ND & TS)> & ((T & ND & TS) | Del)\n\ntype ExprP<P> = Expr<P, unknown, { new: P }>\ntype Update<P, Out> = (added: ExprP<P>, old: Expr<Out, Out>) => ExprP<P>\n\nexport const $insertX = <T extends doc, D extends O, EEE extends { [K in StrKey<EEE>]: rawItem }>(\n out: RWCollection<Merge<T, EEE>>,\n expr: Expr<T, D>,\n map: (x: Expr<T & ND & TS & Omit<SafeE<EEE>, keyof (ND & TS)>, D>) => Expr<Merge<T, EEE>, D>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n extExpr: ExprsExact<Omit<SafeE<EEE>, keyof (ND & TS)>, unknown>,\n update: Update<Replace<Merge<T, EEE>, {}>, Merge<T, EEE>> = x => x,\n): StreamRunnerParam<D, 'out'> => {\n type EE = SafeE<EEE>\n type E = Omit<EE, keyof (ND & TS)>\n interface EqHKT<Dom = unknown> extends HKT<Dom> {\n readonly out: Record<'$eq', I<Dom, this>>\n }\n type Out = Merge<T, EEE>\n const filter: {\n readonly [K in StrKey<E>]: Record<'$eq', E[K]>\n } = mapExactToObject<E, IdHKT, MappedHKT<E, EqHKT>>(ext, v => ({ $eq: v }))\n const sameSubset = getSubsetMatchForExt<Out, Out, E>(ext)\n\n return {\n teardown: c =>\n c<Out, 'updateMany'>({\n collection: out,\n method: 'updateMany',\n params: [\n filter as Filter<Out>,\n [{ $set: { deletedAt: '$$NOW', touchedAt: '$$CLUSTER_TIME' } }],\n ],\n }),\n raw: (): RawStages<unknown, D, 'out'> => {\n const replacer = map(\n mergeObjects<T, ND & TS & E, D>(\n expr,\n field(\n mergeExpr<EE, ND & TS, D>(extExpr, {\n deletedAt: ['deletedAt', nil],\n touchedAt: ['touchedAt', current],\n }),\n ),\n ),\n )\n\n return link<D>()\n .with<unknown, Out>($replaceWith_(replacer))\n .with<unknown, 'out'>(\n $merge_<Out, Out>({\n into: out,\n on: root<O<ID>>().of('_id'),\n stages: true,\n whenMatched: getWhenMatchedForMerge<Out, Out, never>('insert', update, sameSubset),\n whenNotMatched: 'insert',\n }),\n ).stages\n },\n }\n}\n\nexport const $simpleInsert = <T extends doc, EEE extends { [K in StrKey<EEE>]: rawItem }>(\n out: RWCollection<Merge<T, EEE>>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n): StreamRunnerParam<T, 'out'> => {\n type EE = SafeE<EEE>\n type E = Omit<EE, keyof (ND & TS)>\n const extExpr = mapExact<E, IdHKT, ExprHKT<unknown>>(\n ext,\n <P extends StrKey<E>>(v: E[P]): Expr<E[P], unknown> => val<E[P]>(v),\n )\n\n return $insertX<T, T, EEE>(out, root<T>().expr(), id, ext, extExpr)\n}\n\nexport const $insertPart = <T extends doc, EEE extends { [K in StrKey<EEE>]: rawItem }>(\n out: RWCollection<Merge<T, EEE>>,\n ext: Exact<Omit<SafeE<EEE>, keyof (ND & TS)>, IdHKT>,\n): StreamRunnerParam<Delta<T>, 'out'> => {\n type EE = SafeE<EEE>\n type E = Omit<EE, keyof (ND & TS)>\n const extExpr = mapExact<E, IdHKT, ExprHKT<unknown>>(\n ext,\n <P extends StrKey<E>>(v: E[P]): Expr<E[P], unknown> => val<E[P]>(v),\n )\n return $insertX<T, Delta<T>, EEE>(\n out,\n assertNotNull<T, Delta<T>>(root<Delta<T>>().of('after').expr()),\n x =>\n ite<Merge<T, EEE>, Delta<T>>(\n eq<T | null, Delta<T>>(root<Delta<T>>().of('after').expr())(nil),\n field<DDel & Omit<SafeE<EEE>, keyof (ND & TS & ID)>, Delta<T>>(\n mergeExpr<SafeE<EEE>, DDel, Delta<T>>(extExpr, {\n deletedAt: ['deletedAt', current],\n _id: [\n '_id',\n assertNotNull(root<Delta<T>>().of('before').of<T, '_id', null>('_id').expr()),\n ],\n touchedAt: ['touchedAt', current],\n }),\n ),\n x,\n ),\n ext,\n extExpr,\n )\n}\n\nexport const $insert = <T extends doc>(\n out: RWCollection<Merge<T, {}>>,\n): StreamRunnerParam<Delta<T>, 'out'> => $insertPart(out, {})\n\nconst assertNotNull = <T, D, C = unknown>(expr: Expr<T | N, D, C>) => expr as Expr<T, D, C>\n","import type { AggregateCommand } from '../types/aggregate'\nimport type { Db, ReadonlyCollection } from '../../types'\nimport type { RawStages } from '../types'\nimport { log } from '../utils/log'\n\nexport const aggregate = <Result>(\n db: Db,\n streamName: string,\n input: <E>(\n consume: <S, B>(value: {\n coll: ReadonlyCollection<S>\n input: RawStages<unknown, B, Result>\n }) => E,\n ) => E,\n snapshot = true,\n start = Date.now(),\n) =>\n input<Promise<AggregateCommand<Result>>>(({ coll, input }) => {\n const req = {\n aggregate: coll.collectionName,\n pipeline: input,\n cursor: {},\n ...(snapshot && { readConcern: { level: 'snapshot' } }),\n }\n log('exec', streamName, req)\n // if (state.steady) {\n // return state.f({ input: req }).then(() => new Promise(res => {}))\n // }\n const start2 = Date.now()\n return db.command<AggregateCommand<Result>>(req)\n .then(\n result => {\n log('prepare', streamName, Date.now() - start)\n log('prepare2', streamName, start2 - start)\n const r = result\n log(\n 'execed',\n streamName,\n (replace: (s: string) => string) =>\n replace(\n JSON.stringify(req).replaceAll(\n '\"$$CLUSTER_TIME\"',\n JSON.stringify(r.cursor.atClusterTime),\n ),\n ),\n result,\n 'took',\n Date.now() - start,\n )\n return r\n },\n async err => {\n log('err', req, err)\n console.error(err)\n await new Promise(() => {})\n throw new Error(err)\n },\n )\n })\n","import type { Iterator, Frame } from '../types'\n\nexport const addTeardown = <T, Info>(it: Iterator<T, Info>, tr?: () => Promise<void>): Iterator<T, Info> => {\n if (!tr) return it\n return () => {\n const { next, stop, clear } = it()\n const n: PromiseLike<Frame<T, Info>> = next\n return {\n next: n.then(({ cont, ...res }) => ({ cont: addTeardown(cont, tr), ...res })),\n stop: () => (tr(), stop()),\n clear: async () => {\n await tr()\n await clear()\n },\n }\n }\n}\n","import type { Commander, ConstHKT, Db, Dict, Document, IdHKT, O, PRRec, ReadonlyCollection, RORec, StrKey, Timestamp, View } from '../types'\nimport { driver } from './driver'\nimport type { Field } from './field'\nimport type { Del, Model, Query } from './types'\nimport { log } from './utils'\nimport { mapExactToObject } from './utils/map-object'\n\nexport type OplogEntry = {\n ts: Timestamp // oplog timestamp\n ns: string // \"db.collection\"\n op: 'i' | 'u' | 'd' | 'c' | 'n'\n o: Dict<unknown> // operation object\n o2?: { _id: string } // update query (for updates)\n wall?: Date\n} & Document\n\nconst sleep = (ms: number) => new Promise<void>(r => setTimeout(r, ms))\n\nconst maxTimestamp = () => new (driver().Timestamp)(0xffffffffffffffffn)\n\nexport const getCurrentTimestamp = async (db: Db): Promise<Timestamp> => {\n // Get the current timestamp from the server\n const adminDb = db.admin()\n const serverStatus = await adminDb.command<{ operationTime: Timestamp }>({ serverStatus: 1 })\n return serverStatus.operationTime\n}\n\nasync function getLastCommittedTs(adminDb: Commander): Promise<Timestamp | null> {\n const status = await adminDb.command<{\n optimes?: { lastCommittedOpTime?: { ts?: Timestamp } }\n }>({ replSetGetStatus: 1 })\n return status.optimes?.lastCommittedOpTime?.ts ?? null\n}\n\nexport async function waitUntilStablePast(\n db: Db,\n oplogTs: Timestamp,\n { pollMs = 0, timeoutMs = 10_000 }: { pollMs?: number; timeoutMs?: number } = {},\n): Promise<void> {\n const adminDb = db.client.db('admin')\n const deadline = Date.now() + timeoutMs\n\n while (true) {\n const stable = await getLastCommittedTs(adminDb)\n if (stable && stable.comp(oplogTs) >= 0) return\n\n if (Date.now() > deadline) {\n throw new Error('Timed out waiting for stable timestamp to reach oplog event time')\n }\n await sleep(pollMs)\n }\n}\ntype Event = { fields: Set<string>; doc: OplogEntry }\nexport async function* tailOplog(db: Db): AsyncGenerator<Event | null, never, void> {\n let lastTs = await getCurrentTimestamp(db)\n const reopenDelayMs = 250\n\n const coll = db.client.db('local').collection<OplogEntry>('oplog.rs')\n\n while (true) {\n const cursor = coll.find(\n {\n ts: { $gt: lastTs },\n $or: [\n {\n ns: RegExp(`^${db.namespace}\\\\.(?!tmp_)(?!__).*(?<!_snapshot)$`),\n op: { $in: ['i', 'u'] },\n },\n {\n ns: 'admin.$cmd',\n op: 'c',\n 'o.applyOps': {\n $elemMatch: {\n ns: RegExp(`^${db.namespace}\\\\.(?!tmp_)(?!__).*(?<!_snapshot)$`),\n op: { $in: ['i', 'u'] },\n },\n },\n },\n ],\n },\n {\n tailable: true,\n awaitData: true,\n noCursorTimeout: true,\n },\n )\n\n try {\n for await (const docs of cursor) {\n for (const doc of docs.op === 'c' ? (docs.o['applyOps'] as OplogEntry[]) : [docs]) {\n doc.ts = docs.ts\n if (doc.op === 'i' || '_id' in doc.o) {\n const fields = new Set(Object.keys(doc.o))\n fields.delete('_id')\n yield { fields, doc }\n } else {\n // doc.op is 'u'\n if (doc.o['$v'] !== 2) {\n throw new Error(`Expected update with $v: 2, got ${JSON.stringify(doc)}`)\n }\n const updatedFields = []\n const diff = doc.o['diff'] as Dict<unknown>\n for (const updateOp in diff) {\n if ((['u', 'i', 'd'] as const).includes(updateOp)) {\n updatedFields.push(...Object.keys(diff[updateOp] as Dict<unknown>))\n } else if (updateOp.startsWith('s')) {\n updatedFields.push(updateOp.slice(1))\n }\n }\n yield { fields: new Set(updatedFields), doc }\n }\n }\n }\n } catch (e) {\n log('oplog loop error, notifying watchers and reopening')\n console.error(e)\n lastTs = await getCurrentTimestamp(db)\n yield null\n // swallow and reopen; caller can add their own logging around consumption\n } finally {\n log('oplog loop ended')\n await cursor.close().catch(() => {})\n }\n\n await sleep(reopenDelayMs)\n }\n}\n\nconst watchers = new Map<\n string,\n Map<\n string,\n {\n cb: (doc: OplogEntry | null) => void\n keys: readonly string[] | null\n match: Query<never> | undefined\n rem: () => void\n }\n >\n>()\nlet running = false\n\nconst makePromise = <T>() => {\n let resolve: (val: T) => void = () => {}\n let promise = new Promise<T>(r => (resolve = r))\n return { promise, resolve }\n}\n\nconst loop = async (db: Db) => {\n log('starting oplog loop')\n let notify = makePromise<void>()\n let batch: Event[] | null = []\n const run = async () => {\n for await (const event of tailOplog(db)) {\n if (event?.fields.size === 0) continue\n batch = event && batch ? [...batch, event] : null\n notify.resolve()\n }\n }\n run()\n const iter = async function* () {\n while (true) {\n await notify.promise\n const b = batch\n batch = []\n notify = makePromise()\n yield b\n }\n }\n for await (const events of iter()) {\n if (!events) {\n log('notifying watchers of oplog loop restart')\n for (const m of watchers.values()) {\n for (const { cb } of [...m.values()]) {\n cb(null)\n }\n }\n continue\n }\n for (const { fields, doc } of events) {\n const m = watchers.get(doc.ns)\n if (!m) continue\n for (const { cb, keys, rem, match } of [...m.values()]) {\n if (!keys || (doc.op === 'i' ? (match ? true : true) : keys.some(k => fields.has(k)))) {\n cb(doc)\n rem()\n }\n }\n }\n }\n}\n\nconst register = <V extends O>(\n coll: ReadonlyCollection<V | Del>,\n keys: readonly string[] | null,\n match: Query<V> | undefined,\n cb: (doc: OplogEntry | null) => void,\n) => {\n const ns = coll.namespace\n let m = watchers.get(ns)\n if (!m) watchers.set(ns, (m = new Map()))\n const id = crypto.randomUUID()\n const rem = () => {\n m!.delete(id)\n if (m!.size === 0) watchers.delete(ns)\n }\n m.set(id, { cb, keys, match, rem })\n if (!running) {\n running = true\n loop(coll.s.db)\n }\n return rem\n}\n\nexport const subQ = <D extends O, C, DeltaD extends O>(\n a: Query<D, C>,\n f: Field<DeltaD, D>,\n): Query<DeltaD, C> => ({ raw: g => a.raw(g.with(f)) })\n\nlet maxKeysRemoved: Promise<void> | null = null\n\nexport const makeWatchStream = async <V extends Model, K extends StrKey<V>>(\n { collection, projection: p, hardMatch: m }: View<V, K>,\n streamName: string,\n) => {\n const { db } = collection.s\n await (maxKeysRemoved ??= Promise.all(\n (await db.listCollections({}, { nameOnly: true }).toArray()).map(\n x =>\n void db\n .collection(x.name)\n .updateMany({ touchedAt: maxTimestamp() }, [{ $set: { touchedAt: '$$CLUSTER_TIME' } }]),\n ),\n ).then(() => {}))\n\n const projection: PRRec<K, 1> & {deletedAt: 1} = { ...(p ? mapExactToObject<RORec<K, 1>, IdHKT, ConstHKT<1>>(p, v => v) : {}), deletedAt: 1 }\n\n let notify = makePromise<OplogEntry | null>()\n register(collection, p ? Object.keys(projection) : null, m, doc => {\n log(streamName, 'change detected', doc)\n notify.resolve(doc)\n })\n\n return {\n tryNext: async () => {\n const doc = await notify.promise\n // wait until the server’s lastStableRecoveryTimestamp / stable time has advanced past the oplog entry time\n const start = Date.now()\n if (doc) await waitUntilStablePast(collection.s.db, doc.ts)\n log(streamName, 'stable past took', Date.now() - start)\n return doc ?? {}\n },\n close: async () => {},\n }\n}\n","import type { Collection, Document, Exclude, OPickD, rawItem, RawObj, StrKey, Timestamp } from '../../types'\nimport type { Actions, Model } from '../types/stream'\n\nexport type AllowedPick<V extends Model, K extends StrKey<V>> = OPickD<V, Allowed<K>>\nexport type Allowed<K> = Exclude<K, 'deletedAt' | '_id'>\nexport type Teardown = { collection: string; method: string; params: unknown[] }\nexport type TsData = {\n input: readonly RawObj[]\n finalInput: readonly RawObj[]\n finalInputFirst: readonly RawObj[]\n project: rawItem\n match: rawItem\n teardown: Teardown\n}\nexport type Last = {\n _id: string\n ts: Timestamp\n data?: TsData\n job?: 1 | null\n}\n\nexport const actions: {\n [K in keyof Actions<unknown>]: <W extends Document>(\n col: Collection<W>,\n x: Actions<W>[K],\n ) => [Promise<unknown>, unknown[]]\n} = {\n updateMany: (c, args) => [\n c.updateMany(...args),\n [`db['${c.collectionName}'].updateMany(...`, args, ')'],\n ],\n deleteMany: (c, args) => [\n c.deleteMany(...args),\n [`db['${c.collectionName}'].deleteMany(...`, args, ')'],\n ],\n}\n\n","import type { N, O, RawObj, rawItem } from '../../types'\nimport type { Query } from '../types'\nimport { defined, safeNarrow } from '../utils/json'\n\ntype Many<T> = readonly (T | N)[]\ntype Operator = `$${string}`\ntype Result2<Dom> = { readonly [_ in Operator]?: readonly Dom[] }\ntype Result1<Dom> = Result2<Dom> & RawObj\ntype Result<Dom> = Dom | Result1<Dom> \ntype Combiner = {\n <T extends O, C = unknown>(first: Query<T, C>, ...args: Many<Query<T, C>>): Query<T, C>\n <T extends O, C = unknown>(...args: Many<Query<T, C>>): Query<T, C> | undefined\n}\ntype ApplyOpertorToMaybePreItems = <T>(\n op: Operator,\n args: Many<T>,\n) => undefined | (<Dom extends rawItem>(map: (x: T) => Dom) => Result<Dom>)\ntype ApplyOpertorToPreItems = <T>(\n op: Operator,\n x: readonly T[],\n) => undefined | (<Dom extends rawItem>(map: (x: T) => Dom) => Result<Dom>)\nconst filterUndefined = (applyOperator: ApplyOpertorToPreItems): ApplyOpertorToMaybePreItems => {\n return (op, args) => applyOperator(op, args.filter(defined))\n}\nconst combine =\n (op: Operator, applyOperatorToPreItems: ApplyOpertorToMaybePreItems): Combiner =>\n <T extends O, C>(...args: Many<Query<T, C>>): Query<T, C> => {\n const mapToItems = applyOperatorToPreItems<Query<T, C>>(op, args)\n return mapToItems! && { raw: field => mapToItems(x => x.raw(field)) }\n }\nconst all: ApplyOpertorToPreItems = <T>(op: Operator, x: readonly T[]) =>\n x.length === 0\n ? undefined\n : <Dom extends rawItem>(f: (x: T) => Dom): Result<Dom> => safeNarrow<RawObj>()({ [op]: x.map(f) })\nconst first: ApplyOpertorToPreItems = (op, x) => (x.length === 1 ? f => f(x[0]!) : all(op, x))\nexport const $and: Combiner = combine('$and', filterUndefined(first))\nexport const $nor: Combiner = combine('$nor', filterUndefined(all))\nexport const $or: Combiner = combine('$or', filterUndefined(first))\n","import type { Exclude, N, O, RORec, StrKey, Timestamp, View } from '../../types'\nimport { driver } from '../driver'\nimport type { ConstHKT, IdHKT } from '../../types/hkt'\nimport { $match_, $project_ } from '../aggregate/mongo-stages'\nimport { link, type Concat } from '../aggregate/prefix'\nimport { root } from '../field'\nimport { $eq, $exists, $gtTs } from '../predicate'\nimport { $expr } from '../predicate/$expr'\nimport { $and } from '../query/logic'\nimport type { Query } from '../types'\nimport type { D, Del, Model, RawStages } from '../types/stream'\nimport { mapExactToObject, spread } from '../utils/map-object'\nimport type { Allowed } from './boot-utils'\n\nexport const previous = (ts: Timestamp) => new (driver().Timestamp)({ t: ts.high - 60, i: 0 })\n\nexport const getFirstStages = <V extends Model, KK extends StrKey<V>>(\n view: View<V, Allowed<KK>>,\n needs: Partial<Record<KK, 0 | 1>>,\n) => {\n type K = Allowed<KK>\n type WithDel = 'deletedAt' | '_id' | Exclude<K, 'deletedAt' | '_id'>\n\n const { projection, hardMatch: pre, match } = view\n const projectInput = projection && $project_<V, WithDel>(\n spread<RORec<K, 1>, RORec<'deletedAt' | '_id', 1>, IdHKT>(projection, {\n deletedAt: ['deletedAt', 1],\n _id: ['_id', 1],\n }),\n )\n\n const removeNotYetSynchronizedFields: null | readonly Query<V>[] = projection && Object.values(\n mapExactToObject<RORec<K, 1>, IdHKT, ConstHKT<Query<V> | null>>(projection, (_, k) =>\n (needs[k] ?? k.startsWith('_')) ? root<V>().of(k).has($exists(true)) : null,\n ),\n )\n const hardMatch = removeNotYetSynchronizedFields ? $and(pre, ...removeNotYetSynchronizedFields) : pre\n const firstStages = (\n lastTS: { ts: Timestamp } | null,\n keepNulls = false,\n ): Concat<V | O | Del, Del | V, V, unknown> => {\n const hardQuery = $and(\n lastTS\n ? root<Model>().of('touchedAt').has($gtTs(previous(lastTS.ts)))\n : root<D>().of('deletedAt').has($eq<Timestamp | N>(null)),\n lastTS ? null : match && $expr(match),\n keepNulls ? pre : hardMatch,\n )\n const ln = link<V | Del>()\n .with($match_(hardQuery) as RawStages<O, V | Del, V>)\n return (projectInput ? ln.with(projectInput) : ln)\n }\n return { firstStages, hardMatch }\n}\n\n","import crypto from 'crypto'\nimport type {\n Collection,\n Dict,\n Document,\n N,\n O,\n O2,\n O3,\n RORec,\n StrKey,\n Timestamp,\n View,\n WatchStream,\n} from '../../types'\nimport { uuid } from '../driver'\nimport type { HKT, I } from '../../types/hkt'\nimport { $match_, $replaceWith_, $set_ } from '../aggregate/mongo-stages'\nimport { $merge_ } from '../aggregate/out'\nimport { concatDelta, emptyDelta, link, pipe, type DeltaPipe } from '../aggregate/prefix'\nimport { mergeObjects } from '../expression'\nimport { field } from '../expression/concat'\nimport { $ifNull, and, eq, ite } from '../expression/logic'\nimport { nil, val } from '../expression/val'\nimport { ctx, root } from '../field'\nimport { $eq, $ne } from '../predicate'\nimport { aggregate } from '../stream/aggregate'\nimport type { AggregateCommand, Before, Expr, SnapshotStreamExecutionResult } from '../types'\nimport type { Frame, HasJob, Iterator, Runner } from '../types/machine'\nimport type {\n Actions,\n After,\n D,\n Delta,\n DeltaStages,\n Model,\n RawStages,\n StreamRunnerParam,\n TeardownRecord,\n UDelta,\n} from '../types/stream'\nimport { noop } from '../utils'\nimport { asBefore } from '../utils/before'\nimport { createIndex, ensureCollection, indexMap } from '../utils/db-indexes'\nimport { log } from '../utils/log'\nimport { addTeardown } from '../utils/tear-down'\nimport { makeWatchStream } from '../watch'\nimport type { Allowed, AllowedPick, Last, Teardown, TsData } from './boot-utils'\nimport { actions } from './boot-utils'\nimport { getFirstStages } from './first-stages'\nimport { set, to } from '../update'\nimport type { Updater } from '../update/updater'\n\nexport const streamNames: Dict<string> = {}\nconst executes = <\n q extends O,\n V extends Model,\n KK extends StrKey<V>,\n Result extends q | AllowedPick<V, KK>,\n>(\n view: View<V, Allowed<KK>>,\n input: DeltaStages<q | AllowedPick<V, KK>, AllowedPick<V, KK>, Result>,\n streamName: string,\n skip = false,\n after?: () => Promise<void>,\n needs: Partial<Record<KK, 0 | 1>> = {},\n): SnapshotStreamExecutionResult<q | AllowedPick<V, KK>, Result> => {\n type T = AllowedPick<V, KK>\n\n const { collection, projection, match } = view\n\n const { firstStages, hardMatch } = getFirstStages(view, needs)\n\n const db = collection.s.db,\n coll = collection.collectionName\n\n const hash = crypto\n .createHash('md5')\n .update(new Error().stack + '')\n .digest('base64url')\n if (!streamNames[streamName]) streamNames[streamName] = hash\n else if (streamNames[streamName] != hash) throw new Error(`streamName ${streamName} already used`)\n\n const last = db.collection<Last>('__last')\n const snapshotCollection = db.collection<UDelta<T>>(coll + '_' + streamName + '_snapshot')\n\n const job = {}\n const run = <Result2>(\n finalInput: StreamRunnerParam<Delta<Result>, Result2>,\n setup?: () => Promise<void>,\n ): Runner<readonly Result2[], HasJob> => {\n type W = HasJob & { debug: string }\n type It = Iterator<readonly Result2[], W>\n type FrameD = Frame<readonly Result2[], W>\n type Next = Promise<FrameD>\n const dropSnapshot = async () => {\n await snapshotCollection.drop().catch(noop)\n log(\n 'snapshot collection dropped',\n streamName,\n `db['${snapshotCollection.collectionName}'].drop()`,\n )\n log(\n 'with',\n [...(indexMap.get(snapshotCollection.collectionName)?.keys() ?? [])],\n 'indexes in map before deletion',\n )\n indexMap.delete(snapshotCollection.collectionName)\n }\n const clear = async () => Promise.all([dropSnapshot(), last.deleteOne({ _id: streamName })])\n\n const withStop = (next: () => PromiseLike<FrameD>, tr?: () => Promise<void>): It => {\n return addTeardown(() => ({ stop, next: next(), clear }), tr)\n }\n const nextData =\n (data: readonly Result2[], job?: object) =>\n (next: () => Next, debug: string, tr?: () => Promise<void>): FrameD => ({\n cont: withStop(next, tr),\n data,\n info: { job, debug: `${streamName} on ${collection.collectionName}: ${debug}` },\n })\n const next = nextData([], job)\n\n const data: TsData = {\n input: input.delta,\n finalInputFirst: finalInput.raw(true),\n finalInput: finalInput.raw(false),\n match: view.match?.raw(root()).get(),\n project: projection,\n teardown: finalInput.teardown(\n (x): Teardown => ({\n collection: x.collection.collectionName,\n method: x.method,\n params: x.params,\n }),\n ),\n }\n\n // Step 0 : declare we are starting a job\n const step0 = () => Promise.resolve(next(step1, 'empty new collection'))\n const stop: It = withStop(step0)\n\n // Step 1 : empty new collection\n const step1 = async (): Next => {\n log(\n 'reset collection',\n streamName,\n `db['${snapshotCollection.collectionName}'].updateMany( updated: true }, { $set: { updated: false, after: null } })`,\n )\n await snapshotCollection.updateMany(\n { updated: true },\n { $set: { updated: false, after: null } },\n )\n log('reset collection done', streamName)\n // we don't need to remove null before because they will be reinserted anyway in step 3\n return next(step2, 'get last update')\n }\n // Step 2 : get last update\n const step2 = (): Next =>\n Promise.all([\n last.findOne({ _id: streamName, data, job: null }),\n last.findOne({ _id: streamName }),\n ]).then(ts =>\n next(\n step2_5(ts),\n ts[0]\n ? `no teardown to handle, starting at ${ts[0].ts}`\n : ts[1]\n ? 'handle teardown'\n : 'start fresh',\n ),\n )\n const step2_5 =\n ([same, exists]: [Last | null, Last | null]) =>\n async (): Next => {\n const handleTeardown = async <W extends Document, M extends keyof Actions<unknown>>(\n last: Pick<Last, 'data'>,\n ) => {\n if (!last.data) return\n const { collection: c, method: m, params: p } = last.data.teardown\n const { collection, method, params } = {\n collection: db.collection<W>(c),\n method: m as M,\n params: p as TeardownRecord<W, M>['params'],\n }\n const [action, out] = actions[method](collection, params)\n log('teardown', `db['${snapshotCollection.collectionName}'].drop()`, ...out)\n await Promise.all([dropSnapshot(), action])\n log('teardown done', `db['${snapshotCollection.collectionName}'].drop()`, ...out)\n }\n if (!same) {\n log('not same, new data', streamName, data)\n await handleTeardown(exists ?? { data })\n }\n log('creating indexes')\n\n await createIndex(\n snapshotCollection,\n { before: 1 },\n {\n partialFilterExpression: { before: null },\n name: 'before_' + uuid(),\n },\n )\n\n await createIndex(\n snapshotCollection,\n { updated: 1 },\n {\n partialFilterExpression: { updated: true },\n name: 'updated_' + uuid(),\n },\n )\n\n await createIndex(\n snapshotCollection,\n { updated: 1, after: 1, before: 1 },\n {\n partialFilterExpression: { updated: true, after: null, before: null },\n name: 'updated_nulls_' + uuid(),\n },\n )\n\n await createIndex(\n snapshotCollection,\n { updated: 1, after: 1 },\n {\n partialFilterExpression: { updated: true, after: null },\n name: 'updated_no_after_' + uuid(),\n },\n )\n\n await createIndex(\n snapshotCollection,\n { updated: 1 },\n {\n partialFilterExpression: { updated: true, after: null, before: null },\n name: 'updated_nulls_' + uuid(),\n },\n )\n await ensureCollection(db, coll)\n await db.command({\n collMod: coll,\n changeStreamPreAndPostImages: { enabled: true },\n })\n await createIndex(\n collection,\n { touchedAt: 1 },\n hardMatch\n ? {\n partialFilterExpression: hardMatch.raw(root()),\n name: 'touchedAt_hard_' + uuid(),\n }\n : {},\n )\n await setup?.()\n\n await after?.()\n return nextData([])(async () => {\n // @TODO: use a proper way to execute teardowns before streams\n await new Promise(resolve => setTimeout(resolve, 1000))\n return next(step3(same), 'clone into new collection')\n }, 'wait for clone into new collection')\n }\n\n // Step 3 : clone into new collection\n const step3 = (lastTS: { _id: string; ts: Timestamp } | null) => async (): Next => {\n const notDeleted: Expr<boolean, T, unknown> = eq(\n $ifNull(root<D>().of('deletedAt').expr(), nil),\n )(nil)\n const query = match ? and<T & D>(notDeleted, match) : notDeleted\n type ToMerge = UDelta<T> & After<T> & { updated: true; _id: string }\n const replaceRaw: RawStages<O, T & D, ToMerge> = $replaceWith_(\n field<ToMerge, T & D>({\n after: ['after', lastTS ? ite(query, root<T>().expr(), nil) : root<T>().expr()],\n updated: ['updated', val(true)],\n _id: ['_id', root<T & D>().of('_id').expr()],\n }),\n )\n\n const cloneIntoNew = firstStages(lastTS)\n .with(replaceRaw)\n .with(\n $merge_<ToMerge, UDelta<T>, { new: ToMerge }>({\n into: snapshotCollection,\n on: root<UDelta<T>>().of('_id'),\n stages: 'ctx',\n vars: {\n new: ['new', root<ToMerge>().expr()],\n },\n whenMatched: link<UDelta<T>, { new: ToMerge }>().with(\n $replaceWith_(\n ite(\n eq<T | N, UDelta<T>, { new: ToMerge }>(root<UDelta<T>>().of('before').expr())(\n ctx<ToMerge>()('new').of('after').expr(),\n ),\n root<UDelta<T>>().expr(),\n mergeObjects(root<UDelta<T>>().expr(), ctx<ToMerge>()('new').expr()),\n ),\n ),\n ).stages,\n whenNotMatched: 'insert',\n }),\n ).stages\n\n const stream = await makeStream()\n\n const r = await aggregate<'out'>(db, streamName, c =>\n c({ coll: collection, input: cloneIntoNew }),\n )\n const start = Date.now()\n const res = await snapshotCollection.deleteMany({ updated: true, after: null, before: null })\n log(\n 'deleting from cloned into new collection',\n Date.now() - start,\n res,\n `db['${snapshotCollection.collectionName}'].deleteMany({ updated: true, after: null, before: null })`,\n )\n return next(step4({ result: r, ts: lastTS?.ts, stream }), 'run the aggregation', () =>\n stream.close(),\n )\n }\n\n type Res = {}\n type C = WatchStream<Res>\n\n // Step 4 : run the aggregation // idempotent\n const makeStream = (): Promise<C> => makeWatchStream(view, streamName)\n const step4 =\n (args: { result: AggregateCommand<'out'>; ts?: Timestamp | undefined; stream: C }) =>\n async (): Next => {\n const { result, ts, stream } = args\n const start = Date.now()\n // await snapshotCollection.updateMany({ before: null }, { $set: { before: null } })\n log('snapshot', streamName, 'ensure before null', Date.now() - start)\n const first = ts === undefined\n const stages = finalInput.raw(first)\n await last.updateOne({ _id: streamName }, { $set: { job: 1 } }, { upsert: true })\n // log('updated docs', await snapshotCollection.find({ updated: true }).toArray())\n const nextRes = stream.tryNext()\n const aggResult = await aggregate<Result2>(\n db,\n streamName,\n c =>\n c<UDelta<T>, UDelta<T> & Delta<T>>({\n coll: snapshotCollection as Collection<UDelta<T> & Delta<T>>,\n input: link<UDelta<T> & Delta<T>>()\n .with($match_(root<UDelta<T> & Delta<T>>().of('updated').has($eq<boolean>(true))))\n .with<Delta<T>, Delta<T>>(\n $set_(\n set<RORec<'before', T | null>>()({\n before: [\n 'before',\n to($ifNull(root<UDelta<T> & Delta<T>>().of('before').expr(), nil)),\n ],\n }) as Updater<Delta<T>, Delta<T>, Delta<T>>,\n ),\n )\n .with(input.delta)\n .with(stages).stages,\n }),\n false,\n start,\n )\n return next(\n step5({ ts: result.cursor.atClusterTime, aggResult, stream, nextRes, first }),\n 'remove handled deleted updated',\n )\n }\n\n // Step 5 : remove handled deleted updated\n const step5 = (l: L) => async (): Next => {\n log(\n streamName,\n `remove handled deleted updated db['${snapshotCollection.collectionName}'].deleteMany({ updated: true, after: null })`,\n )\n await snapshotCollection.deleteMany({ updated: true, after: null })\n log('removed handled deleted updated')\n return next(step6(l), 'update snapshot aggregation')\n }\n type L = {\n aggResult: AggregateCommand<Result2>\n ts: Timestamp\n stream: C\n nextRes: Promise<Res | null>\n first: boolean\n }\n\n // Step 6 : commit changes on snapshot\n const step6 = (l: L) => async (): Next => {\n log(\n 'update snapshot aggregation',\n `db['${snapshotCollection.collectionName}'].updateMany({ updated: true }, [ { $set: { updated: false, after: null, before: '$after' } } ])`,\n )\n const start = Date.now()\n await snapshotCollection.updateMany({ updated: true }, [\n {\n $set: {\n updated: false,\n after: null,\n before: '$after',\n },\n },\n ])\n log('updated snapshot aggregation', Date.now() - start)\n return next(step7(l), 'update __last')\n }\n\n // Step 7 : update __last\n const step7 = (l: L) => async (): Next => {\n const start = Date.now()\n const patch: { $set: Document } = {\n $set: {\n ts: l.ts,\n job: null,\n },\n }\n if (l.first) patch.$set = { ...patch.$set, data }\n await last.updateOne({ _id: streamName }, patch, { upsert: true })\n log(\n 'updated __last',\n Date.now() - start,\n `db['${last.collectionName}'].updateOne({ _id: '${streamName}' }, `,\n patch,\n `, { upsert: true })`,\n )\n return step8(l)\n }\n // Step 8 : wait for change\n const step8 = (l: L): FrameD => {\n return nextData(l.aggResult.cursor.firstBatch)(\n () =>\n l.nextRes.then(doc =>\n doc\n ? next(step3({ _id: streamName, ts: l.ts }), 'restart')\n : step8({ ...l, nextRes: l.stream.tryNext() }),\n ),\n 'wait for change',\n )\n }\n return skip\n ? withStop(() => Promise.resolve(next(step3(null), 'clone into new collection')))\n : stop\n }\n const hasBefore = root<UDelta<T>>().of('before').has($ne<T | N>(null))\n return {\n stages: c =>\n c<UDelta<T>, Before<T>>({\n coll: snapshotCollection,\n input: $match_(hasBefore) as RawStages<unknown, UDelta<T>, Before<T> & UDelta<T>>,\n exec: asBefore(input.raw),\n }),\n out: run,\n }\n}\n\nexport interface SnapshotStreamHKT extends HKT<O2> {\n readonly out: SnapshotStreamExecutionResult<I<O2, this>[0], I<O2, this>[1]>\n}\nexport interface DeltaHKT extends HKT<O3> {\n readonly out: DeltaStages<I<O3, this>[0], I<O3, this>[1], I<O3, this>[2]>\n}\n\nexport const staging = <V extends Model, KK extends StrKey<V>>(\n view: View<V, Allowed<KK>> & {\n needs?: Partial<Record<KK, 0 | 1>>\n },\n streamName: string,\n skip = false,\n after?: () => Promise<void>,\n): DeltaPipe<AllowedPick<V, KK>, AllowedPick<V, KK>, SnapshotStreamHKT, DeltaHKT> =>\n pipe<AllowedPick<V, KK>, AllowedPick<V, KK>, AllowedPick<V, KK>, SnapshotStreamHKT, DeltaHKT>(\n input => executes(view, input, streamName, skip, after, view.needs),\n emptyDelta(),\n concatDelta,\n emptyDelta,\n )\n","import crypto from 'crypto'\nimport type { Document, Exclude, N, O, O2, O3, OPickD, RORec, StrKey, Timestamp, View, WatchStream } from '../../types'\nimport { driver } from '../driver'\nimport type { ConstHKT, HKT, I, IdHKT } from '../../types/hkt'\nimport { $match_, $project_ } from '../aggregate/mongo-stages'\nimport { concatStages, link, pipe } from '../aggregate/prefix'\nimport { root } from '../field'\nimport { $eq, $exists, $gteTs } from '../predicate'\nimport { $expr } from '../predicate/$expr'\nimport { $and } from '../query/logic'\nimport { aggregate } from '../stream/aggregate'\nimport type { Frame, HasJob, Iterator, Query, RawStages, Runner } from '../types'\nimport type { AggregateCommand } from '../types/aggregate'\nimport type {\n Actions,\n D,\n Del,\n Model,\n SimpleStreamExecutionResult,\n StreamRunnerParam,\n TeardownRecord,\n} from '../types/stream'\nimport { log } from '../utils'\nimport { createIndex, ensureCollection } from '../utils/db-indexes'\nimport { mapExactToObject, spread } from '../utils/map-object'\nimport { addTeardown } from '../utils/tear-down'\nimport { makeWatchStream } from '../watch'\nimport { streamNames } from './boot'\nimport { actions, type Last, type Teardown, type TsData } from './boot-utils'\nimport { previous } from './first-stages'\n\ntype Allowed<K> = Exclude<K, 'deletedAt' | '_id'>\ntype AllowedPick<V extends Model, K extends StrKey<V>> = OPickD<V, Allowed<K>>\n\nconst executes = <\n q extends O,\n V extends Model,\n KK extends StrKey<V>,\n Result extends q | AllowedPick<V, KK>,\n>(\n view: View<V, Allowed<KK>>,\n input: RawStages<q | AllowedPick<V, KK>, AllowedPick<V, KK>, Result, unknown, 1>,\n streamName: string,\n needs: Partial<Record<KK, 0 | 1>>,\n): SimpleStreamExecutionResult<q | AllowedPick<V, KK>, Result> => {\n const hash = crypto\n .createHash('md5')\n .update(new Error().stack + '')\n .digest('base64url')\n if (!streamNames[streamName]) streamNames[streamName] = hash\n else if (streamNames[streamName] != hash) throw new Error('streamName already used')\n type K = Allowed<KK>\n const { collection, projection, hardMatch: pre, match } = view\n\n const removeNotYetSynchronizedFields: null | readonly Query<V>[] =\n projection &&\n Object.values(\n mapExactToObject<RORec<K, 1>, IdHKT, ConstHKT<Query<V> | null>>(projection, (_, k) =>\n (needs[k] ?? k.startsWith('_')) ? root<V>().of(k).has($exists(true)) : null,\n ),\n )\n const hardMatch = removeNotYetSynchronizedFields\n ? $and(pre, ...removeNotYetSynchronizedFields)\n : pre\n\n const job = {}\n const db = collection.s.db,\n coll = collection.collectionName\n const last = db.collection<Last>('__last')\n type D_ID = 'deletedAt' | '_id'\n // TODO create indexes (if snapshot is in sources)\n type WithDel = D_ID | Exclude<K, D_ID>\n const projectInput =\n projection &&\n $project_<V, WithDel>(\n spread<RORec<K, 1>, RORec<D_ID, 1>, IdHKT>(projection, {\n deletedAt: ['deletedAt', 1],\n _id: ['_id', 1],\n }),\n )\n const notDeleted = root<D>().of('deletedAt').has($eq<Timestamp | N>(null))\n\n const stages = (lastTS: { _id: string; ts: Timestamp } | null) => {\n const hardQuery: Query<V> | undefined = $and(\n lastTS && root<Model>().of('touchedAt').has($gteTs(previous(lastTS.ts))),\n hardMatch,\n notDeleted,\n match && $expr(match),\n )\n const ln = link<V | Del>().with($match_(hardQuery) as RawStages<unknown, V | Del, V>)\n return (projectInput ? ln.with(projectInput) : ln).with<unknown, Result>(input)\n }\n\n const run = <Result2>(\n finalInput: StreamRunnerParam<Result, Result2>,\n ): Runner<readonly Result2[], HasJob> => {\n type W = HasJob & { debug: string }\n type It = Iterator<readonly Result2[], W>\n type FrameD = Frame<readonly Result2[], W>\n type Next = Promise<FrameD>\n const clear = async () => {}\n const withStop = (next: () => PromiseLike<FrameD>, tr?: () => Promise<void>): It => {\n return addTeardown(() => ({ stop, next: next(), clear }), tr)\n }\n const next = (next: () => Next, debug: string, tr?: () => Promise<void>): FrameD => ({\n cont: withStop(next, tr),\n data: [],\n info: { job, debug },\n })\n\n const data: TsData = {\n input: input,\n finalInputFirst: finalInput.raw(true),\n finalInput: finalInput.raw(false),\n match: view.match?.raw(root()).get(),\n project: projection,\n teardown: finalInput.teardown(\n (x): Teardown => ({\n collection: x.collection.collectionName,\n method: x.method,\n params: x.params,\n }),\n ),\n }\n\n // Step 0 : declare we are starting a job\n const step0 = () => Promise.resolve(next(step1, 'get last update'))\n const stop: It = withStop(step0)\n\n // Step 1 : get last update\n const step1 = async (): Next => {\n log('creating indexes')\n await ensureCollection(db, coll)\n await db.command({\n collMod: coll,\n changeStreamPreAndPostImages: { enabled: true },\n })\n\n await createIndex(\n collection,\n { touchedAt: 1 },\n {\n partialFilterExpression: { deletedAt: { $eq: null } },\n name: 'touchedAt_' + new (driver().UUID)().toString('base64'),\n },\n )\n\n log('stream started', { streamName, data })\n const ts = await Promise.all([\n last.findOne({ _id: streamName, data }),\n last.findOne({ _id: streamName }),\n ])\n log('got last update', { streamName, ts })\n return next(step2_5(ts), 'handle teardown')\n }\n const step2_5 =\n ([same, exists]: [Last | null, Last | null]) =>\n async (): Next => {\n const handleTeardown = async <W extends Document, M extends keyof Actions<unknown>>(\n last: Last,\n ) => {\n if (!last.data) return\n const { collection: c, method: m, params: p } = last.data.teardown\n const { collection, method, params } = {\n collection: db.collection<W>(c),\n method: m as M,\n params: p as TeardownRecord<W, M>['params'],\n }\n const [action, out] = actions[method](collection, params)\n log('teardown', ...out)\n await action\n log('teardown done', ...out)\n }\n if (exists && !same) await handleTeardown(exists)\n return {\n cont: withStop(async () => {\n await new Promise(resolve => setTimeout(resolve, 1000))\n return next(step4(same), 'clone into new collection')\n }),\n data: [],\n info: { debug: 'wait for clone into new collection', job: undefined },\n }\n }\n\n type C = WatchStream<{}>\n // Step 4 : run the aggregation // idempotent\n const makeStream = (): Promise<C> => makeWatchStream(view, streamName)\n const step4 = (lastTS: { _id: string; ts: Timestamp } | null) => async (): Next => {\n const raw = stages(lastTS).with(finalInput.raw(lastTS === null)).stages\n const stream = await makeStream()\n // const currTime = await getCurrentTimestamp(db)\n const nextRes = stream.tryNext()\n const aggResult = await aggregate<Result2>(db, streamName, c =>\n c<V | Del, V | Del>({\n coll: collection,\n input: raw,\n }),\n )\n\n return next(\n step7({ aggResult, ts: aggResult.cursor.atClusterTime, stream, nextRes }),\n 'update __last',\n () => stream.close(),\n )\n }\n\n type L = {\n aggResult: AggregateCommand<Result2>\n ts: Timestamp\n stream: C\n nextRes: Promise<{} | null>\n }\n\n // Step 7 : update __last\n const step7 = (l: L) => async (): Next => {\n await last.updateOne({ _id: streamName }, { $set: { ts: l.ts, data } }, { upsert: true })\n return step8(l)\n }\n // Step 8 : wait for change\n const step8 = (l: L): FrameD => {\n return {\n data: l.aggResult.cursor.firstBatch,\n info: { job: undefined, debug: 'wait for change' },\n cont: withStop(() =>\n l.nextRes.then(doc =>\n doc\n ? next(step4({ _id: streamName, ts: l.ts }), 'restart')\n : step8({ ...l, nextRes: l.stream.tryNext() }),\n ),\n ),\n }\n }\n return stop\n }\n return {\n out: run,\n }\n}\ninterface StreamRunnerHKT extends HKT<O2> {\n readonly out: SimpleStreamExecutionResult<I<O2, this>[0], I<O2, this>[1]>\n}\ninterface StagesHKT extends HKT<O3> {\n readonly out: RORec<'lin', RawStages<I<O3, this>[0], I<O3, this>[1], I<O3, this>[2], unknown, 1>>\n}\n\nconst emptyLin = <V>() => ({ lin: link<V, unknown, 1>().stages })\nexport const from = <V extends Model, KK extends StrKey<V>>(\n view: View<V, Allowed<KK>>,\n streamName: string,\n needs: Partial<Record<KK, 0 | 1>> = {},\n) =>\n pipe<AllowedPick<V, KK>, AllowedPick<V, KK>, AllowedPick<V, KK>, StreamRunnerHKT, StagesHKT>(\n input => executes(view, input.lin, streamName, needs),\n { lin: link<AllowedPick<V, KK>, unknown, 1>().stages },\n ({ lin: a }, { lin: b }) => ({ lin: concatStages(a, b) }),\n emptyLin,\n )\n","import type { O, O2, StrKey, View } from '../../types'\nimport type { HKT, I, IdHKT } from '../../types/hkt'\nimport { concatDelta, emptyDelta, link, pipe, type DeltaPipe } from '../aggregate/prefix'\nimport { root } from '../field'\nimport type { Del, DeltaStages, Model, RawStages, Stages } from '../types/stream'\nimport type { DeltaHKT } from './boot'\nimport type { Allowed, AllowedPick } from './boot-utils'\nimport { getFirstStages } from './first-stages'\n\nexport type SingleResult<out Result> = <Result2>(\n finalInput: RawStages<unknown, Result, Result2>,\n) => Stages<unknown, Result2, unknown>\n\nexport interface SnapshotStreamHKT2 extends HKT<O2> {\n readonly out: SingleResult<I<O2, this>[1]>\n}\n\nconst executes = <\n q extends O,\n V extends Model,\n KK extends StrKey<V>,\n Result extends q | AllowedPick<V, KK>,\n>(\n view: View<V, Allowed<KK>>,\n input: DeltaStages<q | AllowedPick<V, KK>, AllowedPick<V, KK>, Result>,\n needs: Partial<Record<KK, 0 | 1>>,\n): SingleResult<Result> => {\n type T = AllowedPick<V, KK>\n const { firstStages } = getFirstStages(view, needs)\n const { collection } = view\n return <Result2>(\n finalInput: RawStages<unknown, Result, Result2>,\n ): Stages<unknown, Result2, unknown> => {\n const start: RawStages<O, T, Result> = input.raw<IdHKT<O>>(root)\n const stages = firstStages(null, true).with(start).with(finalInput).stages\n return c =>\n c<Del | V, Del | V>({\n coll: collection,\n input: link<V | Del>().stages,\n exec: stages,\n })\n }\n}\n\nexport const single = <V extends Model, KK extends StrKey<V>>(\n view: View<V, Allowed<KK>>,\n needs: Partial<Record<KK, 0 | 1>> = {},\n): DeltaPipe<AllowedPick<V, KK>, AllowedPick<V, KK>, SnapshotStreamHKT2, DeltaHKT> =>\n pipe<AllowedPick<V, KK>, AllowedPick<V, KK>, AllowedPick<V, KK>, SnapshotStreamHKT2, DeltaHKT>(\n input => executes(view, input, needs),\n emptyDelta(),\n concatDelta,\n emptyDelta,\n )\n"]}